我指望着Double
(符合IEEE的64位浮点数)来跟踪一些非常大的数字。问题是我需要保持整数的单位分辨率(一个位)。
问题是我知道,随着IEEE float值的增加,它们的精度也会降低。我确信在某个时候,我们会得到这样的东西:
...
xxxxxxxxxxxxxxxxx04
xxxxxxxxxxxxxxxxx05
xxxxxxxxxxxxxxxxx06
xxxxxxxxxxxxxxxxx08
xxxxxxxxxxxxxxxxx10
...
其中一些整数根本无法表示。我想知道这一点在哪里,以便我可以防范,警告用户或制定公司政策。
请注意,我使用浮点数是有充分理由的;小数部分对应用程序也很重要,但远不如整数部分重要。
答案 0 :(得分:3)
IEEE-754基本的64位二进制浮点格式使用53位有效数字。它编码的每个有限数的形式为 s • F •2 e ,其中 s (用于符号)为+1或-1, F (用于分数)是53位二进制数字 b 。 bbb … bbb (请注意第一位后的“。”),而 e 是从−1022到+1023的指数。 (通常,通过将位移位以将前1个位移动到开头的 b 位置并调整指数以进行补偿来对浮点数进行标准化。有关可表示值的讨论,我们可以忽略这一点;只要指数在范围之内,就可以用前导0表示的所有数字也都可以用前导1表示。)
这告诉我们回答问题所需的一切。从0到2 53 −1的每个整数都可以+1• b 。 bbb … bbb 的形式表示•2 52 用于表示 b 。 bbb … bbb 的值的某种组合。 2 53 可表示为+1•1.000…000•2 53 。但是2 53 +1无法表示,因为它需要格式为1.000…0001的 F ,其中需要54位(2 53 < / sup>,最后一个为2 0 )。
之后,2 53 +2是可表示的,因为跨越其最高和最低1位仅需要53位(从2 53 到2 1 < / sup>)。因此,在这个数量级上,偶数整数可以表示,而奇数整数不能表示。
因此,从连续可表示整数到不可表示整数的过渡看起来像:
答案 1 :(得分:0)
根据Wikipedia:
任何绝对值小于2 24 的整数都可以用单精度格式精确表示,任何绝对值小于2 53 的整数都可以可以用双精度格式精确表示。此外,可以表示该数字2倍的幂次。这些属性有时用于纯整数数据,以便在具有双精度浮点数但只有32位整数的平台上获得53位整数。
强调我的
也就是说,IEEE 64位的最高值整数精度数字为 9,007,199,254,740,992 ,其次高数字为9,007,199,254,740,994。以您问题的格式:
9007199254740990
9007199254740991
9007199254740992
9007199254740992
9007199254740994
9007199254740996
9007199254740996
请注意,某些浮点到字符串算法将像这样打印:
9007199254740990.0
9007199254740991.0
9007199254740992.0
9007199254740992.0
9.007199254740994e+15
9.007199254740996e+15
9.007199254740996e+15