您的位置:首页 > 其它

基础野:细说浮点数

2016-01-09 11:02 246 查看
Brief                              

本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下。

本篇我们一起来探讨一下基础——浮点数的表示方式和加减乘除运算。

在深入前有两点我们要明确的:

1. 在同等位数的情况下,浮点数可表示的数值范围比整数的大;

2. 浮点数无法精确表示其数值范围内的所有数值,只能精确表示可用科学计数法m*2e表示的数值而已;

(如0.5的科学计数法是2-1,则可被精确存储;而0.2则无法被精确存储)

3. 浮点数不仅可表示有限的实数,还可以表示有限的整数。

Encode                            

20世纪80年代前每个计算机制造商都自定义自己的表示浮点数的规则,及浮点数执行运算的细节。而且不太关注运算的精确性,而是更多地关注速度和简便性。

1985年左右推出IEEE 754标准的浮点数表示和运算规则,才让浮点数的表示和运算均有可移植性。(IEEE,读作Eye-Triple-Eee,电器与电子工程师协会)

上述的IEEE 754称为IEEE 754-1985 Floating point,直到2008年对其进行改进得到我们现在使用的IEEE 754-2008 Floating point标准。

IEEE 754的二进制编码由3部分组成,分别是sign-bit(符号位),biased-exponent(基于偏移的阶码域)和significant(尾数/有效数域)。

Sign-bit:0表示正,1表示负。占1bit;

Biased-exponent:首先exponent表示该域用于表示指数,也就是数值可表示数值范围,而biased则表示它采用偏移的编码方式。那么什么是采用偏移的编码方式呢?也就是位模式中没有设立sign-bit,而是通过设置一个中间值作为0,小于该中间值则为负数,大于改中间值则为正数。IEEE 754中规定bias = 2^e-1 - 1,e为Biased-exponent所占位数;
Significant:表示有效数,也就是数值可表示的精度。(注意:Significant采用原码编码;假设有效数位模式为0101,那么其值为0*2-1+1*2-2+0*2-3+1*2-4,即有效数域的指数为负数)
另外IEEE 754还提供4个精度级别的浮点数定义(单精度、双精度、延生单精度和延生双精度),单精度和双精度具体定义如下:

LevelWidth(bit)Range at full precisionWidth of biased-exponent(bit)Width of significant(bit)
Single Precision321.18*10-38 ~ 3.4*1038823
Double Precision642.23*10-308 ~ 1.80*103081152
为了简便,下面以Single Precision来作叙述。

0.5/(-0.25) = -2

以8位存储,尾数采用原码编码
0.5  存储位模式 0-0110-000
-0.25  存储位模式 1-0101-000

2. 计算阶码(公式e1-e2+Bias+(m-1))
0110
+1011
10001
+00111
11000
+00011
11011
取模得到 1011

3. 尾数相除
1000/1000 = 1000 >> 3 得到0001

4. 左规格化
0001左移3位得到 1000
阶码-3得到 1000

5. 舍入处理
尾数为1000

6. 溢出判断
无溢出

7. 符号位异
0 xor 1 = 1

结果
1-1000-000


View Code

Conclusion                          

总算写完了:)本文以单精度作为叙述对象,为简化手工运算各示例均以8bit浮点数作为讲解,其实32bit和64bit的浮点数表示和运算规则与其相同,理解规则就OK了。

看完这么多原理性的东西,是时候总结一下我们对浮点数应有的印象了:

1. 浮点数可表示的值范围比同等位数的整数表示方式的值范围要大得多;

2. 浮点数无法精确表示其值范围内的所有数值,而有符号和无符号整数则是精确表示其值范围内的每个数值;

3. 浮点数只能精确表示m*2e的数值;

4. 当biased-exponent为2e-1-1时,浮点数能精确表示该范围内的各整数值;

5. 当biased-exponent不为2e-1-1时,浮点数不能精确表示该范围内的各整数值。

例如:
1000000000000000128
1000000000000000129以双精度浮点数表示时,均为


0-10000111010-11011110000010110110101100111010011101100100000000001。


若以64bit无符号整数表示时,
1000000000000000128为 0000110111100000101101101011001110100111011001000000000010000000;


1000000000000000129为 0000110111100000101101101011001110100111011001000000000010000001。


[b][/b]例子源自:http://es5.github.io/#x15.7.4.5

尊重原创,转载请注明来自:/article/4741172.html 肥子John^_^

Thanks                            
https://en.wikipedia.org/wiki/IEEE_754-1985 http://geeklu.com/2011/03/ieee754-floating-point-arithmetic/ http://blog.csdn.net/hillchan31/article/details/7565782 http://blog.csdn.net/jn1158359135/article/details/7761011 http://laokaddk.blog.51cto.com/368606/284280/
《深入理解计算机系统》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: