精华内容
下载资源
问答
  • 浮点数转定点数Verilog

    2014-08-25 10:40:15
    浮点数转定点数 FPGA Verilog
  • 【图像算法】浮点数转定点数

    千次阅读 2015-12-16 22:40:34
    这里对浮点数转定点数的技巧进行总结,不定期更新。1、浮点乘法定点乘法在介绍YUV色彩空间时,发现有一个很有趣的地方。发现 YUV444 RGB888 的部分,有一个整数优化运算。在这里有:Cr = Cr - 128 R = Y +Cr +...

    这里对浮点数转定点数的技巧进行总结,不定期更新。

    1、浮点乘法转定点乘法

    在介绍YUV色彩空间时,发现有一个很有趣的地方。

    发现 YUV444 转 RGB888 的部分,有一个整数优化运算。

    这里写图片描述

    在这里有:

    Cr = Cr - 128
    R = Y +Cr +(Cr>>2)+(Cr>>3)+(Cr>>5

    可以看出,由原先的

    1.402 x ( Cr -128 )

    转换为右移代替浮点数乘法。

    具体转换为:

    Cr = Cr -128
    Cr >>2 = Cr x 0.25 ;  
    Cr >>3 = Cr x 0.125 ;  
    Cr >>5 = Cr x 0.03125 ;  
    0.25 + 0.125 + 0.03125  = 0.40625 约等于 0.402

    后续在整数乘法时,可以采用这样的方式,右移代替小数点的乘法。

    展开全文
  • 浮点数定点数的相互转换程序,描述了浮点数定点数的内在联系;浮点数的约点以及定点数浮点数的相互转化。
  • 与之相对,那定点数就是小数点位置固定不变的数了。 浮点数一般由三部分组成,其分别为【符号位S】、【阶码E】、【尾数M】,此外还有一个重要的组成部分为【基数R】,不过一般基数固定为2,因此我们不做过多讨论。 ...

    1、浮点数理解

    在平常的代码编写中大家经常用到float 32、double 64等,但是否有深入的去了解一下这类数据是怎么表示的呢?今天我们就去学习浮点数的表示方法,以及其优缺点。

    首先浮点数为什么叫浮点数呢?因为浮点数的小数点的位置不是固定不变的,是浮动的,所以就称之为浮点数;与之相对,那定点数就是小数点位置固定不变的数了。

    浮点数一般由三部分组成,其分别为【符号位S】、【阶码E】、【尾数M】,此外还有一个重要的组成部分为【基数R】,不过一般基数固定为2,因此我们不做过多讨论。

    当前的浮点数使用IEEE754标准,以float 32为例,其在计算机中的存储格式如下:

     其中符号位占1位、阶码位占8位、尾数位占23位

    【符号位S】、【阶码E】、【尾数M】与该数所表示数值的关系见以下公式:

    其中1.M涉及一个知识点----“存储数据规格化”,即要求【尾数M】的绝对值需要大于基数的倒数,公式表达如下:,当R为2时,。因此就规定,尾数的第一位为1;因为都为1,所以在存储时该位会被省略,但在计算时我们需要将它加上。

    eg1:使用32位浮点数表示小数-3.75

    所以:【符号位S = 1】、【阶码E = 1000 0000】、【尾数M = 1110 0000 0000 0000 0000 0000】

    2、定点数理解

    定点数即为小数点固定的数,以常见的int型数据,即为小数点位于末尾的定定点数。与浮点数相比,定点数最大的特点是“乘以基数可以通过对数据的移位进行操作(像int数乘2可以左移1位实现)”,但由于浮点数不同位有不同的含义,无法通过移位进行操作。

    eg2:使用8位定点数表示小数-0.75(规定8位定点数由1个符号位,0个整数位,7个小数位组成)

    表示的最大正数:0111 1111 即为:0.5+0.25+0.125+0.0625+0.03125+0.015625+0.0078125 = 0.9921875

    表示的最大负数:1111 1111 即为:-(0.5+0.25+0.125+0.0625+0.03125+0.015625+0.0078125)= - 0.9921875

    表示的最小正数:0000 0001 即为:0.0078125 

    表示的最小负数:1000 0001 即为:- 0.0078125

    表示精度为:

    定点数缺点:定点数表示法简单直观,但是数值表示的范围太小,运算时容易产生 溢出。因此在计算时采用表示范围较大的数存储中间变量。

    3、浮点数与定点数相互转换

    假定8位定点数由1个符号位,4个整数位,3个小数位组成(即Q定标3)

    eg3:使用定标为Q3的8位定点数表示浮点数x=0.6

    用二进制表示4为:0 0000 100

    eg4:将Q3表示的8位定点数0 0000 100转换为浮点数

    从以上的eg3与eg4可以看出,浮点数在转换为定点数的过程中,产生了误差(0.6变为了0.5)。

    为了最大限度的保持数的精度,在将浮点数转化为定点数前,可以采用四舍五入的方法,即在进行向下取整运算前,先加上0.5,即

    重复计算eg3与eg4,;可以明显看出,数据的表示误差减小了。(0.6变为了0.625)

     

     

    注:①本文受限于笔者基础知识水平,在以上分析时,未考虑反码与补码的问题;

           ②“存储数据规格化”相关知识理解较浅

     

    若读者发现以上文章有错误,麻烦在评论区指出,我会积极更正。

    如果认为该文章有帮助,请点个赞,您的点赞是对我最大的鼓励。

    展开全文
  • 浮点数定点数的相互转换(浮点数量化为定点)

    万次阅读 多人点赞 2018-09-29 12:40:07
    目录这篇博客将要讨论什么?...定点数定点数->浮点数 这篇博客将要讨论什么? 浮点数的表示法 定点数的表示法 浮点数->定点数 定点数->浮点数 ...

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

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

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

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

    • 浮点:小数点非固定的数,可表示数据范围较广,整数,小数都可表示。包含float,double;
    • 定点:小数点固定,可表示整数,小数。int本质是小数点位于末尾的32位定点数而已;

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

    2. 浮点数的表示法

    浮点数以float为例讨论。

    2.1 IEEE 754标准

    规定浮点数格式为: V = ( − 1 ) s × M × 2 E V = (-1)^s×M×2^E V=(1)s×M×2E

    • s表示符号位,当s=0,V为正数;当s=1,V为负数
    • M表示尾数, 2 > M > = 1 2>M>=1 2>M>=1
    • E表示阶码

    将其封装到32位的字中:

    符号位阶码尾数
    1823

    根据32位数计算为十进制: V = ( − 1 ) s × ( 1. M ) × 2 ( E − 127 ) V = (-1)^s×(1.M)×2^{(E-127)} V=(1)s×(1.M)×2(E127)

    可以得出以下结论:

    • 浮点数表示比整型那些更为复杂。如int中0…01000表示8,0…01001表示9,而浮点不能这样简单。
    • 浮点数不能移位。因为各个位有特殊含义。像int数乘2可以左移1位实现。

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

    我们说浮点数的小数点不是固定的,是浮动的,那么如何理解?通过例子可直观体验。

    符号阶码尾数
    00111001

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

    符号阶码尾数
    00111010

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

    符号阶码尾数
    01000001

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

    3. 定点数的表示法

    对于计算机来说,浮点定点的概念是看不见的,因为它只能看到:0…00001110,至于它表示多少,是逻辑层面的设置。你如果让它是int那就按照int表示法对每个位赋予意义,如果你让它是float就按照float表示法赋予意义。

    对于 00011100 00011100 00011100表示的定点数:

    • 如果我们设定小数点是位于最后一位的,即 00011100. 00011100. 00011100.则其表示28
    • 若设定小数点位于后三位的,即 00011.100 00011.100 00011.100则其表示3.50
    • 若设定小数点位于后四位的,即 0001.1100 0001.1100 0001.1100则其表示1.75

    可以看到:

    • 小数位数越多,表示的精度越高。若小数点后有n位,则其表示的最大精度为 1 / ( 2 n ) 1/(2^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称为量化系数。该过程称为量化。

    (我们总是将非离散值量化到离散值空间,处理更为简单)

    i n t 8 = f l o a t 32    ∗    2 ( 3 ) int8 = float32 \,\,* \,\, 2^{(3)} int8=float322(3)

    如: i n t 8 ( 10 ) = f l o a t 32 ( 1.231 )    ∗    2 ( 3 ) int8(10) = float32(1.231) \,\,* \,\, 2^{(3)} int810=float321.2312(3)

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

    该过程称为反量化。

    f l o a t 32 = i n t 8    /    2 ( 3 ) float32 = int8 \,\,/ \,\, 2^{(3)} float32=int8/2(3)

    如: f l o a t 32 ( 1.250 ) = i n t 8 ( 10 )    /    2 ( 3 ) float32(1.250) = int8(10) \,\,/ \,\, 2^{(3)} float321.250=int810/2(3)

    4.4 note

    可以这样理解:量化系数 n n n 决定了我们逻辑上认为01序列中可表示的单位值 1 / ( 2 n ) 1/{(2^n)} 1/(2n),CPU读取的数字表示有多少份单位值。

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

    量化系数CPU读取值单位值表示逻辑值
    3280.1253.5
    2280.2507.0

    同样的int8数,因为量化系数的不同,代表着不同的f32值。

    还有个note:

    • 定点数加减时需要量化系数相同,其值有可能溢出,需要更大定点数来暂存中间值;
    • 两个定点数乘法后如果需要转化为f32,则反量化系数变为 2 ∗ n 2*n 2n

    5. 总结

    可以看到:

    • 浮点数和定点数的转换是一种映射。将较为密集的数据空间(F32)映射到较为稀疏的空间(int8);
    • 定点数的小数点实际中是没有的,这只是我们逻辑上的一种设定。01序列是一样的,CPU读取都是相同的,因为我们逻辑上小数点的不同位置,我们认为它代表的值是不同的;
    展开全文
  • 浮点数定点数

    2020-10-15 11:29:54
    这里记录一些浮点数定点数的知识

    这里记录一些浮点数和定点数的知识:
    参考:
    https://blog.csdn.net/tan_jianhui/article/details/2303988

    1. 如果小数点的位置事先已有约定,不再改变,此类数称为“定点数”。相比之下,如果小数点的位置可变,则称为“浮点数”。
    定点数: 常用的定点数有两种表示形式:如果小数点位置约定在最低数值位的后面,则该数只能是定点整数;如果小数点位置约定在最高数值位的前面,则该数只能是定点小数。
    浮点数:浮点数表示法来源于数学中的指数表示形式,如193可以表示为0.193x10^31.93x10^2等。一般地,数的指数形式可记作:N=M x R^C 其中,M称为“尾数”,C称为“阶码”。在存储时,一个浮点数所占用的存储空间被划分为两部分,分别存放尾数和阶码。尾数部分通常使用定点小数方式,阶码则采用定点整数方式。尾数的长度影响该数的精度,而阶码则决定该数的表示范围.
    第一个域为符号域:其中 0 表示数值为正数,而 1 则表示负数。
    第二个域为指数域:对应于我们之前介绍的二进制科学计数法中的指数部分。其中单精度数为 8 位,双精度数为 11 位。以单精度数为例,8 位的指数为可以表达 0 到 255 之间的 255 个指数值。但是,指数可以为正数,也可以为负数。为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127,而双精度数的偏差值为 1023。比如,单精度的实际指数值 0 在指数域中将保存为 127;而保存在指数域中的 64 则表示实际的指数值 -63。 偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。我们不久还将看到,实际的指数值 -127(保存为 全 0)以及 +128(保存为全 1)保留用作特殊值的处理。这样,实际可以表达的有效指数范围就在 -127 和 127 之间。在本文中,最小指数和最大指数分别用 emin 和 emax 来表达。
    第三个域为尾数域:其中单精度数为 23 位长,双精度数为 52 位长。除了我们将要讲到的某些特殊值外,IEEE 标准要求浮点数必须是规范的。这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。比如对于单精度数而言,二进制的 1001.101(对应于十进制的 9.625)可以表达为 1.001101 × 2^3,所以实际保存在尾数域中的值为 00110100000000000000000,即去掉小数点左侧的 1,并用 0 在右侧补齐。
    浮点数与实数的转换:
    现在我们已经明白了浮点数的 IEEE 表达方式。我们来做些实数和浮点数之间的变换练习以加深理解。在这些练习中,你还会发现一些围绕浮点数运算的令人吃惊的事实。
    首先我们来看看事情简单的一面,从浮点数变换到实数。理解了浮点数的格式,做这个练习并不难。假定我们有一个 32 位的数据,用十六进制表示为 0xC0B40000,并且我们知道它实际上是一个单精度的浮点数。为了得到该浮点数实际表达的实数,我们首先将它变换为二进制形式:
    C 0 B 4 0 0 0 0
    1100 0000 1011 0100 0000 0000 0000 0000
    接着按照浮点数的格式切分为相应的域:
    1 10000001 01101000000000000000000
    符号域 1 意味着负数;指数域为 129, 意味着实际的指数为 2 (减去偏差值 127);尾数域为 01101 意味着实际的二进制尾数为 1.01101 (加上隐含的小数点前面的 1)。所以,实际的实数为:
    -1.01101 × 2^2
    -(2^0 + 2^-2 + 2^-3 +2^-5) × 2^2 = -5.625

    从实数向浮点数变换稍微麻烦一点。假定我们需要将实数 -9.625 表达为单精度的浮点数格式。方法是首先将它用二进制浮点数表达,然后变换为相应的浮点数格式。
    首先,将小数点左侧的整数部分变换为其二进制形式,9 的二进制性形式为 1001。处理小数部分的算法是将我们的小数部分乘以基数 2,记录乘积结果的整数部分,接着将结果的小数部分继续乘以 2,并不断继续该过程:
    0.625 × 2 = 1.25 1
    0.25 × 2 = 0.5 0
    0.5 × 2 = 1 1
    0
    当最后的结果为零时,结束这个过程。这时右侧的一列数字就是我们所需的二进制小数部分,即 0.101。这样,我们就得到了完整的二进制形式 1001.101。用规范浮点数表达为 1.001101 × 2^3。
    因为是负数,所以符号域为 1。指数为 3,所以指数域为 3 + 127 = 130,即二进制的 10000010。尾数省略掉小数点左侧的 1 之后为 001101,右侧用零补齐。最终结果为:
    1 10000010 00110100000000000000000
    最后可以将浮点数形式表示为十六进制的数据如下:
    1100 0001 0001 1010 0000 0000 0000 0000
    C 1 1 A 0 0 0 0
    最终结果为 0xC11A0000。

    很简单?等等!你可能已经注意到了,在上面这个我们有意选择的示例中,不断的将产生的小数部分乘以 2 的过程掩盖了一个事实。该过程结束的标志是小数部分乘以 2 的结果为 1,不难想象,很多小数根本不能经过有限次这样的过程而得到结果(比如最简单的 0.1)。我们已经知道浮点数尾数域的位数是有限的,为此,浮点数的处理办法是持续该过程直到由此得到的尾数足以填满尾数域,之后对多余的位进行舍入。换句话说,除了我们之前讲到的精度问题之外,十进制到二进制的变换也并不能保证总是精确的,而只能是近似值。事实上,只有很少一部分十进制小数具有精确的二进制浮点数表达。再加上浮点数运算过程中的误差累积,结果是很多我们看来非常简单的十进制运算在计算机上却往往出人意料。这就是最常见的浮点运算的"不准确"问题。参见下面的 Java 示例:
    System.out.print(“34.6-34.0=” + (34.6f-34.0f));
    这段代码的输出结果如下:
    34.6-34.0=0.5999985
    产生这个误差的原因是 34.6 无法精确的表达为相应的浮点数,而只能保存为经过舍入的近似值。这个近似值与 34.0 之间的运算自然无法产生精确的结果

    展开全文
  • FPGA浮点数定点数的相互转换

    千次阅读 2020-08-25 13:43:51
    FPGA浮点数定点数的相互转换 https://blog.csdn.net/baidu_34971492/article/details/106659792
  • 浮点数定点数转换关系

    千次阅读 2013-05-22 22:01:23
    DSP芯片的数以2的补码形式表示,每个16位数用一个符号位来表示的正负,其余15位表示数值的大小。 数的定标有Q表示法与S表示法两种。其中Q的下标的数表示小数点右边的几位。...定点数x转换为浮点数:x(q)=x/(2^Q).
  • mysql 浮点数定点数

    2019-10-08 14:08:53
    浮点数一般用于表示含有小数部分的数值。当一个字段被定义为浮点类型后,如果插入数据的精度...定点数不同于浮点数定点数实际上是以字符串形式存放的,所以定点数可以更加精确的保存数据。 mysql> CREATE TAB...
  • 浮点数定点数的加减乘除.pdf
  • MySQL浮点数定点数

    2018-08-27 13:01:00
    MySQL 分为两种方式:浮点数定点数浮点数包括 float(单精度)和 double(双精度),而定点数则只有 decimal 一种表示。定点数在 MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据...
  • MySQL浮点数定点数

    2018-01-22 09:35:00
    浮点数一般用于表示含有小数部分的数值。当一个字段被定义为浮点类型后,如果插入...定点数不同于浮点数定点数实际上是以字符串形式存放,所以定点数可以更精确地保存数据。如果实际插入的数值精度大于实际定义的...
  • 浮点数定点数 为了能够引起大家的重视,在介绍浮点数定点数以前先让大家看一个例子: mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2)); Query OK, 0 rows affected (0.29 sec) mysql>...
  • 浮点数定点数

    2021-07-11 09:14:54
    1.定点数浮点数的区别: 2.无符号数: 3.通常只有无符号整数,而没有无符号小数; 4.有符号数: (1)原码: 原码的范围: (2)反码: (3)补码: 注意:由于负0在求补码时,最高位会被丢弃,因此-0和+0...
  • 为了能够引起大家的重视,在介绍浮点数定点数以前先让大家看一个例子: mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2)); Query OK, 0 rows affected (0.29 sec) mysql> insert into test ...
  • Xinlinx开发工具对浮点数定点数的支持学习笔记System Generator对浮点数定点数的支持1. System Generator对浮点数的支持SysGen对定点数的支持 System Generator对浮点数定点数的支持 1. System Generator对...
  • FPGA中浮点数定点数的转化原理与转化方法(并使用乘法器进行两个定点数的相乘)基础知识什么是浮点数定点数浮点数转换为定点数浮点数定点数的相乘在quartusⅡ中使用乘法器完成两个定点数相乘IP核的使用.v文件...
  • matlab 浮点数-定点数相互转换

    万次阅读 2019-01-11 09:48:12
    浮点转换为定点的过程在Matlab中称为量化,使用quantizer和quantize两个函数完成。 (1)、quantizer用于定义数据的量化属性 (2)、quantize则按照quantizer定义的量化属性量化浮点数据。 下面举一个例子: x ...
  • 浮点数定点数

    2017-04-14 09:58:26
    整数可以看做是一种特殊的定点数,即小数点在末尾.8086/8088中没有浮点数处理指令,不过从486起,CPU内置了浮点数处理器,可以执行浮点运算.一般的浮点数有点象科学计数法,包括符号位、指数部分和尾数部分. 浮点数是指...
  • 浮点数定点数的相互转换

    千次阅读 2020-02-19 12:41:57
    浮点数量化为定点1. 这篇博客将要讨论什么? 说来惭愧,作为计算机科班出身的人,计算机基础知识掌握并不扎实,这里的基础指的是计算机体系结构中的内容,诸如数据的表示和处...
  • MySQL浮点数定点数类型

    千次阅读 2017-05-28 15:27:42
    MySQL中,存储小数使用的浮点数定点数类型。 浮点数有两种,单精度浮点类型——FLOAT,双精度浮点数类型——DOUBLE。 定点数只有DECIMAL类型。FLOAT占用:4字节 有符号:-3.402823466E+38~-1.175494351E-38 无...
  • 浮点数定点数 为了能够引起大家的重视,在介绍浮点数定点数以前先让大家看一个例子: mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2)); Query OK, 0 rows affected (0.29 sec) mysql> insert ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,456
精华内容 6,982
关键字:

浮点数转定点数