浮点数转二进制数
学过 《计算机组成原理》 或者类似 《计算机系统》 这些课程的小伙伴们应该都知道,浮点数在计算机中的存储方式遵循 IEEE 754 浮点数计数标准 ,可以表示为:
采用 尾数 + 阶码 的编码方式,更通俗一点说,就是类似于数学课本上所学的 科学计数法 表示方式: 有效数字 + 指数位 !
因此,只要给出: 符号(S) 、 阶码部分(E) 、 尾数部分(M) 这三个维度的信息,一个浮点数的表示就完全确定下来了,所以float和double这两种类型的浮点数在计算机中的存储结构就表示成下图所示这个样子:
1、符号部分(S)
0-正1-负
2、阶码部分(E)(指数部分) :
对于float型浮点数,指数部分8位,考虑可正可负,因此可以表示的指数范围为-127 ~ 128
对于double型浮点数,指数部分11位,考虑可正可负,因此可以表示的指数范围为-1023 ~ 1024
3、尾数部分(M) :
浮点数的精度是由尾数的位数来决定的:
对于float型浮点数,尾数部分23位,换算成十进制就是2^23=8388608,所以十进制精度只有6 ~ 7位;
对于double型浮点数,尾数部分52位,换算成十进制就是2^52 = 4503599627370496,所以十进制精度只有15 ~ 16位
所以,浮点数交给计算机存储的时候,可能会有 精度丢失 问题!!!因此使用时需要格外小心,如果真因为这一块出了bug,定位问题还是非常艰难的,所以预防工作要做好。
进制转换计算案例
上面说的是IEEE标准规定的内容,属于理论规约。那一个小数到底要怎么换算成二进制呢?我们得拿 实际例子 来解释。
先来个简单的例子
比如: 把十进制小数0.875转换成二进制,具体怎么操作?
可以分几大步走:
1、以小数点为界,拆分
2、整数部分转换
整数转二进制我想大家应该都熟悉,使用: 除2取余法 即可。而这里的0.875整数部分为0,无需操作。
3、小数部分转换
小数部分的转换不同于整数部分,采用的是 “乘2取整法” ,图示一下就明白了:
4、合并结果
整数部分 + 小数部分,最终得到二进制结果为0.111。
所以该结果按照上一节所述的 尾数 + 阶码 的计算机计数方式,则可以表示为:
所以对应可得:
符号位 :0
阶码(E)部分 :若以float为例,应为127 +(-1)= 126,因此二进制表示为:01111110
尾数部分(M) :若以float为例,应为23位,因此尾部补齐后为11000000000000000000000。
因此最终的总结果为(以32位精度float表示):
00111111011000000000000000000000
再来个复杂点例子
再比如: 把十进制小数6.36转换成二进制,具体怎么操作?
但凡能用图示,我就不想写文字,所以用一张图就可以解释得明明白白:
整数部分 + 小数部分,因此最终得到的结果二进制结果为110.01011100...。
还是按照上一节所述的 尾数 + 阶码 的计算机计数方式,则可以表示为:
所以对应可得:
符号位 :0
阶码(E)部分 :若以float为例,应为127 +(2)= 129,因此二进制表示为:10000001
尾数部分(M) :1001011100...,其实它本身无限不循环,但若以float型精度来截取23位,则可以表示为10010111000010100011111
因此最终的总结果为(以32位精度float表示):
01000000110010111000010100011111
所以像这种无限位数的尾数情况,用计算机存储产生截取是必然的,必定会有一定的 精度损失 !所以这也从根本上解释了为什么float或者double这种类型数据使用时的风险性,因此必须要结合实际业务理性考量。
还有一个神器
大家如果对上面的计算结果不放心,或者想检查手动换算的结果是否正确,也有直接的这种 二进制转换工具站 ,典型的比如:binaryconvert.com
不想手动换算的,直接去上面输入,转换一下即可得到结果,而且可以进制互换:
参考:CodeSheep
计算十进制数37.25的IEEE754短浮点数的十六进制格式;
首先是IEEE754短浮点数的格式 32位单精度 单精度二进制小数,使用32个比特存储。1 8 23 位长 S Exp raction 31 30至23 偏正值 22至0 位编号(从右边开始为0)(实际的指数大小+127)所以计算方法如下:37.25D=100101.01 所以指数部分应该是5,对应偏正值132 最终结果:...
比特深度和采样频率设置多少才是最佳的音效?(图)``
此外,不对高于采样频率1\/2的频率成份进行处理,如果这样的信号进入转换过程,高频将会产生失真信号,造成混叠噪声(滤波器派上用场)。 比特深度表示数字采样过程中的振幅划分,即把随时间连续变化的模拟信号的即时电压变换成离散的,由1和0组成的二进制数,以比特表示,即一个采样值由几位数来表示,它决定了信息包的大小...
如何通俗地解释p-adic(p进数)?
对于有理数,我们可以通过分解分母并找到合适的倍数,将其转化为p进数的形式,尽管在不同的p进数系统中,相同的十进数可能有不同的表示,但像在二进制和五进制中,某些特定情况下的表现却是相同的。在p-adic数的乘法研究中,它们往往比普通的N进数更为优越。特别是当探讨极限和单位根时,p-adic...
什么叫像素
问题二:什么叫像素、分辨率、 为了能够在一个固定的屏幕上展现各式各样的图像画面,需要将屏幕分解成很多个细小的单元,改变细小单元的图像内容,合起来就改变了整个画面的内容。不然,屏幕上就只能显示固定不动的画面了。细小单元要足够小,小到肉眼不容易分辨出来。这个细小单元叫像素。 屏幕水平方向的像素个数叫水平分...
什么是十六进制?
有10个基数:0 ~~ 9 ,逢十进一 二进制:有2 个基数:0 ~~ 1 ,逢二进一 八进制:有8个基数:0 ~~ 7 ,逢八进一 十六进制:有16个基数:0 ~~ 9,A,B,C,D,E,F(A=10,B=11,C=12,D=13,E=14,F=15) ,逢十六进一。先讲我们经常用到的十进制,从0数到9,到第10个...
频率分辨率的两种解释
不产生频率混迭的最低采样频率Fs要求在2倍最大分析频率Fm,之所以采用2.56倍主要跟计算机二进制的表示方式有关。其主要目的是避免信号混淆保证高频信号不被歪曲成低频信号。采样长度T的选择首先要保证能反映信号的全貌,对瞬态信号应包括整个瞬态过程;对周期信号,理论上采集一个周期信号就可以了。
电脑硬件技术指标
(2)色彩位数(彩色深度):图形中每一个像素的颜色是用一组二进制树来描述的,这组描述颜色信息的二进制数长度(位数)就称为色彩位数。色彩位数越高,显示图形的色彩越丰富。通常所说的标准 VGA 显示模式是 8位显示模式,即在该模式下能显示 256种颜色;增强色(16位)能显示 65 536种颜色,...
模拟信号采样定理
kbps 比特率 表示经过编码(压缩)后的音频数据每秒钟需要用多少个比特来表示,而比特就是二进制里面最少的单位,要么是0,要么是1。比特率与音频压缩的关系简单的说就是比特率越高音质就越好,但编码后的文件就越大;如果比特率越少则情况相反。比特率是指将数字声音由模拟格式转化成数字格式的采样率...
DDS的原理是什么?
DAC 输出代表幅度的二进制数字信号被送入DAC 中,并转换成为模拟信号输出。注意DAC 的位数并不影响输出频率的分辨率。输出频率的分辨率是由频率控制字的位数决定的。直接数字式频率合成技术(DDS)是一种先进的全数字频率合成技术,它具有多种数字式调制能力(如相位调制、频率调制、幅度调制以及I\/Q正交调制...
征途架设里,怎么修改BOSS和怪物的等级?
率="10000" 使用技能="0" 状态="0" 躲避率="10" 命中率="80" 图片="348" 品质="6" 怪物类别="10" 纸娃娃图片="100000" 回血="30:2:5500" 二进制标志1="0" 二 进制标志2="0" \/> 这里就是铁兽的数据,你可以进行修改 其中的“魂魄之石几率”就是魂魄是的暴率 铁兽的是10000,...
充腾绞股: 十进制的整数部分转换为二进制整数采用"除2取余,逆序排列"法.具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位...
安仁县18236542005: 浮点数转二进制数的方法??
充腾绞股: 先转ASCII,再除以2,得到1(或0),余数继续除以2,一直到最后为1或0,不知道这样得到的结果是不是你想要的?
安仁县18236542005: 浮点型数据的二进制表示 - ?
充腾绞股: 12/2=6 ... 0 6/2=3 ... 0 3/2=1 ... 1 1/2=0 ... 1 所以整数部分是11000.123*2 = 0.246 整数部分 0 0.246*2=0.492 0 0.492*2=0.984 0 0.984*2=1.968 1 0.968*2=1.936 1所以小数部分0.0001112.123=1100.00011
安仁县18236542005: 如何把浮点数转换为二进制数 - ?
充腾绞股: 255*(x/2+1)/2的计算结果被强制转化为unsigned char类型,并赋给a. 这个回答肯定是不对的 除非写法是a = (unsigned char)(255*(x/2+1)/2) 1.(unsigned char)255是二进制11111111 2.*(x/2+1)/2 x是一个浮点数,运算出来仍然是浮点数 我不明白你什么意思
安仁县18236542005: 浮点的十进制数字,如何转换成二进制? - ?
充腾绞股: 十进制数的小数点部分转二进制用的是“乘2取整正排序”的方法:如下: 0.712*2=1.424 取整 1 0.424*2=0.848 取整0 0.848*2=1.696 1 0.696*2=1.392 1 0.392*2=0.748 0 0.748*2=1.568 1 0.568*2=1.136 1 0.136*2=0.272 0 如果这样下去出现了循环的现象,那么就在循环前处结束; 如果一直没有循环,那么就取你想要的位数就可以了 这样得到了对应小数点后二进制为:0110110...
安仁县18236542005: 浮点数的二进制表示 - ?
充腾绞股: 整数怎样转2进制,小数怎样转2进制就不说了. 12.5: 1. 整数部分12,二进制为1100; 小数部分0.5, 二进制是.1,先把他们连起来,从第一个1数起取24位(后面补0): 1100.10000000000000000000 这部分是有效数字.(把小数点前后两部...
安仁县18236542005: 如何转换浮点数的二进制格式为十进制 - ?
充腾绞股: 二进制的小数转换为十进制主要是乘以2的负次方,从小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方等. 例如:二进制数0.001转换为十进制. 第一位为0,则0*1/2,即0乘以2负一次方. 第二位为0,则0*1/4,即0乘以...
安仁县18236542005: 二进制中浮点数怎么表示 - ?
充腾绞股: 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算.这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号.下面是具体的规格:符号位 阶...
安仁县18236542005: 汇编语言:如何将浮点数转换为二进制 - ?
充腾绞股: 你说从键盘上输入,那输入应该是一个字符串,例如 "1.23" 之类的 如果像1楼那样自己实现IEEE标准的话是很麻烦的,因为要用到高精度算法.如果没要求自己实现浮点数标准(符号位、幂、尾数)的话,因为现在PC机的CPU基本都是用那...