精华内容
下载资源
问答
  • 浮点数表示方法

    万次阅读 多人点赞 2018-12-11 21:01:06
    浮点数表示  浮点数是一种 公式化 的表达方式,用来近似表示实数,并且可以在表达范围和表示精度之间进行权衡(因此被称为浮点数)。 浮点数通常被表示为: N=M×R^E 比如: 12.345=1.2345×10^1 其中,...

    之前的一些工作当中碰到了很多有关浮点数的问题,比如浮点数的表达范围、表达精度、浮点数的存储方式、浮点数的强制类型转换等等,因此感觉有必要系统了解一下有关浮点数的问题。

    浮点数表示 

    浮点数是一种 公式化 的表达方式,用来近似表示实数,并且可以在表达范围和表示精度之间进行权衡(因此被称为浮点数)。

    浮点数通常被表示为:

    N=M×R^E

    比如: 12.345=1.2345×10^1

    其中,M(Mantissa)被称为浮点数的 尾数 ,R(Radix)被称为阶码的 基数 ,E(Exponent)被称为阶的 阶码 。计算机中一般规定R为2、8或16,是一个确定的常数,不需要在浮点数中明确表示出来。

    因此,在已知标准下,要表示浮点数,

    一是要给出尾数M的值,通常用定点小数形式表示,它决定了浮点数的表示精度,即可以给出的有效数字的位数。

    二是要给出阶码,通常用定点整数形式表示,它指出的是小数点在数据中的位置,决定了浮点数的表示范围。因此,在计算机中,浮点数通常被表示成如下格式:(假定为32位浮点数,基为2,其中最高位为符号位)

    浮点数

    浮点数的规格化表示 

    按照上面的指数表示方法,一个浮点数会有不同的表示:

    0.3×10^0;0.03×10^1;0.003×10^2;0.0003×10^3;

    为了提高数据的表示精度同时保证数据表示的唯一性,需要对浮点数做规格化处理。

    在计算机内,对非0值的浮点数,要求尾数的绝对值必须大于基数的倒数,即|M|≥1/R。

    即要求尾数域的最高有效位应为1,称满足这种表示要求的浮点数为规格化表示:把不满足这一表示要求的尾数,变成满足这一要求的尾数的操作过程,叫作浮点数的规格化处理,通过尾数移位和修改阶码实现。

    比如,二进制原码的规格化数的表现形式:(0正1负)

    正数 0.1xxxxxx

    负数 1.1xxxxxx

    注意,尾数的最高位始终是1,因此我们完全可以省略掉该位。

    至此,我们引入IEEE754 标准,该标准约束了浮点数的大部分使用设置:(尾数用原码;阶码用“移码”;基为2)

    (1) 尾数用原码,且隐藏尾数最高位。

    原码非0值浮点数的尾数数值最高位必定为 1,因此可以忽略掉该位,这样用同样多的位数就能多存一位二进制数,有利于提高数据表示精度,称这种处理方案使用了隐藏位技术。当然,在取回这样的浮点数到运算器执行运算时,必须先恢复该隐藏位。

    (2) 阶码使用“移码”,基固定为2

    如下图的32bit浮点数和64bit浮点数,从最高位依次是符号位、阶码和尾数 

    float
    于是,

    一个规格化的32位浮点数x的真值为:

    x=(−1)^s×(1.M)×2E^−127

    一个规格化的64位浮点数x的真值为:

    x=(−1)^s×(1.M)×2E^−1023

    下面举一个32位单精度浮点数-3.75表示的例子帮助理解:

    (1) 首先转化为2进制表示

    −3.75=−(2+1+1/2+1/4)=−1.111×2^1

    (2) 整理符号位并进行规格化表示

    −1.111×2^1=(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1

    (3) 进行阶码的移码处理 
    (−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1
     
    =(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^(128−127)

    于是,符号位S=1,尾数M为1110 0000 0000 0000 0000 000
    阶码E为12810=1000 00002
    ,则最终的32位单精度浮点数为

    1 1110 0000 0000 0000 0000 000 1000 0000

    浮点数的表示范围 

    通过上面的规格化表示,我们可以很容易确定浮点数的表示范围:

    float range

    既然有表示范围,那肯定也有不能表示的数值: 
    首先来说明溢出值,如下图: 

    float overflow


    (1)无穷值:

    如果指数E=11111111(2)=255(10)
    且尾数M=0
    ,则根据符号位S分别表示+∞
    和−∞
    。因此,一个有效的32位浮点数其指数最大只能为254。

    此外,无穷具有传递性,比如

    (+∞) + (+7) = (+∞)

    (+∞) × (−2) = (−∞)

    (+∞) × 0 = NaN

    (2)零值:

    如果指数E=0
    且尾数M=0
    时,表示机器0.需要注意的是,这里的0也是有符号的,在数值比较的时候 +0=−0
    ; 但在一些特殊操作下,二者并不显相等,比如log(x), 1/+0≠1/−0。

    此外,处于负下溢出和负上溢出之间的数值会被直接归为0。

    (3)NAN:

    如果E=0,且尾数M≠0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,如0/0, ∞×0, sqrt(−1);SNAN一般被用于标记未初始化的值,以此来捕获异常。

    浮点数的表示精度

    一般提到浮点数的精度(有效位数)的时候,总是会出现 float的有效位为6~7位, double的有效位为15~16位 。

    下面以float为例,解释一下有效位数是怎样来的。

    有效位数只和规格化浮点数的尾数部分有关,而尾数部分的位数是23位,因此我们首先列出下表

    float overflow

    由上面的表格可以看出:

    2^−23 和 2^−22 之间是存在间隔的,即0.0000001和0.0000002之间的小数我们是没有办法描述的,因此23位尾数最多只能描述到小数点后第7位;此外,我们通过四舍五入可以很容易发现0.0000003=0.0000004=2^−23+2^−22
    , 这表明第7位有效数字只是部分准确。而第6位及之前的都是可以准确描述的,因此我们说float的有效位为6~7位。

     参考资料 

    (1) WIKI 词条 “Floating Point”: https://en.wikipedia.org/wiki/Floating_point

    (2) WIKI 词条 “IEEE floating point”: https://en.wikipedia.org/wiki/IEEE_floating_point

    (2) 浮点异常值:NAN,QNAN,SNAN: 
    http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html
    --------------------- 
    作者:shuzfan 
    来源:CSDN 
    原文:https://blog.csdn.net/shuzfan/article/details/53814424 

    展开全文
  • 其中,对于浮点数尽管当前应用最为广泛的是基于IEEE 754所设计的浮点数表示方法,Xilinx(忘记Altera中是否有对应的IP核)的IP核中也提供了相应的设计方法,但其表示方法缺乏FPGA设计应有的灵活性,而且资源消...

    欢迎FPGA工程师加入官方微信技术群

    1. 概述

    基于FPGA实现各种设计的首要前提是理解并掌握数字的表示方法,计算机中的数字表示方法有两种:定点数表示法和浮点数表示方法。其中,对于浮点数尽管当前应用最为广泛的是基于IEEE 754所设计的浮点数表示方法,Xilinx(忘记Altera中是否有对应的IP核)的IP核中也提供了相应的设计方法,但其表示方法缺乏FPGA设计应有的灵活性,而且资源消耗相对严重,因此可以根据应用的需要,设计好基于FPGA实现的自定义浮点数。

    2. 定点数表示

    定点数大类上可分为有符号数和无符号数,需要清楚的是,无论是计算机还是FPGA,其底层并没有无符号数、有符号数的概念,底层只是一大串二进制数据在进行运算(在底层就是一大堆寄存器处于开关的工作状态中)。定点数的第一印象容易给人产生是用来表示整数的印象,然而无论是整数还是小数都可以采用定点数来表示,同理整数和小数的概念也是人为规定上去的,FPGA本身不会理解那一大串二进制数是表示整数还是小数,具体的运算法则由编程人员规定好。

    1.1 Qm.n的表示方法

    本文采用最广泛使用的补码表示形式(默认都懂其他的原码表示和反码表示形式),对应的用来表示有符号数。人为定义小数点的位置。

    采用Qm.n量化表示定点数,其中m用来表示小数点前的位宽,包括一位符号位和m-1位整数位,n表示小数位宽。如16位有符号整数可以表示成Q16.0,用来表示小于1的小数则可以表示成Q1.15。对于Qm.n的表示格式,其范围表示如下:

    5c902ffcfdec6080622094109be6769d.png

    例如,1110整数则表示为Q4.0:(-2^4 + 2^3 + 2^2 +0)/2^0= -2,1110有两位小数则表示为Q2.2:(-2^4+2^3+2^1+0)/2^2 = -0.5。下表对应表示16位二进制补码表示的数的范围。

    fba3aca9e765831fd91f3dcb842552f4.png

    1.1 浮点数的定点化

    浮点数的定点化涉及到量化方法。量化的过程可以表示为:

    a8f9fbffade2f810b0d2c17600dfd667.png

    量化方法主要有两种:尾部截断舍弃法和尾部四舍五入法。

    对于尾部截断舍弃法,顾名思义则是丢弃掉尾部不能表示的部分。假设将浮点数表示成8位Q3.5的定点数,则表示过程如下(对3.2和-3.2进行定点化):

    [3.2] = floor(3.2*2^5) = floor(102.4) = 102 = 01100110

    [-3.2] = floor(-3.2*2^5) = floor(-102.4) = -103 = 10011001

    采用MATLAB可以做如下实现:

    dec2bin(floor(3.2*2^5), 8) = 01100110

    dec2bin(2^8+floor(-3.2*2^5), 8) = 10011001

    对于四舍五入法,则对应的过程表示如下:

    [3.2] = round(3.2*2^5) = round(102.4) =102 = 01100110

    [-3.2]=round(-3.2*2^5) = round(-102.4)= -102 = 10011010

    采用MATLAB可以做如下实现:

    dec2bin(round(3.2*2^5), 8) = 01100110

    dec2bin(2^8+round(-3.2*2^5), 8) = 10011010

    由于采用四舍五入方法还需要进行尾部数据的判断,因此通常使用中,如无特别需求,多采用尾部截断舍弃法。

    3. 浮点数表示

    在FPGA运算中,浮点数无论是表示方法、资源占用还是运算法则都比定点数复杂得多。但另一方面,基于FGPA 的实现的算法性能严重依赖于算法的数值精度表示,很多时候在信号处理中,数值的动态范围过大,采用一般的定点算法往往无法满足这样大的动态范围,而且定点算法经过精打细算之后,算法的小数位和整数位是固定的,表示的范围同样是固定的,无法在作调节,后续一旦有所修改,整个算法实现过程需要重新进行计算仿真设计,这样的后期维护成本太高,简直是牵一发而动全身。对于cpu处理器来说,浮点格式基本上会采用IEEE 754制定的标准单精度或双精度格式。而对于FPGA来说,由于其强大的灵活性,虽然也是按照IEEE 754标准实现浮点数表示,但是却可以对尾数和指数的位宽作修改。

    IEEE 754定制的浮点格式在存储方面有着很完美的形式,可以最大限度表示数的动态范围的同时,减少存储资源,但是实际参与运算时并没那么直接,需要经过相应的换算。因此可利用FPGA的灵活性,自定义浮点数格式。

    3.1 自定义浮点格式表示

    不像根据IEEE 754[45] 标准所设计的32-bit和64-bit标准浮点格式,本论文的自定义浮点由位宽可配置的指数(Exponent)和尾数(Mantissa)两部分组成。指数和尾数部分都是有符号定点数。作为一个例子,我们采用标准双精度浮点格式和自定义浮点格式之间进行对比。标准双精度浮点数可以表示如下等式:

    38ccdc7b80641f23e2dc8b1f9eaf8995.png

    其中1.f表示52-bit尾数;Exp 表示存储起来的指数值;bias 表示偏置,对于标准双精度浮点,改值为1023;Exp-bias 表示实际的指数值。标准格式表示如图(a) 所示。然而,对于自定义浮点格式表示的数的实际值如下:

    d2e67ef4256f99e166a9d567ac4edd3b.png

    其中,Man 表示的尾数是52-bit有符号定点数,表示的实际值为0.1b49b48...b2b1b0 或者1.0b49b48...b2b1b0。而Exp 表示实际指数值。具体格式表示如图(b)所示。

    7d1a97725b2d72e62f30980b452db91c.png

    自定义浮点算法的其中一个优点是指数部分和尾数部分的位宽都是可配置的,设计者可以在算法精度要求和资源消耗方面进行权衡。而现存的由XILINX 提供的浮点运算IP 核是基于IEEE 754标准的,在每一次四则运算之后(如加法或乘法之后)都会进行一个格式化运算。而格式化运算占比的硬件资源消耗很大。无疑,如果存在多次连续加法运算或者乘加运算,这样的运算方式是资源消耗严重的。而本文所提出的自定义浮点算法则是整合的乘加运算和连续加法运算,尽量减少格式化操作,从而减少资源消耗。

    1.1 定点数转自定义浮点格式

    相比较于标准浮点格式的转换,定点数转成上文描述的自定义浮点格式相对来说简单许多,只需要经过简单的规格化,假设定点数为Qm.n,将其转换为指数位宽为E,尾数位宽为M,其过程可以描述如下:

    输入:定点数Qm.n,则初始指数值为m,尾数Q1.(m+n-1);

    规格化:计算符号位个数,假设计算得符号位个数为k;

    输出:指数输出值为m-k,尾数从m+n-k作为最高位开始截位,截取M位,如果不够长,则从最低位开始补零,补足到M位长度输出。

    这里唯一需要再次说明的是,如何计算符号位的个数,最简单的方法就是采用一个for循环,for循环里边使用一个计数器(初始值为1)和比较判断器,从次高位开始与最高位做比较,如果相同(同为1或者同为0),则计数器加1,以此类推下去。这里使用MATLAB,按照比特级别仿真,打包成一个函数,如下:

    function k = dupSign_cal(u)%  u: 定点数输入
    % k:计算符号位个数
    bit_len = get(u, 'WordLenght');
    SignBit = bitget(u, bit_len);
    count = 1;
    for i = bit_len-1:-1:1
    if bitget(u, i) == SignBit
    count = count+1;
    else
    break;
    end
    end

    当然,无论是verilog里边的for循环还是vhdl里边的for循环,并非软件中for的概念意义,实际上FPGA综合时会将for循环全部展开,因此这里如果定点数太长,则for循环不但消耗的资源多,而且非常容易造成时序不过关(想想在规定的一个或两个时钟里边完成几十比特一比特一比特的比对)。因此如果定点位宽太长,则应该想更多的办法来完成该过程,FPGA节省时间的方法无外乎增加资源,一个for循环不行,并行多个for循环嘛。

    debdf35a0f89745724de3299335f205e.png

    欢迎通信工程师和FPGA工程师关注公众号

    b69d685226907f5d98582547e505bce8.png

    FPGA微信技术群

    欢迎大家加入全国FPGA微信技术群,这里有一群热爱技术的工程师,在这里可以一起交流讨论技术!

    1eea9924a39e620ce45886a89f3f6ff1.png

    用手指按住就可以加入FPGA全国技术群哦

    FPGA IP核服务:各类优质IP核服务商,服务到位,有保障!有需求的可以直接联系群主!

    FPGA技术群平台自营:Xilinx Altera 镁光、三星、海力士、ADI TI ST NXP 等品牌的优势代理分销商,欢迎大家有需求随时发型号清单,我们将在第一时间为您提供最优竞争力的报价!价格低于您原有供应商5%以上!欢迎询价-直接把需求发给群主!

    FPGA技术群官方鸣谢品牌:Xilinx、 intel(Altera)、microsemi(,Actel)、LattIC e,Vantis,Quicklogic,Lucent等

    展开全文
  • 计算机内部浮点数表示方法以及计算方式AND计算机内部浮点数加减法运算规则和步骤(包含实例)(32位为例) 一. 将215642.36421转换为浮点数表示格式 1.首先将整数部分转变为2进制: 215642/2=107821…0 107821/2=...

    计算机内部浮点数表示方法以及计算方式AND计算机内部浮点数加减法运算规则和步骤(包含实例)(32位为例)

    一. 将215642.36421转换为浮点数表示格式

    1.首先将整数部分转变为2进制:

    215642/2=107821…0
    107821/2=53910…1
    53910/2=26955…0
    26955/2=13477…1
    13477/2=6738…1
    …以此类推
    6/2=3…0
    3/2=1…1
    1/2=0…1

    所以:215642(10)=110100101001011010(2)

    2.再将小数部分转变为二进制:

    0.36421 × 2 =0.72842
    0.72842 × 2 =1.45684
    0.45684 × 2 =0.91368
    0.91368 × 2 =1.82736
    0.82736 × 2 =1.65472
    0.65472 × 2 =1.30944
    0.30944 × 2 =0.61888
    0.61888 × 2 =1.23776
    …以此类推
    无限循环,结果超出精度范围,保留16位

    所以: 0.36421(10)≈ 0.0101110100111100(2)

    3.将整数部分和小数部分综合:

    215642.36421(10)=110100101001011010.0101110100111100(2)

    4.综合转换为浮点数(符号+阶码+尾数)(32位)

    因为215642.36421正数,所以符号位为0;

    110100101001011010.0101110100111100=1.101001010010110100101110100111100×2^17 所以指数为17

    阶码=127+17=144(10)=1001 0000(2)

    尾数=101001010010110100101110100111100(2)

    所以在32位精度下,215642.36421所转换成的浮点数为:

          0100 1000 0101 0010 1001 0110 1001 0111  
              4       8       5       2       9       6       9       7(16进制)        
    

    由此可以看出,小数点后面的多位二进制被忽略,这也是造成计算机计算浮点数会出现一些精度差异错误的原因。

    二. 浮点数加减法

    (1)260.50+120.46 《补码计算》

                         符号位  +        阶码          +      尾数
    

    260.50(10)= 0 + 10000111 + 00000100100000000000000(2)

                         符号位  +        阶码          +      尾数
    

    120.46(10)= 0 + 10000101 + 11100001110101110000101(2)

    1.对阶

    根据两个浮点数的阶数可知道,260.50和120.46相差两个阶数,所以低阶位的120.46的浮点数的尾数右移两位得:
    0111100001110101110000101

    2.尾数相加减
    260.50的尾数(补): 00.00000100100000000000000
    120.46的尾数(补):+ 00.0111100001110101110000101
    ——————————————————————
    得 00.0111110011110101110000101

    3.尾数规格化

    *这两个浮点数尾数相加结果不需要规格化

    4.尾数的舍入处理

    因为尾数只需要23位,用0舍1入法得到的尾数为:01111100111101011100001

    5.溢出检查

    *无溢出

    #所以,最后得到260.50+120.46=380.96(10)=0 10000111 01111100111101011100001

    (2)260.50-120.46 等价于260.50+(-120.46)

                         符号位  +        阶码          +      尾数
    

    260.50(10)= 0 + 10000111 + 00000100100000000000000(2)

                         符号位  +        阶码          +      尾数
    

    -120.46(10)= 1 + 10000101 + 11100001110101110000101(2)

    1.对阶

    根据两个浮点数的阶数可知道,260.50和-120.46相差两个阶数,所以低阶位的-120.46的浮点数的尾数右移两位得:
    0111100001110101110000101
    2.尾数相加减

    260.50的尾数(补): 00.0000010010000000000000000
    -120.46的尾数(补):+ 11.1000011110001010001111011
    ——————————————————————----
    得 11.1000110000001010001111011
    3.尾数规格化

    尾数左移一位得:11.000110000001010001111011
    *阶码减一

    4.尾数的舍入处理

    因为尾数只需要23位,尾数为:00011000000101000111101

    5.溢出检查

    *无溢出

    #所以,最后得到260.50-120.46=140.04(10)=0 1000011 000011000000101000111101(2)

    展开全文
  • C51浮点数显示、浮点数表示方法

    千次阅读 2013-10-10 10:29:00
    C51中的浮点数存储方式 --n年前曾在c51bbs论坛中发布过 Float 浮点形,它是符合IEEE-754标准的单精度浮点形数据,在十进制中具有7位有效数字。FLOAT型据占用四个字节(32位二进制数),在内存中的存放格式如下: ...

    C51中的浮点数存储方式
    --n年前曾在c51bbs论坛中发布过

    Float 浮点形,它是符合IEEE-754标准的单精度浮点形数据,在十进制中具有7位有效数字。FLOAT型据占用四个字节(32位二进制数),在内存中的存放格式如下:
    字节地址(由低到高)0 1 2 3
    浮点数内容 MMMMMMMM MMMMMMMM E MMMMMMM S EEEEEEE
    其中,S为符号位,存放在最高字节的最高位。“1”表示负,“0”表示正。E为阶码,占用8位二进制数,存放在高两个字节中。注意,阶码E值是以2为底的指数再加上偏移量127,这样处理的目的是为了避免出现负的阶码值,而指数是可正可负的。阶码E的正常取值范围是1~254,从而实际指数的取值范围为-126-127。M为尾数的小数部分,用23位二进制数表示,存放在低三个字节中。尾数的整数部分永远为1,因此不予保存,但它是隐含的。小数点位于隐含的整数位“1”的后面。

    例如浮点数124.75 = 42F98000H 在内存中的存放格式为:
    字节地址 +0 +1 +2 +3
    浮点数内容 00000000 10000000 1 1111001 0 1000010

    124.75D=1111100.11B=1.11110011*2E6
    阶码=6D+127D=133D=10000101B
    符号位=0

    参考示例程序一:
    typedef union{
    float flt;
    unsigned char fltc[4];
    } Float;


    main()
    {
    Float a;
    unsigned char i;
    a.flt=124.75;
    for(i = 0; i < 4; i++)
    printf("%x\t",a.fltc[i]);
    printf("\n");
    }

    参考示例程序二:
    main()
    {
    float a;
    unsigned char i;
    unsigned char *j;
    a=124.75;
    j = (unsigned char *)&a;
    for(i = 0; i < 4; i++)
    printf("%x\t",j[i]);
    printf("\n");
    }

     

    C51里用4字节存储一个浮点数,格式遵循IEEE-754标准(详见c51.pdf第179页说明)。一 
    个浮点数用两个部分表示,尾数和2的幂,尾数代表浮点上的实际二进制数,2的幂代表指 
    数,指数的保存形式是一个0到255的8位值,指数的实际值是保存值(0到255)减去127,一个 
    范围在-127到+128之间的值,尾数是一个24位值(代表大约7个十进制数),最高位MSB通常是 
    1,因此不保存。一个符号位表示浮点数是正或负。 
    浮点数保存的字节格式如下: 
    地址        +0          +1           +2           +3 
    内容    SEEE EEEE   EMMM MMMM    MMMM MMMM    MMMM MMMM 
    这里 
    S 代表符号位,1是负,0是正 
    E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。 
    M 24位的尾数保存在23位中,只存储23位,最高位固定为1。此方法用最较少的位数实现了 
    较高的有效位数,提高了精度。 
    零是一个特定值,幂是0 尾数也是0。 
    浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下: 
    地址 +0     +1     +2     +3 
    内容0xC1   0x48   0x00   0x00 
    浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转 
    换。 
    浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表 
    所列的那样分开,例如: 
    地址       +0           +1            +2            +3 
    格式   SEEE EEEE    EMMM MMMM     MMMM MMMM     MMMM MMMM 
    二进制  11000001     01001000      00000000      00000000 
    十六进制   C1           48            00            00 
    从这个例子可以得到下面的信息: 
      符号位是1 表示一个负数 
      幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。 
      尾数是后面的二进制数10010000000000000000000 

    在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数 
    点到尾数的开头,得到尾数值如下: 
    1.10010000000000000000000 
    接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为 
    指数是3,尾数调整如下: 
    1100.10000000000000000000 
    结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示 
    (1*2^3)+(1*2^2)+(0*2^1)+(0*2^0)=12。 
    小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示(1*2^(-1))+ 
    (0*2^(-2))+(0*2^(-2))...=0.5。 
    这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示- 
    12.5。 
    浮点数错误信息 
        8051没有包含捕获浮点数错误的中断向量,因此,你的软件必须正确响应这些错误情 
    况。 
        除了正常的浮点数值,还包含二进制错误值。这些值被定义为IEEE标准的一部分并用在 
    正常浮点数操作过程中发生错误的时候。你的代码应该在每一次浮点操作完成后检查可能出 
    现的错误。 
            名称        值       含义 
            NaN     0xFFFFFFF   不是一个数 
            +INF    0x7F80000   正无穷(正溢出) 
            -INF    0xFF80000   负无穷(负溢出) 
        你可以使用如下的联合体(union)存储浮点数。 
        union f { 
          float          f;  //浮点值 
          unsigned long ul;  //无符号长整数 
        }; 
        这个union包含一个float和一个unsigned long以便执行浮点数**算并响应IEEE错误 
    状态。 
         
        以上是KEIL在线帮助的中译文,下面我们讨论如何显示浮点数。 
         
        尾数为24bit,最高可表达的整数值为2^24-1=16777215,也就是说,小于等于16777215 
    的整数可以被精确显示。这决定了十进制浮点数的有效位数为7位,10^7<16777215<10^8, 
    10的7次方以内的数小于16777215,可以精确表示。使用科学记数法时,整数部分占1位,所 
    以小数部分最大占7-1=6位,即最大有6位十进制精度。 
        长整形数和浮点数都占4字节,但表示范围差别很大。浮点数的范围为+-1.175494E-38 
    到+-3.402823E+38,无符号长整形数范围为0到4294967295。显示浮点数要用到长整形数保 
    存数据,可他们范围差这么多,怎么办呢? 
        仔细观察十进制浮点数的显示,有一个尾数和一个阶码,由上面论证可知32位IEEE-754 
    浮点数最大有效数字为7位十进制数,超出此范围的数字有截断误差,不必理会,因此,浮 
    点数尾数能够放在长整形数里保存。阶码为-38到38,一个char型变量就可以保存。 
        综上所述,以10^7的最大跨度为窗口(小于10^7也可以,如:10,100...10000等,但决 
    不能大于它,那样会超出精度范围),定位浮点数的量级,然后取出7位尾数的整数值存于长 
    整形数里,再调整阶码,就可以精确显示此浮点数。 
        量级尺度如下: 
          (-38)-(-35)-(-28)-(-21)-(-14)-(-7)-(0)-(7)-(14)-(21)-(28)-(35)-(38) 
        请严格按照KEIL手册给出的浮点数范围显示,因为数值空间没有完全使用,有些值用于 
    错误指示和表示正负无穷。小于1.175494E-38的数仍可以显示一些,但最好不用,以免出 
    错。我采用直接判断的方法,剔除此种情况。 
        在计算机里结合律不成立,(a*b)*c!=a*(b*c),原则是先让计算结果值动态范围小的两 
    个数运算,请注意程序里的写法。 
        注:(1E38/b)*1E6不要写成1E44/b,因为无法在32位浮点数里保存1E44,切记! 
        计算机使用二进制数计算,能有效利用电子器件高速开关的特性,而人习惯于十进制数 
    表示,二进制和十进制没有方便的转换方法,只能通过大量计算实现,浮点数的十进制科学 
    记数法显示尤其需要大量的运算,可见,显示一个浮点数要经过若干次浮点运算,没有必要 
    就不要显示,否则,花在显示上的时间比计算的耗时都要多得多。

    展开全文
  • 初步了解机器中浮点数表示方法

    千次阅读 2019-04-13 19:16:59
    浮点数是小数点位置变化的数,能表示的范围比定点数大很多。 比如二进制数11.11可以表示为111.1×2-1或1.111×21等,我们由此规律能得到二进制数更一般形式N=2E×F,E称为阶码,F称为尾数。这个数在机器里怎么存呢,...
  • 为了表示浮点数,数被分为两部分:整数部分和小数部分。例如,浮点数14.234就有整数部分14和小数部分0.234.首先把浮点数转换成二进制数,步骤如下:1把整数部分转换成二进制.2把小数部分转换成二进制.3在两部分之间...
  • 我正在从二进制文件读取数据.我有一个文档,可以让我知道信息的存储...根据此文件:00800000 = 0.07AFBDD35 = 0.0610879BF7783C = -0.00349100FBFCAD = 0.031416我试图用以下方法解决此问题:struct.unpack('!f', my_...
  • 本文介绍了python十进制和二进制的转换方法(含浮点数),分享给大家,也给自己留个笔记,具体如下:我终于写完了 , 十进制转二进制的小数部分卡了我将近一个小时上代码#-*- coding: utf-8from decimal import ...
  • 一  个浮点数用两个部分表示,尾数和2的幂,尾数代表浮点上的实际二进制数,2的幂代表指  数,指数的保存形式是一个0到255的8位值,指数的实际值是保存值(0到255)减去127,一个  范围在-127到+128...
  • 我知道你可以像print(“%.2”%someVariable)那样做,但Python用这种方法创建的随机数不保存在任何变量中.至少我是这么认为的. 我还想知道是否有一种方法让变量选择小数点的数量,比如print(“%.”,数字%...
  • 两者最大区别在:python2.2前的版本和python2.2以后3.0以前的版本的默认情况下,"/"所做的除法是以一种两个数或者多个数出现一个浮点数结果就以浮点数的形式表示,即float除法"//"所做的除法则不相同,"//"不管两者...
  • 本文对浮点数的一般表示及标准表示方法、范围、存储格式等进行了比较深入地比较、分析和研究,力求给读者一个清晰的概《计算机组成原理》课程是计算机科学与技术专业的一门必修专业基础课,主要是讲述计算机系统几...
  • 浮点数是不精确的,因为浮点数在计算机的特殊的存储方式和十进制和二进制的转换有时候会出现无限循环情况。感兴趣的可以看一下参考资料。因此,在涉及到精确运算(如财务计算)的时候,不要使用浮点数浮点数不精确 ...
  • IEEE754 浮点数表示方法

    万次阅读 多人点赞 2016-01-09 17:08:19
    IEEE754标准中规定float单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位来表示指数,用23 位来表示尾数,即小数部分。对于double双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中...
  • 浮点数表示方法

    万次阅读 多人点赞 2019-02-13 23:44:28
    这种把数的范围和精度分别表示方法,相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法。 在计算机中一个任意二进制数N可以写成: N=2^e.M 其中M称为浮点数的尾数,是一个纯...
  • 我们知道python中有个range函数用来产生一个范围内的数字数组,但是浮点数没有,我们来定义一个#python中的range函数支持步进,如下:>>> print range(2,15,3)[2, 5, 8, 11, 14]#但是浮点数不支持range函数...
  • IEEE754 浮点数表示

    千次阅读 2008-02-29 14:52:00
    IEEE754 浮点数表示IEEE754 浮点数标准是当今在计算机中使用最为普遍的浮点数表示方法。这篇文章将对IEEE浮点数表示方法给出一个简短的介绍。1. 什么是浮点数计算机中小数的小数点并不是用某个数字表示的,而是用...
  • 一、表示方法 在计算机中,浮点数一般由三部分组成:符号位+阶码+尾数。 这种浮点数是用科学记数法来表示的,即:浮点数=符号位.尾数×2^阶码。 根据IEEE 754国际标准,常用的浮点数有三种格式: (1) 单...
  • 比如整数6的二进制表示就是压栈顺序为0、1、1,倒序弹出所得110(2)就是6的二进制表示。 小数部分与此相反,0.1*2=0.2取出整数部分0压栈,小数部分0.2继续0.2*2=0.4取出整数部分0压栈,小数部分0.4继续0.4*2=0.8取出...
  • 12浮点数表示方法

    2021-01-06 08:11:28
    浮点数表示 1、 表示格式 2、规格化浮点数 4、IEEE 754标准
  • C++中使用的浮点数包括采用的是IEEE标准下的浮点数表示方法。我们知道在数学中可以将任何十进制的数写成以10为底的科学计数法的形式,如下 其中显而易见,因为如果a比10大或者比1小都能够再次写成10的指数的形式...
  • Java中浮点数表示方法

    千次阅读 2018-07-29 11:05:01
    Java中浮点数表示方法 Java中浮点数表示方法 1.计算机中的表示方法 2.具体分析表示方法 小结 3.移位存储 小结 1.计算机中的表示方法 对于float来说,4个字节,32位,0-22位表示尾数,23-30(8...
  • DSP中浮点数表示方法tongxin | 2009-03-20 15:16:17 阅读:2484 发布文章先介绍一下IEEE754中浮点数的定义(这里只介绍单精度浮点数):%A%A 单精度浮点数由4字节(32位)组成,且分成3段:数符s(0表示正数,1表示负数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,405
精华内容 962
关键字:

浮点数表示方法