在双打中表示整数

时间:2009-04-17 06:00:44

标签: c math floating-point precision ieee-754

一个double(给定字节数,具有合理的尾数/指数平衡)是否总能完全精确地保持无符号整数的一半,即该字节数的一半?

E.g。一个8字节的双精度数字可以完全精确地保存四字节无符号整数的范围吗?

如果两个字节的浮点数可以保存一个字节无符号整数的范围,那么这将归结为什么。

一个字节的无符号整数int当然是0 - > 255。

5 个答案:

答案 0 :(得分:38)

IEEE754 64位双精度数可以代表任何32位整数,因为它有53个奇数(a)位可用于精度,32位整数只需要,32 : - )

(非IEEE754双精度)64位浮点数具有小于32位的精度是合理的。这将允许真正庞大的数字(由于指数),但代价是精确度。

最重要的是,如果浮点数的尾数中的精度位数比整数中的位数更多(并且指数中有足够的位来缩放它),那么它可以表示而不会丢失精度。


(a)从技术上讲,第53位精度是序列开始时隐含的1所以“可变性”的数量可能只有52位。无论是52还是53,它仍然足以表示每个32位整数。

答案 1 :(得分:7)

是。保证float(或double)精确表示不需要截断的任何整数。对于double,有53位的精度,所以这足以精确地表示任何32位整数,并且在64位的整数中也很小(统计上说)。

答案 2 :(得分:2)

你可以准确表示的范围究竟取决于你实现中的很多因素,但你可以通过说,如果指数字段设置为0,你可以精确地表示最多的整数你的尾数字段的宽度(假设一个符号位)。对于IEEE 754双精度,这意味着您可以准确地表示52位数字。通常,您的尾数将超过整个结构宽度的一半。

答案 3 :(得分:-1)

有关双精灵如何运作的详细信息,您可以查看此博文:Anatomy of a floating point number

答案 4 :(得分:-4)

在谈论浮点数时,我不会使用“完全精确”这几个字。但是,double可以表示32位整数。

我不知道浮点数和整数的其他组合也是如此。

实际上,你不想在你的机器支持的上面使用浮点,所以只需用bignums切换到合理算术。这样,你就可以保证精确度。