规范化概率计算的双值

时间:2011-12-15 02:12:31

标签: c# floating-point normalizing

我想规范化粒子列表中的权重。这些权重属于粒子对象。我尝试通过将它们除以权重之和来对它们进行标准化。所有重量均以双打声明。当程序开始在列表的开头划分时,值是正确的,但是在第二次或第三次除法后不久,我得到错误的结果..这导致操作后权重之和不是1,这就是它应该。任何人都可以帮我解决这个问题吗?也许与线程有关?先谢谢..

// normalizing weights
double weightsum = 0;
double check = 0;
List<ParticleRobot> temporalparticleSet = new List<ParticleRobot>();

for (int i = 0; i < particleSet.Count; i++)
{
    weightsum = weightsum + this.particleSet[i].Weight;
}

Program.Weightsum = weightsum;

Console.WriteLine("Sum of unnormalized particleweights is " + weightsum);

foreach (ParticleRobot p in this.particleSet)
{
    Program.Weight = p.Weight;
    p.Weight = Program.Weight / Program.Weightsum;
    Console.WriteLine("Updated Particleweight is now : " + p.Weight);
}

// checking that they sum up to 1
for (int i = 0; i < particleSet.Count; i++)
{
    check = check + this.particleSet[i].Weight;
}

Console.WriteLine("Check: Sum of particles-weights is = " + check);

4 个答案:

答案 0 :(得分:0)

可能不是线程问题。在任何数值分析书中阅读浮点数学。查看http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html。舍入错误,精度问题,取消问题都可能有所贡献。

答案 1 :(得分:0)

首先,什么是temporalparticleSet?你真的想要循环而不是this.particleSet吗?除此之外,我根本没有看到代码的任何问题。我会修改:

Program.Weight = p.Weight;
p.Weight = Program.Weight / Program.Weightsum;

p.Weight = p.Weight / Program.Weight;

也是p.Weight一双?可能是一些舍入问题。您是否尝试过使用断点并单步执行它?

答案 2 :(得分:0)

我担心Program.Weight会修改它所分配的值或不是相同的数据类型。

我会尝试更改以下行:

        Program.Weight = p.Weight;
        p.Weight = Program.Weight / Program.Weightsum;

        p.Weight = p.Weight / Program.Weightsum;

还需要考虑舍入错误。

答案 3 :(得分:0)

大量数字的累积可能会失去精确度。以下是两种可以提供帮助的技术:

  1. 以重量递增的顺序对权重求和,从 最轻,最重。如果数字可以是负数,则按照数量级增加的顺序求和。
  2. 使用Kahan summation algorithm累加权重。这比(1)更容易,因为不必先对数组进行排序。
  3. 如果总和与最小重量的比例很大,则使用上述两种,如10 ^ 16。