【发布时间】:2010-02-08 20:19:00
【问题描述】:
以下 C# (.Net 3.5 SP1) 中的代码在我的机器上是一个无限循环:
for (float i = 0; i < float.MaxValue; i++) ;
它达到了 16777216.0 和 16777216.0 + 1 的计算结果为 16777216.0。然而此时:i + 1 != i.
这有点疯狂。
我意识到浮点数的存储方式有些不准确。而且我读过大于 2^24 的整数不能正确存储为浮点数。
仍然是上面的代码,即使数字不能正确表示,在 C# 中也应该是有效的。
为什么它不起作用?
你可以在 double 中得到同样的结果,但这需要很长时间。 9007199254740992.0 是 double 的限制。
【问题讨论】:
-
你为什么首先使用浮点类型作为索引?
-
我同意这不是好的代码,但它不应该是正确的代码吗?从技术上讲,任何数字加一都应该大于自身,除非有溢出。
-
不一定。你会注意到
16777216.0是最接近16777217.0的单精度浮点数 -
每位计算机科学家都应该了解的浮点运算知识:docs.sun.com/source/806-3568/ncg_goldberg.html.
标签: c# .net loops floating-point double