开云-浮点数和定点数的相互转换

浮点数和定点数的彼此转换 时候:2024-12-13 15:31:07 手机看文章

扫描二维码随时随地手机看文章

浮点数目化为定点

1. 这篇博客将要会商甚么?

说来忸捏,作为计较机科班身世的人,计较机根本常识把握其实不扎实,这里的根本指的是计较机系统布局中的内容,诸如数据的暗示和处置,如float的暗示和运算等。看《CSAPP》方知人家老外把这个工具当做重中之重,年夜量具体的道理介绍,并配套年夜量例题。当初本科学的时辰,很简单的领会了下概念罢了,所以应当直接将《CSAPP》当作教材来用,里面习题全做,如许CS出来的根基常识将把握的很扎实。

学艺不精的后果就在在:学而不思则罔。圣人太利害了,总结得很到位。好比比来项目中触及到浮点和定点的转换,本身就有点蒙,边看边尝试,还算理解了,作文以记之。

一向以来,法式中接触的数据类型都是int整型,char字符型,float单精度浮点型,double双精度浮点型。看到浮点和定点一向不知道若何划分这个概念的范围。觉得浮点就是float暗示小数,定点就是int可暗示整数罢了。颠末进修大白了明显是毛病的。应当是如许划分的:

浮点:小数点非固定的数,可暗示数据规模较广,整数,小数都可暗示。包括float,double;

定点:小数点固定,可暗示整数,小数。int素质是小数点位在末尾的32位定点数罢了;

有了这个熟悉,后面的会商便可以最先了。

2. 浮点数的暗示法

浮点数以float为例会商。

2.1 IEEE 754尺度

划定浮点数格局为:

s暗示符号位,当s=0,V为正数;当s=1,V为负数

M暗示尾数,2 M =1

E暗示阶码

将其封装到32位的字中:

按照32位数计较为十进制:

可以得出以下结论:

浮点数暗示比整型那些更加复杂。如int中0…01000暗示8,0…01001暗示9,而浮点不克不及如许简单。

浮点数不克不及移位。由于各个位有非凡寄义。像int数乘2可以左移1位实现。

2.2 浮点数的“浮”字表现在哪里?

我们说浮点数的小数点不是固定的,是浮动的,那末若何理解?经由过程例子可直不雅体验。

这个浮点数暗示十进制的1.125

若阶码不变,尾数加1,则暗示十进制的1.25

若尾数不变,阶码加1,则暗示十进制的2.25

3. 定点数的暗示法

对计较机来讲,浮点定点的概念是看不见的,由于它只能看到:0…00001110,至在它暗示几多,是逻辑层面的设置。你假如让它是int那就依照int暗示法对每一个位付与意义,假如你让它是float就依照float暗示法付与意义。

对000111000001110000011100暗示的定点数:

假如我们设定小数点是位在最后一名的,即00011100.00011100.00011100.则其暗示28

若设定小数点位在后三位的,即00011.10000011.10000011.100则其暗示3.50

若设定小数点位在后四位的,即0001.11000001.11000001.1100则其暗示1.75

可以看到:

小数位数越多,暗示的精度越高。若小数点后有n位,则其暗示的最年夜精度为

1/(2n);

整数位数越多,可暗示的最年夜值越年夜。

以8位为例,最高位为符号位:

若整数位占4位,小数位占3位,则其最年夜精度为0.125,最年夜值为15.875

若整数位占5位,小数位占2位,则其最年夜精度为0.250,最年夜值为31.750

若整数位占6位,小数位占1位,则其最年夜精度为0.500,最年夜值为63.500

若整数位占7位,小数位占0位,则其最年夜精度为1.000,最年夜值为127

4. 浮点数 定点数

4.1 为什么要把浮点数转换为定点数呢?

这来历在项目中神经收集的需求,收集中年夜量的参数,假如全数用F32暗示,一是占用空间年夜,二是读取效力不高。

假如我们可以将某些浮点数转换为定点数暗示,在接管精度损掉的条件下,每次便可以读取多个进交运行,可显著提高运算效力。

举例来讲,我们用8位定点数,1个符号位,4个整数位,3个小数位,则其可暗示规模是-16.00~15.875,最年夜精度0.125。

有几个浮点数:0.145,1.231,2.364,7.512,每一个需要32bit暗示。

假如我们将每一个量化成一个8位定点数,好比经由过程某种方式获得:1,10,19,60

此时每一个数需要8bit暗示。那末读一个浮点数,可以同时读4个定点数,且计较效力可以提高。固然如许做是有风险的:

损掉精度,好比再将上述定点数转化为浮点数:0.125,1.250, 2.375,7.500;

定点数暗示规模有限,加法有可能会溢出,需要拿int16或int32来暂存中心成果;

4.2 若何将浮点数转换为定点数?

我们用8位定点数,1个符号位,4个整数位,3个小数位。这个3称为量化系数。该进程称为量化。

(我们老是将非离散值量化到离散值空间,处置更加简单)

Int8=float32*2(3)

如:

Int8(10)=float32(1.231)*2(3)

4.3 若何将定点数转换为浮点数?

该进程称为反量化。

Float32=int8/2(3)

如:

Float32(1.250)=int8(10)/2(3)

4.4 note

可以如许理解:量化系数 nnn 决议了我们逻辑上认为01序列中可暗示的单元值 1/(2n),CPU读取的数字暗示有几多份单元值。

举例来讲,对固定的01序列值:0001,1100

一样的int8数,由于量化系数的分歧,代表着分歧的f32值。

还个note:

定点数加减时需要量化系数不异,其值有可能溢出,需要更年夜定点数来暂存中心值;

两个定点数乘法后假如需要转化为f32,则反量化系数变成2∗n

5. 总结

可以看到:

浮点数和定点数的转换是一种映照。将较为密集的数据空间(F32)映照到较为稀少的空间(int8);

定点数的小数点现实中是没有的,这只是我们逻辑上的一种设定。01序列是一样的,CPU读取都是不异的,由于我们逻辑上小数点的分歧位置,我们认为它代表的值是分歧的;

作者:鸟恋旧林XD

原文链接:https://blog.csdn.net/niaolianjiulin/article/details/82764511

最后给大师一个在线的转换东西:

https://www.h-schmidt.net/FloatConverter/IEEE754.html

示例:将浮点数55.12345转换为32bit

欲知详情,请下载word文档 下载文档

上一篇:开云-共建产业生态,深耕技术创新,安谋科技携前沿成果亮相ICCAD 2024 下一篇:开云-使用Simulink快速搭建视频处理硬件加速仿真平台