Java - 带有浮点数的无限while循环[重复]

Posted

技术标签:

【中文标题】Java - 带有浮点数的无限while循环[重复]【英文标题】:Java - infinite while loop with float [duplicate] 【发布时间】:2017-05-15 20:15:47 【问题描述】:

我目前正在学习 java 浮点数。我知道,浮点数具有特定数量的重要数字。我也知道,浮点数在 java 中表示为 -1 或 1 * num * 10^x。其中 num 是数字,10^x 是小数点“点”。但是这里我们没有数字的一小部分。这里怎么可能出现无限循环?

无限循环的代码:

float f = 123456789;
while (f-- > 0) 
System.out.println(f);

【问题讨论】:

你确定循环是无限的吗? f 变为 0 后会发生什么? f 保持不变并且没有递减。这是一个无限循环。这是去年大学的一道考试题(示例考试)。 f 不够精确,无法表示这个数字 (f--) 是解决方案,但为什么呢? 查看***.com/questions/31903174/… 【参考方案1】:

这是关于浮点运算的。当您递减数字时,您偶然发现f = 1.23456792E8 的情况会使一切出错,因为f-1f 在这里具有相同的浮点表示。所以递减使数字成为它自己,这导致了无限循环。只需检查:

System.out.println(1.23456792E8f);
System.out.println(1.23456792E8f - 1);

这个数字有什么特别之处,为什么执行会停在那里?这是因为123456789 的浮点表示是1.23456792E8。由于浮点数缺乏精度,这已经给我们带来了至少3 的差距。使用double 而不是float 可以完成程序,但如果数字越大,问题就会出现。

【讨论】:

毁灭一切是什么意思? 算法——谢谢,我会改的 为什么不是 0.23456792E8? 如果你的意思是 1.23456789E8 - 据我所知,这个数字没有浮点表示,所以它必须是最接近它的。我会把这个添加到答案中。 啊谢谢。但是 f-- 会减少一些东西,但不会在相关区域?

以上是关于Java - 带有浮点数的无限while循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python中的无限While循环

什么叫“写一个循环(for或者while)读入五个浮点数?”

Java之浮点数运算

浮点数 复数

带有浮点数的 Mod 给出错误的结果 [重复]

您如何专门获得一个浮点数为 2 位小数的输入作为 C++ 中 while 循环的条件?