⼗进制浮点数转换为⼆进制数以及存储⽅式
⽂章⽬录
#⼗进制数转换为数
⼗进制数转换为⼆进制数时,由于整数和⼩数的转换⽅法不同,所以先将⼗进制数的整数部分和⼩数部分分别转换后,再加以合并。
1、⼗进制整数转换为⼆进制整数
⼗进制整数转换为⼆进制整数采⽤"除2取余,排列"法。具体做法是:⽤2去除⼗进制整数,可以得到⼀个商和余数;再⽤2去除商,⼜会得到⼀个商和余数,如此进⾏,直到商为零时为⽌,然后把先得到的余数作为⼆进制数的低位有效位,后得到的余数作为⼆进制数的⾼位有效位,依次排列起来。
【例1 】 把 ⼗进制173 转换为⼆进制数。
2、⼗进制⼩数转换为⼆进制⼩数
⼗进制⼩数转换成⼆进制⼩数采⽤"乘2取整,顺序"法。具体做法是:⽤2乘⼗进制⼩数,可以得到积,
将积的整数部分取出,再⽤2乘余下的⼩数 部分,⼜得到⼀个积,再将积的整数部分取出,如此进⾏,直到积中的⼩数部分为零,或者达到所要求的精度为⽌。 然后把取出的整数部分按顺序排列起来,先取的整数作为⼆进制⼩数的⾼位有效位,后取的整数作为低位有效位。
二进制小数如何转换成十进制【例2】把⼗进制⼩数 0.8125转换为⼆进制⼩数。
【例3】将⼗进制数173.8125转为⼆进制数。
把整数部分和⼩数部分合并得:
(173.8125) =(10101101.1101)#类型数据的存储
⽆论是单精度还是双精度在存储中都分为三个部分:
符号位(Sign) : 0代表正,1代表为负
指数位(Exponent):⽤于存储科学计数法中的指数数据,并且采⽤移位存储
尾数部分(Mantissa):尾数部分
其中单精度float数据的存储⽅式如下图所⽰:
⽽双精度double的存储⽅式为:
102
⽐如8.25⽤⼗进制的科学计数法表⽰为:8.2510º,⽽120.5可以表⽰为:1.20510²。⽽计算机根本不认识⼗进制的数据,他只认识
0,1。所以在计算机存储中,⾸先要将上⾯的数更改为⼆进制的科学计数法表⽰。8.25⽤⼆进制表⽰可表⽰为1000.01。120.5⽤⼆进制表⽰为:1111000.1。
⽤⼆进制的科学计数法表⽰1000. 01可表⽰为1. 00001×2^3, ⽽1110110. 1则可表⽰为1. 1101101×2^6, 任何⼀个数的科学计数法都可表⽰为1. xxx×2^n;因此尾数部分就可表⽰为xxx,反正第⼀位都是1嘛,⼲嘛还要表⽰呀! ?故可将⼩数点前⾯的1省略,故
23bit的尾数部分,可以表达的精度却变成了24bit,道理就是在这⾥;那24bit能精确到⼩数点后的⼏位呢?我们知道,9的⼆进制
表⽰为1001,所以4bit能精确⼗进制中的1位⼩数点,24bit 就能使float能精确到⼩数点后6位;另算上可以估读最后⼀位,故有效位数为7位。
⽽对于指数部分,因为指数可正可负,8位的指数位能表⽰的指数范围就应该为-127⾄128了,所以指数部分的存储采⽤移位存储,存储的数据为原数据加127,下⾯就看看8.25和120.5在内存中真正的存储⽅式。
⾸先看下8.25,⽤⼆进制的科学计数法表⽰为: 1. 00001×2^3。按照上⾯的存储⽅式,符号位为0,表⽰为正:指数位为
3+127=130 (⼆进制值10000010);尾数部分为00001,故8.25的存储⽅式如下图所⽰:
⽽单精度120.5的存储⽅式如下图所⽰:
#其他总结
1、关于浮点数的精度与范围:
.浮点数表⽰的主要⽬标是: ⽤尽量短的字长,实现尽可能⼤的表数范围和尽可能⾼的表数精度。
尾数的位数越多,有效精度越⾼;
阶码的位数越多,范围越⼤。
设计时,如果字长⼀定,则需要在精度和范围之间作⼀权衡。
2、关于浮点数的分布:与整数的均匀分布相⽐,浮点数有以下特点
越靠近零点处,数的分布越密,能够表⽰的精度越⾼,
越远离零点处,数的分布越稀疏,能够表⽰的范围越⼤。
#参考
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论