一个double(给定数量的字节,具有合理的尾数/指数平衡)是否总能完全精确地保持无符号整数的范围是该字节数的一半?
例如。一个8字节的双精度数字可以完全精确地保存四字节无符号整数的范围吗?
这将归结为如果两个字节的浮点数可以保持一个字节无符号整数的范围。
一个字节的无符号int当然是0 - > 255。
IEEE754 64位双精度可以表示任何32位整数,因为它有53个奇数(a)位可用于精度,32位整数只需要,32 ,-:)
对于(非IEEE754双精度)64位浮点数,精度小于32位是合理的。这将允许真正庞大的数字(由于指数),但代价是精确度。
最重要的是,如果浮点数的尾数中的精度位数多于整数中的精度位数(并且指数中的足够位用于缩放它),则可以在不损失精度的情况下表示它。
(a)从技术上讲,第53位精度是序列开始时隐含的1
,因此“可变性”的数量可能只有52位。无论是52还是53,它仍然足以表示每个32位整数。
是。保证float(或double)精确表示不需要截断的任何整数。对于double,有53位的精度,所以这足以精确地表示任何32位整数,并且在64位的整数中也是微小的(统计上说的)比例。
确切地说,你可以准确表示的范围取决于你的实现中的很多因素,但你可以通过说,如果指数字段设置为0,你可以精确地表示最大宽度的整数。你的尾数字段(假设一个符号位)。对于IEEE 754双精度,这意味着您可以准确地表示52位数字。通常,您的尾数将超过整个结构宽度的一半。
有关双精度如何工作的更多详细信息,您可能需要查看此博客文章:Anatomy of a floating point number。
在谈论浮点数时,我不会使用“完全精确”这几个字。但是,是的,double
可以代表一个32位整数。
我不知道浮点数和整数的其他组合也是如此。
实际上,您不希望在您的机器支持的上方使用浮点,因此只需切换到使用bignums的合理算术。这样,你就可以保证精确度。