浮点数二进制转换及储存方式,以及浮点转定点运算

一、浮点数储存方式

1.1 二进制转换为十进制

= 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20 + 1 × 2-1 + 0 × 2-2 + 1×2-3
= 8 + 0 + 0 + 1 + 1/2 + 0 + 1/8
= 9+0.5+0.125
= 9.625

由上面的等式,我们可以得出:
向左移动二进制小数点一位相当于这个数除以 2,而向右移动二进制小数点一位相当于这个数乘以 2
如 101.11 = 5.75,向左移动一位,得到 10.111 = 2.875

除此之外,我们还可以得到这样一个基本规律:
一个十进制小数要能用浮点数精确地表示,最后一位必须是 5

如下面的示例所示:
在这里插入图片描述


1.2 十进制转换为二进制

基本换算方法:
将10进制的数拆分成整数和小数两个部分
整数部分除以2,取余数;小数部分乘以2,取整数位。

示例:
将十进制 1.1 转成 二进制
整数部分:1除以2余1
小数部分:0.1乘以2,一直乘到小数部分为0

0.1 *2 = 0.2 -> 0
0.2 *2 = 0.4 -> 0
0.4 *2 = 0.8 -> 0
0.8 *2 = 1.6 -> 1
0.6 *2 = 1.2 -> 1
0.2 *2 = 0.4 -> 0
0.4 *2 = 0.8 -> 0
0.8 *2 = 1.6 -> 1
0.6 *2 = 1.2 -> 1
0.2 *2 = 0.4 -> 0
0.4 *2 = 0.8 -> 0
0.8 *2 = 1.6 -> 1
0.6 *2 = 1.2 -> 1
0.2 *2 = 0.4 -> 0
0.4 *2 = 0.8 -> 0
0.8 *2 = 1.6 -> 1
......

二进制形式表示为:
1.000110011001100110011…


1.3 小数储存方式

每一个浮点数可以用:(-1)^S * M * 2^E表示;

  • S区表示符号位:1为正,0为负;
  • M区表示有效位:数值的具体数值,用科学计数法表示;
  • E区表示指数位:最后的有效位的数值再乘上指数位的次方就是该浮点数发数值;

储存格式
单精度浮点:
在这里插入图片描述
双精度浮点:
在这里插入图片描述
在这里插入图片描述


1.3.1 单精度举例说明

小数 5.75 二进制表示为:101.11=1.0111** 2^2

指数部分为2 尾数部分为0111
所以
指数位:2+127 = 129 = 1000 0001(加127代表+2,不加127代表-2)
尾数位:0111 0000 0000 0000 0000 000

单精度储存的完整二进制表示如下
0 1000 0001 0111 0000 0000 0000 0000 000


1.3.2 双精度举例说明

小数 5.75 二进制表示为:101.11=1.0111** 2^2

指数部分为2 尾数部分为0111
所以
指数位:2+1023 = 1025 = 100 0000 0001(加1025代表+2,不加1025代表-2)
尾数位:0111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

双精度储存的完整二进制表示如下
0 100 0000 0001 0111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000


二、浮点转定点运算

2.1 简介

采用定点数进行数值运算,其操作数一般采用整型数来表示。
一个整型数的最大表示范围取决于运算芯片所给定的字长,一般为16位或24位
显然,字长越长,所能表示的数的范围越大,精度也越高。如无特别说明,本文均以16位字长为例
参与运算的数以二进制补码形式表示。每个16位数用一个符号位来表示数的正负,0表示数值为正,1则表示数值为负。
其余15位表示数值的大小。

2.1.1 定点表示

参与数值运算的数为16位的整型数。但在许多情况下,数学运算过程中的数不一定都是整数。
应该说,运算芯片本身无法处理小数。关键就是由程序员来确定一个数的小数点处于16位中的哪一位。这就是数的定标
通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数
数的定标有Q表示法和S表示法两种。
下面列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围:
在这里插入图片描述

2.1.2 定点表示示例

同样一个16位数,若小数点设定的位置不同,它所表示的数也不同(首位为符号位):
16进制数2000 H= 二进制数0 010 0000 0000 0000 B= 十进制数8192, Q0表示法
16进制数 2000 H= 二进制数0 010 0000 0000 0000 B= 十进制数0.25 , Q15表示法


2.2 浮点定点转换

不同的Q所表示的数不仅范围不同,而且精度也不相同。
Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。
E.g.
Q0 的数值范围是-32768到+32767,其精度为1
Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051
因此,对定点数而言,数值范围精度是一对矛盾。
一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。
在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。

2.2.1 转换关系

浮点数与定点数的转换关系可表示为:
浮点数(Fx)转换为定点数(Ix):Ix = (int)x* 2^Q(这个地方为向下取整)
定点数(Ix)转换为浮点数(Fx):Fx= (float)Ix*2^(-Q)

2.2.2 转换示例

浮点数 Fx = 0.5,定标 Q = 15,则定点数:
Ix = floor(0.5*32768) = 16384

反之,一个用 Q = 15 表示的定点数Ix = 16384,其浮点数为:
Fx = 16384 * 2^(-15) = 16384 / 32768 = 0.5

浮点数转换为定点数时,为了降低截尾误差,可以在取整前可以先加上0.5,视情况而定。


2.3 C语言实现定点预算模拟

将浮点加法/减法转化为定点加法/减法时最重要的一点就是必须保证两个操作数的定标:
若两者不一样,则在做加法/减法运算前先进行小数点的调整。
为保证运算精度,需使Q值小的数调整为与另一个数的Q值一样大。
此外,在做加法/减法运算时,必须注意结果可能会超过16位表示。
如果加法/减法的结果超出16位的表示范围,则必须保留32位结果,以保证运算的精度,否则可能会出现严重的精度丢失。

2.3.1 结果不超过16位的定点加法

// 设x的Q值为Qx,y的Q值为Qy,且Qx > Qy,加法/减法结果z的定标值为Qz
// 所以定点加法可以描述为:
int x,y,z;
long temp; // 临时变量
temp = y << (Qx - Qy);
// Q大-Q小,Q大的变量分辨率更高,Q小的左移增加其Q
temp = x + temp;
z = (int)(temp >> (Qx - Qz)); // if Qx >= Qz 
z = (int)(temp << (Qz - Qx)); // if Qx <= Qz
// 设x = 0.5,y = 3.1,则浮点运算结果为z = x+y = 0.5+3.1 = 3.6;
// Qx = 15,Qy = 13,Qz = 13,则定点加法为:
x = 16384;y = 25395;
temp = 25395 << 2 = 101580;
temp = x+temp = 16384+101580 = 117964;
z = (int)(117964L >> 2) = 29491;
// 因为z的Q值为13,所以定点值z = 29491即为浮点值z = 29491/8192 = 3.6。

2.3.2 定点乘法

int x,y,z;
long temp;
temp = (long)x;
z = (temp×y) >>(Qx+Qy-Qz);
// 设x = 18.4,y = 36.8,则浮点运算值为z = 18.4×36.8 = 677.12;
// 根据上节,得Qx = 10,Qy = 9,Qz = 5,所以
x = 18841;y = 18841;
temp = 18841L; // Long int
z = (18841L * 18841) >> (10+9-5) = 354983281L >> 14 = 21666;
// 因为z的定标值为5,故定点 z = 21666即为浮点的 z = 21666/32 = 677.08 产生了精度损失

更多详解请见…

  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big Bear 12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值