Sign
Exponent (11Bit)
Fraction (52Bit)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
00000000000
0000000000000000000000000000000000000000000000000000
Binary:
1.0000000000000000000000000000000000000000000000000000×10(00000000000-1111111111)
Decimal:
1×2(0-1023)
Can be represented exactly in binary
Quick try:
0
0.1
0.2
0.3
0.5
2
8
1024
1536
Infinity
-Infinity
Number.EPSILON
Number.MAX_SAFE_INTEGER
Number.MIN_SAFE_INTEGER

IEEE 754 双精度浮点数的内部表示

在 Javascript、Python 等语言中,使用 IEEE754 标准作为其浮点数规范。因此存在一个耳熟能详的问题,这道题也作为八股文,是面试中的常客。

0.1 + 0.2 == 0.30000000000000004

甚至,在 Javascript 中,仅有 number 一个类型,无整数与浮点数之分,其整数也由双精度浮点数来存储。由此也带来整数的精度问题,如最大安全整数

> Number.MAX_SAFE_INTEGER
9007199254740991
> Number.MAX_SAFE_INTEGER + 1
9007199254740992
> Number.MAX_SAFE_INTEGER + 2
9007199254740992
> Number.MAX_SAFE_INTEGER + 3
9007199254740994
> Number.MAX_SAFE_INTEGER + 4
9007199254740996

IEEE754 内部表示

  1. 双精度浮点数由三个部分组成,符号位(1)、指数位(11)与尾数位(52),总共 64 位。
  2. 双精度浮点数在其内部表示为二进制的科学记数法,如 1536 内部表示为 1.1 * 10 ** 1010,翻译为十进制是 1.5 * 2 ** 10。其中 .1 为尾数位,1010 为指数位。
  3. 指数位在存储时,需要加 Exponent Bias,即偏移量,为 1023,二进制表示为 1111111111