http://www.gotw.ca/gotw/067.htm中有一个例子
int main()
{
double x = 1e8;
//float x = 1e8;
while( x > 0 )
{
--x;
}
}
当您将双精度更改为浮点时,它在 VS2008 中是一个无限循环。根据Gotw的解释:
如果 float 不能准确表示从 0 到 1e8 的所有整数值怎么办?然后修改后的程序将开始倒计时,但最终会达到一个无法表示且 N-1 == N 的值 N(由于浮点精度不足)......然后循环将卡住直到运行程序的机器没电为止。
据我了解,IEEE754 浮点数是单精度(32 位),浮点数的范围应该是 +/- 3.4e +/- 38,它应该有 7 位有效。
但我仍然不明白这是怎么发生的:“最终达到一个无法表示的值 N 并且 N-1 == N (由于浮点精度不足)。” 有人可以尝试解释这一点吗?
一些额外的信息:当我使用 double x = 1e8 时,它在大约 1 秒内完成,当我将其更改为 float x = 1e8 时,它运行的时间要长得多(5 分钟后仍然运行),如果我将其更改为float x = 1e7;
,它在大约 1 秒内完成。
我的测试环境是VS2008。
顺便说一句,我不是在问基本的 IEEE 754 格式解释,因为我已经理解了。
谢谢