在什么时候双打开始失去精确度?

Tho*_*ini 1 c++ floating-point ieee-754

我的应用程序需要在某些数字上执行一些操作:>,<,==,!=,+, - ,++等(但没有除法).这些数字有时是整数,更少有浮点数.

如果我在内部使用"双"类型(由IEEE 754定义),即使对于整数,直到我可以安全地使用它们就好像它们是ints一样,而不会出现奇怪的舍入错误(例如,n == 5 && n == 6都是真的,因为它们是相同的数字)?

显然,各种操作的第二个输入(+, - 等)总是一个整数,我知道用0.000 [..] 01我会从一开始就遇到麻烦.

作为奖励答案,同样的问题,但为float.

Mar*_*som 8

比特在数量IEEE-754双尾数为52,有一个额外的隐含位,始终是1.这意味着可以包含恰好是2 ^ 53,或9007199254740992最大值.

浮点尾数是23位,同样带有隐含位.可以精确表示的最大整数是2 ^ 24或16777216.

如果你的意图只是保存整数值,那么通常会有一个比双精度更合适的64位整数类型.

编辑:最初我有2 ^ 53-1和2 ^ 24-1,但我意识到没有必要减去1 - 偶数可以利用尾数右边隐含的0位.

  • `9007199254740992.0 == 9007199254740993.0` 计算结果为 true,并且似乎是计算结果为相同数字的第一对整数(在数学意义上)。 (2认同)