我的应用程序需要执行一些操作:>
, <
, ==
, !=
, +
, -
, ++
等(但没有除法)在某些数字上。这些数字有时是整数,很少是 float 。
如果我在内部使用“double”类型(由 IEEE 754 定义),即使是整数,直到什么时候我才能安全地使用它们,就好像它们是 int
s,不会出现奇怪的舍入错误(例如,n == 5 && n == 6
都是真的,因为它们舍入到相同的数字)?
显然,各种操作的第二个输入( +
、 -
等)始终是一个整数,我知道 0.000[..]01
从一开始我就会遇到麻烦。
作为奖励答案,同样的问题,但针对 float
.
最佳答案
IEEE-754 中的位数双尾数为 52,还有一个额外的隐含位,它始终为 1。这意味着可以包含的最大值恰好是 2^53,即 9007199254740992。
浮点尾数是 23 位,同样带有隐含位。可以精确表示的最大整数是 2^24,即 16777216。
如果您只想保存整数值,通常有一个 64 位整数类型比 double 类型更合适。
编辑:最初我有 2^53-1 和 2^24-1,但我意识到没有必要减去 1 - 偶数可以利用尾数右侧隐含的 0 位。
关于c++ - double 在什么时候开始失去精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264138/