Numbers 浮点计算

Numbers 浮点计算,numbers,floating-point,Numbers,Floating Point,为一个模棱两可的标题道歉。我的问题是:给定一个double w向量,其条目小于1,第二个double v向量,其正条目之和小于1,使用下面的递归计算,以及一个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); 直到sumv>1-u。问题是u可能非常小,而且由于vi随机减

为一个模棱两可的标题道歉。我的问题是:给定一个double w向量,其条目小于1,第二个double v向量,其正条目之和小于1,使用下面的递归计算,以及一个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);
直到sumv>1-u。问题是u可能非常小,而且由于vi随机减少,它们也可能变得很小。我们可能也会接近一个


最安全的方法是什么?精度点:

对浮点数求和而不产生太多错误的一种常见方法是从最小值到最大值求和。由于vi的计算只依赖于vi-1,因此可以将过去的数字保存在排序树中,递归和保存在每个节点上,前一个值保存在单独的变量中。插入新值或重新排列某个节点时,需要重新计算从这些点到树的总和。每个节点上的求和可以是直接加法,或者像Kahan求和那样保留更多的位。

对浮点数求和而不产生太多错误的一种常见方法是从最小值到最大值求和。由于vi的计算只依赖于vi-1,因此可以将过去的数字保存在排序树中,递归和保存在每个节点上,前一个值保存在单独的变量中。插入新值或重新排列某个节点时,需要重新计算从这些点到树的总和。每个节点上的求和可以是直接加法,或者像Kahan求和那样保留更多的位。

也许不是累加vi并将其与1-u进行比较,而是从1-u开始,然后减少每个vi直到得到一个负数?越接近0,精确度越高。

也许不必累加vi并将其与1-u进行比较,而是从1-u开始,然后减少每个vi,直到得到一个负数?精度越接近0越好。

是的,也许这会给出一个小u的OK近似值,这就是您所说的精度更好->0?。我得再考虑一下。两个连续的浮点值之间的距离,或者是浮点值,或者是双精度浮点值,取决于这些值。离0越近-由于内部表示,此距离越小。请参阅一些可能有用的博客文章列表。第一次误读了你,以为你暗示最终的总数是1-u,这显然不太正确,但我现在明白你的意思了。谢天谢地,这有可能会严重失败。如果你的v值下降得太快,那么你可以从1-u的剩余部分减去它,得到与上一步完全相同的数字。然后你可能会永远被困在跑步中。你真的需要保留一个系列的总和,并在每一步直接测试。啊,我现在明白你的意思了。谢谢我把太多的注意力放在vi正在减少这一事实上,而没有考虑到第一个vi也可能太小。是的,也许这会给小u提供一个好的近似值,就是你所说的精度更好->0?。我得再考虑一下。两个连续的浮点值之间的距离,或者是浮点值,或者是双精度浮点值,取决于这些值。离0越近-由于内部表示,此距离越小。请参阅一些可能有用的博客文章列表。第一次误读了你,以为你暗示最终的总数是1-u,这显然不太正确,但我现在明白你的意思了。谢天谢地,这有可能会严重失败。如果你的v值下降得太快,那么你可以从1-u的剩余部分减去它,得到与上一步完全相同的数字。然后你可能会永远被困在跑步中。你真的需要保留一个系列的总和,并在每一步直接测试。啊,我现在明白你的意思了。谢谢我把太多的注意力放在vi正在减少这一事实上,而没有考虑到第一个vi也可能太小。