IEEE 754 双精度浮点数的内部表示
在 Javascript、Python 等语言中,使用 IEEE754 标准作为其浮点数规范。因此存在一个耳熟能详的问题,这道题也作为八股文,是面试中的常客。
0.1 + 0.2 == 0.30000000000000004
甚至,在 Javascript 中,仅有 number
一个类型,无整数与浮点数之分,其整数也由双精度浮点数来存储。由此也带来整数的精度问题,如最大安全整数。
> Number.MAX_SAFE_INTEGER9007199254740991> Number.MAX_SAFE_INTEGER + 19007199254740992> Number.MAX_SAFE_INTEGER + 29007199254740992> Number.MAX_SAFE_INTEGER + 39007199254740994> Number.MAX_SAFE_INTEGER + 49007199254740996
IEEE754 内部表示
- 双精度浮点数由三个部分组成,符号位(1)、指数位(11)与尾数位(52),总共 64 位。
- 双精度浮点数在其内部表示为二进制的科学记数法,如 1536 内部表示为
1.1 * 10 ** 1010
,翻译为十进制是1.5 * 2 ** 10
。其中.1
为尾数位,1010
为指数位。 - 指数位在存储时,需要加 Exponent Bias,即偏移量,为
1023
,二进制表示为1111111111
。