站内收录

IEEE754 浮点数详解 - 深入 JavaScript 的

2017-01-05  本文已影响166人  零小白

今天聊一点计算机的基础——浮点数,具体我们探讨 IEEE754 格式的浮点数,大多数语言都采用该格式来表示小数,通常又分为单精度和双精度浮点数。

在 JavaScript 中,不区分整形和小数,唯一表示数值的类型 Number 就是采用 IEEE754 格式中的双精度浮点数来表示的。

因为单精度和双精度浮点数在原理上完全一致,所以本文只集中分析双精度浮点数。我会依次说一下原理、定义和一些结论。

原理

我们都知道任何一个数都可以用科学计数法,例如:

1.234 * 10 ^ 2    // => 123.4

其中,^ 代表指数,下同。

同理,我们也可以不局限与 10 进制,采用任意进制 R,指数用 e 表示,m 表示基数,正负数用 (-1) ^ S 表示,其中 S 为 0 或 1,结果用 N 表示,于是:

N = (-1) ^ S * m * R ^ e

这就是我们的原理,十分简单。另外很容易得出,对了任何非 0 的数,m 都可以限定在大于等于 1 且小于 R 的范围内,即 [1, R)。当 R = 2 的时候,m 取值为 [1, 2)。可以如下表示:

m = 1 + M     (0 <= M < 1)

定义

双精度浮点数就是采用上面的原理,底数 R = 2

双精度浮点数用 8 个字节表示,也就是 64 bit。例如数值 100.25 在内存中的情况如下:

0,10000000101,100100010~0 //  ~代表了若干个 0

为了分析,我将 64 bit 分为 3 个部分。

第一部分是符号位(S),占 1 bit,代表符号,正数 0,负数1。当前例子中,符号位为 0 表示这是一个正数。

第三部分是尾数位(M),占 52 bit,代表基数的小数部分,采用二进制表示。当前例子中 100100010~0 换算成十进制的小数为 1/2 + 1/16 + 1/256 = 0.56640625

第二部分是阶码位(E),占 11 bit,代表指数部分。

讲解完毕,关于浮点数的格式推导出真实值的公式也就如下:

(-1) ^ S * (1 + M) * 2 ^ (E - 1023) = N

对应我们上面的示例:

(-1) ^ 0 * (1 + 0.56640625) * 2 ^ (1029 - 1023) = 1.56640625 * 2 ^ 6 = 100.25

是不是很简单,没看懂的童鞋还可以再看2遍。

结论

综上,我们依次阐述了双精度浮点数的原理、定义和一些结论。而单精度浮点数只有在阶码和尾数的位数有所不同,原理完全一致,自然不用赘述。

最后,依旧是如果发现什么没有阐述清楚或者有问题的地方,欢迎反馈。

上一篇 下一篇

猜你喜欢

热点阅读