我正在尝试确定各种浮点类型的范围。当我阅读这段代码时:
#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/