代码之家  ›  专栏  ›  技术社区  ›  Anycorn

通过下溢收敛到零

  •  3
  • Anycorn  · 技术社区  · 16 年前

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

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

    // 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 回复  |  直到 16 年前
        1
  •  2
  •   MSN    16 年前

    如果 V 是一个数组 doubles 和 sum 是一个 float (或) single ,您当然可以具有大于等于0的值,但如果添加到sum中,这些值小于可在 浮动 .

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

    编辑:在阅读了实际应用程序之后,下溢到零的注释可能是指围绕不同轴的重复旋转,以确定矩阵的特征值和特征向量。在这种情况下,只有当可以假设非常小的数的重复乘法将钳位或下溢为零时,该算法才能工作。然而,实际的总和本身不会下溢。

        2
  •  1
  •   cape1232    16 年前

    您使用的类型是什么?如果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";
    

    这就产生了“是”。

        3
  •  0
  •   Roland Illig    16 年前

    如果可以使用IEEE754算法,我会非常惊讶。重点是IEEE754声明中间结果是无限精确的,然后四舍五入到目标数据类型。

    如果你有 sum + V[i] ,该值将始终大于或等于 sum . 四舍五入到下一个可代表的数字将产生 总和 或大于 总和 .

    当然,在最初的问题中没有什么可以阻止 总和 从一开始就是消极的。在这种情况下,答案是微不足道的。

    在IEEE754算法中,没有数字 f 这样 0 + f = 0 同时 f > 0 .