在K&R 2-1中解释此代码

mr_*_*udo 13 c floating-point range

我正在尝试确定各种浮点类型的范围.当我读到这段代码时:

#include <stdio.h>

main()
{
    float fl, fltest, last;
    double dbl, dbltest, dblast;

    fl = 0.0;
    fltest = 0.0;
    while (fl == 0.0) {
        last = fltest;
        fltest = fltest + 1111e28;
        fl = (fl + fltest) - fltest;
    }
    printf("Maximum range of float variable: %e\n", last);

    dbl = 0.0;
    dbltest = 0.0;
    while (dbl == 0.0) {
        dblast = dbltest;
        dbltest = dbltest + 1111e297;
        dbl = (dbl + dbltest) - dbltest;
    }
    printf("Maximum range of double variable: %e\n", dblast);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么笔者添加1111e28fltest变量?

eca*_*mur 7

fltest到达时+Inf,循环终止,就像在那一点fl = (fl + fltest) - fltest变为NaN,这是不相等的0.0. last包含一个值,当添加到1111e28生成时+Inf,因此接近上限float.

1111e28选择达到+Inf合理的速度; 它还需要足够大,以便当添加到大值时,循环继续进行,即它至少与最大和第二大非无限float值之间的间隙一样大.

  • @haccks`inf-inf`导致NaN(在`fl =(fl + fltest) - fltest;`) (3认同)