0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于浮点数和定点数的相互转换技术探讨

454398 来源:FPGA开源工作室 作者:FPGA开源工作室 2020-10-09 16:28 次阅读

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7553

    浏览量

    88798
  • 浮点数
    +关注

    关注

    0

    文章

    61

    浏览量

    15922
收藏 人收藏

    评论

    相关推荐

    浮点数定点数

    本帖最后由 gk320830 于 2015-3-5 23:17 编辑 数制,浮点数定点数的文档,上数电时老师给的。有兴趣的同学可以来看看
    发表于 03-27 21:31

    【安富莱——DSP教程】第7章 DSP定点数浮点数(重要)

    第7章DSP定点数浮点数(重要) 本期教程主要跟大家讲解一下定点数浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。
    发表于 06-03 11:47

    labview里单精度浮点数和十六进制数如何相互转换

    我需要将一个单精度的浮点数(如0.33)转换为十六进制数然后通过串口发送,同时还需将串口读取的十六进制数转换为单精度浮点数。 求问在labview里如何使
    发表于 10-14 11:04

    第7章 DSP定点数浮点数

    转dsp系列教程本期教程主要跟大家讲解一下定点数浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。 7.1 定点数浮点数
    发表于 09-22 13:02

    请问ADSP-21469的汇编指令集ISA/VISA中有没有专门用来进行浮点数定点数转换的指令?

    得到的ADC数据需要进行定点数浮点数转换,为了节省开销,想使用汇编程序进行定点浮点之间的转换
    发表于 07-24 07:21

    verilog程序定点数的资料

    verilog程序中需要用到定点数,用浮点数太复杂。。。有谁有关于定点数比较系统的资料吗。。。我找到黑金的教程,是关于
    发表于 03-27 06:35

    DSP功能函数-定点数互转

    第17章 DSP功能函数-定点数互转本期教程主要讲解功能函数中的Q7,Q15和Q31分别向其它类型数据转换。目录第17章 DSP功能函数-定点数互转
    发表于 08-11 08:04

    功能函数中的浮点数转换定点数

    第16章 DSP功能函数-数据拷贝,数据填充和浮点定点本期教程主要讲解功能函数中的数据拷贝,数据填充和浮点数转换定点数。目录第16章 D
    发表于 08-17 07:37

    定点数浮点数的区别是什么

    定点数浮点数的区别目的:理解定点数浮点数在傅里叶变换(FFT)的实际应用中的选择单片机中如果需要进行一定的运算(常见的傅里叶变换)时,需要在不同情况下对AD采集的数据进行一定的处理
    发表于 02-21 07:22

    请问ADSP-21469的汇编指令集ISA/VISA中有没有专门用来进行浮点数定点数转换的指令?

    得到的ADC数据需要进行定点数浮点数转换,为了节省开销,想使用汇编程序进行定点浮点之间的转换
    发表于 11-29 08:03

    功能:双字节十六进制定点数转换成格式化浮点数

    功能:双字节十六进制定点数转换成格式化浮点数 入口条件:双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。
    发表于 01-19 22:45 3233次阅读

    在FPGA里浮点数定点数表示法原理展示

    浮点数定点数表示法是我们在计算机中常用的表示方法 所以必须要弄懂原理,特别是在FPGA里面,由于FPGA不能像在MCU一样直接用乘除法。 首先说一下简单的定点数定点数是克服整数表示
    发表于 11-18 02:15 8844次阅读
    在FPGA里<b class='flag-5'>浮点数</b>与<b class='flag-5'>定点数</b>表示法原理展示

    单片机浮点数运算的源码设计

    单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。本文详细介绍了浮点数在单片机中的表示方式和汇编子程序,浮点数定点数加减法要困难,但是克服了定点数表示范围小
    的头像 发表于 03-07 15:19 1w次阅读
    单片机<b class='flag-5'>浮点数</b>运算的源码设计

    定点数浮点数在STM32单片机中使用傅里叶(FFT)变换的理解

    定点数浮点数的区别目的:理解定点数浮点数在傅里叶变换(FFT)的实际应用中的选择单片机中如果需要进行一定的运算(常见的傅里叶变换)时,需要在不同情况下对AD采集的数据进行一定的处理
    发表于 12-24 19:22 16次下载
    <b class='flag-5'>定点数</b>和<b class='flag-5'>浮点数</b>在STM32单片机中使用傅里叶(FFT)变换的理解

    定点数浮点数的概念 浮点数二进制序列与指数表达式之间的转化

    的缺点:由于小数点位置固定不变,定点数所表示的数的范围非常有限,不能同时表达特别大或特别小的数,所以才出现了浮点数,以此来扩充数的范围,同时浮点数也广泛应用于精度要求高的场合。简单的理解浮点数
    的头像 发表于 08-22 16:06 8449次阅读
    <b class='flag-5'>定点数</b>和<b class='flag-5'>浮点数</b>的概念 <b class='flag-5'>浮点数</b>二进制序列与指数表达式之间的转化