IEEE754浮点数转换与浮点数加减运算

785 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第二天,点击查看活动详情

----20220526
开始机组复习啦,跟着老师的ppt走,一共47面ppt,今天至少给大家讲一半


ppt1-11

float型与真值之间的变换流程

单精度浮点数是用来表示带有小数部分的实数,一般用于科学计算。占用4个字节(32位)存储空间,包括符号位1位,阶码8位,尾数23位
对于格式有以下几点说明:
(1)E采用移码表示,注意其偏移量是127,而不是标准移码的128.偏移量越大,移码最大值,最小值越小,非规格化数精度越高;规格化数表示范围越小,采用偏移量127表示的精度低一点,但范围略大一点。
(2)尾数M为定点小数,小数点固定在M最左侧,且小数点左边还有一个隐藏的1,因此尾数的实际有效位位24位,完整尾数形式为1.M,进行浮点数表示时只保存M,节省的比特位可以用于提高尾数的精度。尾数的部分是绝对值表示,尾数的符号位也就是浮点数的符号位S,为1时表示负数,为0时表示正数,所以浮点数的尾数可以看作原码表示
(3)S,E,M字段的取值不同,所表示的浮点数不同。

image.png
我身边还是有一些宝贝不太会IEEE754浮点数与对应真值之间的转换流程,其实他的流程就如上图所示,首先将要转化 的十进制浮点数N转为(-1)^s2^e1.M,之后算出E的值,E=e+127,之后保存S,E,M。
我们现在来看一道例题:将十进制数20.59375转换为IEEE754单精度浮点数的十六进制机器码
这道题很简单,思路就是通过跟上图的转换流程,一步一步的进行跟着就行
这张图是我写的解法,中间那个很乱的字,是A,当时脑子一抽,写错了。

a93b1f9b90d93e7dbfa5830609ff9ad.jpg

那么浮点数转为十进制呢,其实就是反着来
例:求IEEE754单精度浮点数(C1360000)16对应的十进制数

87b1688c74a2ec9c403fb72971b7e5b.jpg 值得注意的是,十进制小数大多不能精准转换为二进制数,如0.1,0.2,0.3等数在转为二进制值小数时都会变成循环小数,即使有再多的尾数也无法精确表示这些十进制数,通常只能采用舍入的方式近似,因此会带来数据表示的误差,这类误差会在计算的过程中不断累计放大。
正因为二进制浮点数并不能精确的表示所有的十进制数,所以程序员使用二进制浮点数编辑时,一定要非常小心,要充分考虑浮点数运算可能带来的运算误差,尽量避免对浮点数进行之间比较,在一些对误差及其敏感的情况下,建议采用十进制浮点数进行运算。

浮点数加减运算

首先时浮点数计算步骤:对阶,尾数运算,规格化,溢出判断,舍入

浮点数运算细节

1、对阶:小阶对大阶,尾数右移(符号位一起移位)
2、结果规格化:补码符号位与数值最高位不同\

  •       **00.1xxxxx  11.0xxxxx**
    
  • 右移以实现规格化 向右规格化 右归 阶码+ 和符号位一起移位
  • 左移以实现规格化 向左规格化 左归 阶码- 和符号为一起移位 3、舍入:较为常用的有一下三种方法:截去、0舍1入,偶数舍入 4、溢出判断:根据阶码是否溢出确定浮点数是否溢出
  • 阶码正溢出,运算结果上溢
  • 阶码负上溢,运算结果下溢