浮点数和定点数的相互转换

发布时间:2024-12-13  

浮点数量化为定点

1. 这篇博客将要讨论什么?

说来惭愧,作为计算机科班出身的人,计算机基础知识掌握并不扎实,这里的基础指的是计算机体系结构中的内容,诸如数据的表示和处理,如float的表示和运算等。看《CSAPP》方知人家老外把这个东西当成重中之重,大量详细的原理介绍,并配套大量例题。当初本科学的时候,很简单的了解了下概念而已,所以应该直接将《CSAPP》当做教材来用,里面习题全做,这样CS出来的基本知识将掌握的很扎实。

学艺不精的后果就在于:学而不思则罔。圣人太厉害了,总结得很到位。比如最近项目中涉及到浮点和定点的转换,自己就有点蒙,边看边实验,还算理解了,作文以记之。

一直以来,程序中接触的数据类型都是int整型,char字符型,float单精度浮点型,double双精度浮点型。看到浮点和定点一直不知道如何划分这个概念的范畴。以为浮点就是float表示小数,定点就是int可表示整数而已。经过学习明白了显然是错误的。应该是这样划分的:

浮点:小数点非固定的数,可表示数据范围较广,整数,小数都可表示。包含floatdouble

定点:小数点固定,可表示整数,小数。int本质是小数点位于末尾的32位定点数而已;

有了这个认识,后面的讨论就可以开始了。

2. 浮点数的表示法

浮点数以float为例讨论。

2.1 IEEE 754标准

规定浮点数格式为:

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

M表示尾数,2>M>=1

E表示阶码

将其封装到32位的字中:

根据32位数计算为十进制:

可以得出以下结论:

浮点数表示比整型那些更为复杂。如int0…01000表示80…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.1451.2312.3647.512,每个需要32bit表示。

如果我们将每个量化成一个8位定点数,比如通过某种方法得到:1101960

此时每个数需要8bit表示。那么读一个浮点数,可以同时读4个定点数,且计算效率可以提高。当然这样做是有风险的:

损失精度,比如再将上述定点数转化为浮点数:0.1251.250 2.3757.500

定点数表示范围有限,加法有可能会溢出,需要拿int16int32来暂存中间结果;

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,则反量化系数变为2n

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


文章来源于:21IC    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    64位浮点数转32位浮点数PLC程序的开发;我们的S7-200SMART PLC不支持doublefloat数据类型,需要转换成float型才能计算使用。 浮点数的定义 在编写转换程序之前,我们......
    4.1 为何要把浮点数转换为定点数呢? 这来源于项目中神经网络的需求,网络中大量的参数,如果全部用F32表示,一是占用空间大,二是读取效率不高。 如果我们可以将某些浮点数转换为定点数......
    西门子SCL高级语言之数据转换; (整数转浮点数 INT_TO_REAL) 我们在做项目中经常用到各种类型的数据,这就需要转换( CONVERT)指令来转换,由于博途数据转换......
    西门子S7-1200PLC数据处理指令:浮点数转整数指令;在S7-1200PLC中,除了在《西门子S7-1200PLC 处理处理指令:转换指令CONV》章节中分享的数据类型转换指令CONV之外,还可以使用浮点数转整数指令进行专门的转换......
    的数据。   DINT_TO_INT:将DINT类型的数据转成INT类型的数据。   INT_TO_REAL:将INT类型的数据转成REAL类型的数据。(仅在一些PLC品牌中支持)   2. 浮点数转换   将一个浮点数类型转换成另一个浮点数......
    修改设置的情况下,尝试过如下两种代码解决。一种是通过 sprintf 将浮点数转换成字符串输出,另一种是分解整数和小数部分,分别输出。第一种方法也是不可行的,只有分解可以。 代码如下: /* * cyang 2018/2......
    为双整数3.5  DI_BCD   双整数转换为BCD码3.6  DI_REAL  双整数转换为浮点数3.7  INV_I    整数的二进制反码3.8  INV_DI   双整数的二进制反码3.9......
    C51使用经验(2022-12-27)
    ();}} 三、将浮点数转化为字符数组笔者在编制应用程序时有这样的要求:将运算的结果(浮点数)存入EEPROM中。我们知道,浮点数在C语言中是以IEEE格式存储的,一个浮点数占用四个字节,例如浮点数......
    ();   }   }   三、将浮点数转化为字符数组   笔者在编制应用程序时有这样的要求:将运算的结果(浮点数)存入E2PROM中。我们知道,浮点数在C语言中是以IEEE格式存储的,一个浮点数......
    功能还可以加快开发时间。实时控制 (RTC) 系统通常与 MATLAB 协同开发,MATLAB 使用浮点数学进行建模和代码生成。前几代 dsPIC 需要在 MATLAB 的浮点和 DSC 的定点之间进行手动转换......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>