【发布时间】:2012-11-16 09:37:02
【问题描述】:
我一直在玩浮点数,根据我过去对它们的了解,0.1 + 0.2 最终变成0.30000000000000004 这样的事实并不让我感到惊讶.
确实让我惊讶的是,整数运算总是似乎工作得很好,并且没有任何这些伪像。
我首先在 JavaScript(node.js 中的 Chrome V8)中注意到了这一点:
0.1 + 0.2 == 0.3 // false, NOT surprising
123456789012 + 18 == 123456789030 // true
22334455667788 + 998877665544 == 23333333333332 // true
1048576 / 1024 == 1024 // true
C++(Mac OS X 上的 gcc)似乎具有相同的属性。
最终结果似乎是整数——因为没有更好的词——工作。只有当我开始使用十进制数字时,事情才会变得不稳定。
这是设计的特征、数学工件还是编译器和运行时环境进行的某些优化?
【问题讨论】:
-
尝试使用大于
2^53的数字,您会看到。 :) -
整数一直有效,直到你使它们足够大。在典型的浮点实现的尾数中有 53 位(我认为)。这对于一些大整数来说已经足够了,但是让它们足够大,你就会遇到问题。
-
22334455667788在 JavaScript 中是整数还是浮点常量? -
这个问题有很多很好的答案,都围绕着浮点尾数可以准确表示小于 2^53 的所有整数这一事实。
-
所以,对于我没有选择的所有答案,我深表歉意。只能选择一个@_@
标签: javascript c++ floating-point