Algorithm 通过底流收敛到零

Algorithm 通过底流收敛到零,algorithm,hardware,floating-point,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,第460页。 我很可能误解了如何实现收敛,如果是,请

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

我一直在使用数值公式中的某些算法,该算法通过底流收敛到零:

// all types are the same floating type
sum = 0
for (i in 0,N)
   sum += abs(V[i]);
我的问题是,这是怎么发生的?小的正浮点数之和如何收敛到下溢/零

是否存在
0+f=0,f>0
的条件

所讨论的算法是Jacoby,第460页。 我很可能误解了如何实现收敛,如果是,请纠正我


谢谢

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

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

当然,在最初的问题中,没有什么能阻止
sum
从一开始就是负的。在这种情况下,答案将是微不足道的


在IEEE754算术中,没有任何数字
f
使得
0+f=0
同时
f>0
V
是一个
双倍
的数组,
是一个
浮点数
(或
single
),您当然可以有>0的值,但如果它们小于
浮点中可表示的最小非零非规范化值,则当添加到sum时会产生0

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


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

您使用的类型是什么?如果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";
double d1=std::numeric_limits::min();
双d2=std::numeric_limits::min();
浮点数f=d1+d2;

如果(f==0.0)std::cout,最好告诉我们您使用的编译器的类型。@插入它并不重要,只要“下溢”设置为零。类型是任何IEEE浮点、32位或64位HM,那么一些专家应该在这里提供帮助,我不能认为这对每种语言都是一样的。他在问为什么当浮点
a
b
都是正数时
a+b==0
。假设
sum
已经包含
FLT\u MIN
并向其添加任意小的值,正确四舍五入的结果如何会小于
总和
?我这样问是因为
sum
总是比
0
更接近准确的结果@Roland,他没有说sum初始化为什么,但我假设它是0。double可以比FLT_MIN小,收敛到零和按位为0是两件不同的事情。是的,总和应该是单调递增的。这里,第460页。所有类型都与您相同,因此会员速度很快。像我这样的新手在我们无法击败任何人的情况下如何获得声誉@cape1232,我们都是这样开始的。你应该看到LITB对神秘的C++问题有多快的反应。或者乔恩·斯凯特。@MSN litb确实很有帮助。他为我回答了很多问题,非常感谢他谢谢你们,我在问题中添加了更多信息,包括源代码链接