深入理解计算机浮点数存储

Posted xxzblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解计算机浮点数存储相关的知识,希望对你有一定的参考价值。

根据IEEE 754 浮点标准

V = (-1)^s * M * 2^E

s: 符号 s决定这数是负数(s=1)还是正数(s=0)
M: 尾数 M是一个二进制小数
E: 阶码 E的作用是对浮点数加权,这个权重是2的E次幂
单精度表示
+---------+----------------+------------------------+
|   s     |        E       |           M            |
+---------+----------------+------------------------+
    1             8                   23

双精度
+---------+----------------+------------------------+
|   s     |        E       |           M            |
+---------+----------------+------------------------+
    1             11                  52

根据十进制数计算二进制

4.25 单精度二进制如何表示
表示方法: 整数部分二进制.小数部分二进制
整数部分二进制如何计算:
整数部分除以2取模得到二进制数,得到的整数部分继续除以2取模,直到除以2等于0结束,取模所得整数位继续向左添加。
12
=> 12 / 2 = 6, 12 % 2 = 0
=> 6 / 2 = 3, 6 % 2 = 0
=> 3 / 2 = 1, 3 % 2 = 1
=> 1 / 2 = 0, 1 % 2 = 1
=> 1100

小数部分二进制如何计算:
将十进制的小数部分乘2,将所得结果的整数位作为二进制的位。舍弃乘2所得结果的整数部分,如果剩余部分为0,计算结束。否则继续乘2,进行取整操作(所得整数位继续向右添加)
0.25
=> 0.25 * 2 = 0.5
=> 0.5 * 2 = 1.0
=> 0.01

=> 0100.01
=> 1.0001 * 2^2
=> s = 0, E = 2 + 127, M=000100000000000000000000 (隐藏了整数部分1.)
=> E = 129 => 10000001
完整表示:
0 10000001 000100000000000000000000

根据二进制计算十进制数

0 10000001 000100000000000000000000

10000001
=> 1 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0
=> 128 + 0 + 0 + 0 + 0 + 0 + 0 + 1
=> 129

000100000000000000000000
=> 0 * 2^-1 + 0 * 2^-2 + 0 * 2^-3 + 1 * 2^-4
=>  0.0625

=> -1^0 * (1 + 0.0625) * 2^(129 - 127)
=> 1 * 1.0625 * 4
=> 4.25

以上是关于深入理解计算机浮点数存储的主要内容,如果未能解决你的问题,请参考以下文章

深入理解计算机浮点数存储

深入理解计算机系统(2.7)---二进制浮点数,IEEE标准(重要)

浮点数的存储

由IEEE 754深入理解浮点数

学习《深入理解计算机系统(第三版)》第二章总结

从0.2+0.4不等于0.6说浮点数