通过下溢收敛到零

时间:2010-07-15 19:09:41

标签: algorithm hardware floating-point

请忽略这篇帖子,我误读算法,所以问题不相关。 但是,我不能再发帖了。 请投票关闭

我一直在使用数字配方中的某些算法,它通过下溢收敛到零:

// all types are the same floating type
sum = 0
for (i in 0,N)
   sum += abs(V[i]);

我的问题,它是如何发生的?小正浮点数的总和如何收敛到下溢/零?

是否存在0 + f = 0 , f > 0

的某些情况

有问题的算法是Jacoby,http://www.mpi-hd.mpg.de/astrophysik/HEA/internal/Numerical_Recipes/f11-1.pdf,第460页。 我很可能误解了如何实现收敛,如果是,请纠正我。

谢谢

3 个答案:

答案 0 :(得分:2)

如果Vdoubles的数组而sumfloat(或single),那么您当然可以拥有> 0但是当加到sum时,如果它们小于float中可表示的最小非零非规范化值,则产生0。

你怎么知道sum实际上是零,而不仅仅是真的很接近?所有位都设置为零吗?

编辑:在阅读实际应用之后,下溢到零注释可能是指围绕各个轴的重复旋转,以确定矩阵的特征值和特征向量。在这种情况下,只有当您可以假设非常小的数字的重复乘法将钳位或下溢为零时,该算法才有效。但是,实际金额本身不会下降。

答案 1 :(得分:1)

您使用的是哪种类型?如果f是浮点数而d1和d2是双精度数,那么你就得到了它。

double d1 = std::numeric_limits<double>::min();
double d2 = std::numeric_limits<double>::min();
float f = d1 + d2;
if (f == 0.0) std::cout << "yes";
else std::cout << "no";

这会产生“是”。

答案 2 :(得分:0)

如果可以使用IEEE 754算法,我会感到非常惊讶。关键是IEEE 754规定中间结果是无限精确的,然后四舍五入到目标数据类型。

因此,如果您有sum + V[i],则该值将始终大于或等于sum。向下舍入到下一个可表示的数字将生成sum或大于sum的数字。

当然,原始问题中没有任何内容可以阻止sum首先出现否定因素。在这种情况下,答案是微不足道的。

在IEEE 754算术中,没有数字f0 + f = 0同时f > 0