c - 在 K&R 2-1 中解释这段代码

标签 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;
}

我不明白为什么作者在 fltest 变量中添加了 1111e28

最佳答案

循环在 fltest 时终止。达到 +Inf , 截至那时 fl = (fl + fltest) - fltest变成 NaN ,不等于 0.0 . last包含一个值,当添加到 1111e28 时生产 +Inf所以接近float的上限.

1111e28被选择到达+Inf相当快;它还需要足够大,以便在添加到大值时循环继续进行,即它至少与最大和第二大非无限 float 之间的差距一样大。值(value)观。

关于c - 在 K&R 2-1 中解释这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24144274/

相关文章:

python - 收到 "index out of range "错误

c - 二叉搜索树节点删除错误

c - 使用回调函数指针传递变量

c - c 中的方形图案

.NET - 浮点比较

math - float 学有问题吗?

python - 范围作为Python中的字典键

C: fgets 总是 NULL

c++ - 如何在 C++ 中跟踪 NaN

mysql - SQL 查询没有结果