浮点计算

时间:2012-02-20 16:10:27

标签: numbers floating-point

道歉的标题。我的问题是这样:给定一个带有小于1的双精度w的向量,带有正数条目的双精度v的第二个向量,其总和小于一(用下面的递归计算),以及double u为正且小于1,使用递归

扩展v
w(i) = RandomNumber(); //A random number from (0,1) - not necessarily uniform
v(i) = v(i-1)*w(i)*(1-w(i-1))/w(i-1);

直到sum(v)>1-u。问题是u可能很小,并且由于v(i)(随机)减少,它们也会变小。我们也可能会w(i)接近一个。

实施此方法最安全的方法是什么?要点准确:)

2 个答案:

答案 0 :(得分:0)

对没有太多错误的浮点数进行求和的一种常用方法是将它们从最小值加到最大值。由于v(i)的计算仅取决于v(i-1),因此您可以将过去的数字保存在已排序的树中,每个节点都保留递归总和,并在单独的变量中保留前一个值。当您插入新值或重新排列某个节点时,您需要从这些点重新计算树上的总和。每个节点的求和可以是直接加法,也可以保留更多比特,例如Kahan求和。

答案 1 :(得分:-1)

也许不是累积v(i)并将其与1-u进行比较,而是从1-u开始,减少每个v(i)直到得到负数?越接近0,准确度越高。

相关问题