首页 > 代码库 > 深入浮点数

深入浮点数

起点

浮点数的二进制表示

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)

技术分享

技术分享

深入浮点数