c++ 为什么double可以存储比unsigned long long更大的数字?

问题是,我不太清楚为什么double可以存储比unsigned long long更大的数字.由于它们都是8字节长,所以64位.

在无符号长long中,所有64位用于存储值,另一方面double表示1表示,11表示指数,52表示尾数.即使用于尾数的52位将用于存储没有浮点的十进制数,它仍然有63位……

但LLONG_MAX明显小于DBL_MAX ……

为什么?

最佳答案
原因是unsigned long long将存储精确整数,而double存储尾数(具有有限的52位精度)和指数.

这允许双倍存储非常大的数字(大约10308)但不完全.在double中有大约15个(几乎16个)有效十进制数字,308个可能的小数的其余部分是零(实际上是未定义的,但为了更好地理解,你可以假设为“零”).
无符号长long只有19位数,但它们中的每一位都是精确定义的.

编辑:
在回复下面的注释“这是如何工作”时,符号为1位,指数为11位,尾数为52位.尾数在开头有一个隐含的“1”位,没有存储,所以有效地你有53个尾数位. 253是9.007E15,所以你有15个,几乎16个十进制数字可以使用.
指数有一个符号位,范围从-1022到1023,用于缩放(二进制左移或右移)尾数(21023约为10307,因此是范围的限制),所以非常小和非常大的数字同样可以使用这种格式.
但是,当然,您可以表示的所有数字都只具有适合matissa的精度.

总而言之,浮点数不是非常直观,因为“简单”十进制数不一定表示为浮点数.这是因为尾数是二进制的.例如,可以(并且很容易)表示任何高达几十亿的正整数,或者数字如0.5或0.25或0.0125,具有完美的精度.
另一方面,也可以表示像10250这样的数字,但仅约为.事实上,你会发现10250和10250 1是相同的数字(等待,什么???).这是因为尽管您可以轻松拥有250个数字,但您没有那么多有效数字(将“重要”视为“已知”或“已定义”).
此外,尽管0.3甚至不是“大”数字,但代表看起来像0.3这样简单的东西也是可能的.但是,你不能用二进制表示0.3,无论你附加什么二进制指数,你都不会发现任何二进制数正好导致0.3(但你可以非常接近).

一些“特殊值”保留为“无穷大”(正面和负面)以及“非数字”,因此您的理论范围略小于理论范围.

另一方面,unsigned long long不会以任何方式解释位模式.您可以表示的所有数字都只是位模式表示的确切数字.每个数字的每个数字都是精确定义的,不会发生缩放.

转载注明原文:c++ 为什么double可以存储比unsigned long long更大的数字? - 代码日志