深入浮点数
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.浮点数