为什么循环不中断(浮点数精度)

问题描述 投票:0回答:1

我一直在尽一切努力让它发挥作用。所以基本上我希望程序在点后的数字变化少于 14 位数字后停止。但显然这种情况从未发生过。

#include <stdio.h>

int main (void)
{
    double stand_n = 1.0;

    for (double stand = 1.0; stand_n - stand <= 10e-15; stand = stand_n)
    {
        stand_n = 1.0 / stand + stand / 2.0;
        printf("%.14lf\n", stand_n);
    }
}

输出:

1.50000000000000
1.41666666666667
1.41421568627451
1.41421356237469
1.41421356237309
1.41421356237309
1.41421356237309
1.41421356237309
1.41421356237309
...
c floating-point precision
1个回答
1
投票

您在执行

stand = stand_n
之前执行
stand_n - stand <= 10e-15
,因此
stand_n - stand
一次始终为零,因此循环永远不会结束。

三个错误。

  1. 上述检查时间不正确。
  2. 您想要在差异为
    >= 10e-15
    时重复,而不是在差异为
    <= 10e-15
    时重复。
  3. 您需要
    stand - stand_n
    而不是
    stand_n - stand
    ,因为数字会变小。
© www.soinside.com 2019 - 2024. All rights reserved.