基础野:细说浮点数
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个精度级别的浮点数定义(单精度、双精度、延生单精度和延生双精度),单精度和双精度具体定义如下:
为了简便,下面以Single Precision来作叙述。
View Code
Conclusion
总算写完了:)本文以单精度作为叙述对象,为简化手工运算各示例均以8bit浮点数作为讲解,其实32bit和64bit的浮点数表示和运算规则与其相同,理解规则就OK了。
看完这么多原理性的东西,是时候总结一下我们对浮点数应有的印象了:
1. 浮点数可表示的值范围比同等位数的整数表示方式的值范围要大得多;
2. 浮点数无法精确表示其值范围内的所有数值,而有符号和无符号整数则是精确表示其值范围内的每个数值;
3. 浮点数只能精确表示m*2e的数值;
4. 当biased-exponent为2e-1-1时,浮点数能精确表示该范围内的各整数值;
5. 当biased-exponent不为2e-1-1时,浮点数不能精确表示该范围内的各整数值。
例如:
若以64bit无符号整数表示时,
[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/
《深入理解计算机系统》
本来只打算理解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个精度级别的浮点数定义(单精度、双精度、延生单精度和延生双精度),单精度和双精度具体定义如下:
Level | Width(bit) | Range at full precision | Width of biased-exponent(bit) | Width of significant(bit) |
Single Precision | 32 | 1.18*10-38 ~ 3.4*1038 | 8 | 23 |
Double Precision | 64 | 2.23*10-308 ~ 1.80*10308 | 11 | 52 |
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/
《深入理解计算机系统》
相关文章推荐
- 考核5 把字符串存入字典 数组对首字母排序 数组删除
- 修改Android系统默认关闭“验证应用”功能
- Java 并发编程
- 给大家一个,vb程序员一个Dijkstra最短路径的动态库,懒得思考的就用吧。
- window 守护进程
- Access到SQL的数据同步
- sql server 2008 r2 代理服务不能启动
- UPnP协议编程实践(二)
- 华为机试——验证密码合格
- 自定义UINavigationBar
- 扩展方法使用
- js或者cs代码拼接html
- HTC Vive 4月上市,而这是它上市前最后一个开发版的样子 | CES 2016
- yii2中使用Active Record模式的方法
- C# socket编程实践——简单聊天室
- LeetCode N-Queens
- Maven 项目打包需要注意到的那点事儿
- 【.net深呼吸】动态类型(高级篇)
- 考核6 数组和字符串 描述器排序 字典替换
- python中的pip安装