【问题标题】:Java - infinite while loop with float [duplicate]Java - 带有浮点数的无限while循环[重复]
【发布时间】: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--) 是解决方案,但为什么呢?

标签: java while-loop infinite-loop


【解决方案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-- 会减少一些东西,但不会在相关区域?
猜你喜欢
  • 2016-07-26
  • 2015-11-01
  • 1970-01-01
  • 2014-03-29
  • 2016-05-06
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多