深入浮点数

Posted

tags:

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

起点

浮点数的二进制表示

8.25 = 1000.01(bin)

anan-1...a2a1a0.b1b2...bm-1bm(bin) =

an2n+an-12n-1+...+a222+a121+a020+b12-1+b22-2+...+bm-12-m+1+bm2-m

浮点数的存储方式

浮点数分为符号位,指数和尾数三个部分存储。

C/C++中float和double分别采用R32.24和R64.53存储(如图)

技术分享

换言之,浮点数是用以2为底的科学计数法表示的。

浮点科学计数法

以8.25 = 1000.01(bin)为例:将小数点左移至次高位,得到8.25 = 1.00001(bin) << 3 = 1.00001(bin) * 2^3 = 1.00001(bin) *2^11(bin)

PS. 0.25 = 0.01(bin) = 1.0(bin) << (-2) = 1.0(bin) * 2^(-2)

于是得到底数部分1.00001(bin)和指数部分11(bin)。

注意到

1)除0以外的任何浮点数底数最高位都为1,故可省去不写

2)指数总是signed int类型,为了适用2‘s Complement表示法(负数取反+1),对于float,我们将指数位加上(1 << 8) – 1 = 127来存储。这样数据的精确度就在(2^(-127), 2^127)之间。

于是 11(bin) + 127 = 10000010(bin)

技术分享

技术分享

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

JavaScript 深入学习及常用工具方法整理 ---- 01.浮点数

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

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

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

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

什么是浮点数格式?