精华内容
下载资源
问答
  • 一、前言相比于整数,浮点数的...常用的浮点数有单精度浮点数(float)和双精度浮点数(double),本文主要以单精度浮点数为例,双精度浮点数原理相同。二、浮点数的表示方法通常使用IEEE754标准存储和表示浮点数。IEEE7...

    一、前言

    相比于整数,浮点数的存储和表示方法更为复杂。很多开发人员因浮点数难以掌控的精度问题而尽量避免使用浮点数。本文从浮点数的表示方法入手,浅析浮点数的精度问题,希望可以加深大家对浮点数的理解。

    常用的浮点数有单精度浮点数(float)和双精度浮点数(double),本文主要以单精度浮点数为例,双精度浮点数原理相同。

    二、浮点数的表示方法

    通常使用IEEE754标准存储和表示浮点数。IEEE754标准用以下形式来表示一个浮点数。

    b39580be3101af4a7c75d7787c317baf.png

    符号(sign)s决定数是负数(s=1)还是正数(s=0)。

     有效数(significand)M是一个二进制小数。

     指数(exponent)E是2的幂(可能是负数),它的作用是对浮点数加权。

    C语言使用32bit存储单精度浮点数,这32bit被分为三个域,分别编码符号域sign(1bit)、指数域exp(8bit)和小数域frac(23bit),如下图所示。

    2d1471a44ca9ad87e44e66ad258729b3.png

    双精度浮点数符号域sign、指数域exp和小数域frac分别占1bit、11bit和52bit。

    根据指数域exp的取值情况,浮点数被分为三类:规格化值、非规格化值和特殊数值。

    规格化值

    当指数域exp的bit位不为全0(数值0)或全1(数值255)时,该浮点数就是规格化值。对于规格化值,指数E = exp - Bias,有效数M = 1 + 0.frac。

    说明:Bias是偏置值,根据指数域exp的位数k确定,单精度浮点数指数域exp占8bit,所以k=8。通过下面计算公式可用得到单精度浮点数Bias为127。

    ab0a2c09992febf8f735b29099eaad21.png

    非规格化值

    当指数域exp的bit位全为0时,该浮点数就是非规格化值。对于非规格化值,指数E = 1 - Bias,有效数M = 0.frac。

    特殊数值

    当指数域exp的bit位全为1时,该浮点数就是特殊数值。特殊数值根据小数域frac的取值分为两种情况。当小数域frac全为0,符号域sign为0时,表示正无穷+∞;符号域sign为1时,表示负无穷-∞。当小数域frac不全为0时,表示的值被称为“NaN”,代表不是一个数(Not a number)。

    以上就是浮点数的表示方法,了解了浮点数的表示方法,就可以进行浮点数数值和二进制位之间转换。

    三、十进制浮点数值转换为二进制位(规格化值)

    以十进制数值3.6为例,将其转换为单精度浮点数二进制位。

    1、将十进制浮点数值转换为二进制浮点数值。

    十进制3.6转换为二进制浮点数为11.1001100110011....(0011循环)。

    说明:小数部分采用“乘2取整”的方法可以将十进制小数转换为二进制小数。

    2、计算符号s、有效数M和指数E。

    11.1001100110011....(0011循环)转换为2进制科学计数法为1.11001100110011.... * 2。

    说明:二进制小数每乘以2相当于将小数点右移一位。

    根据1.11001100110011.... * 2可得,符号s是0,指数E为1,有效数M为1.11001100110011....。

    3、根据s、M、E推算符号域sign、小数域frac和指数域exp。

    符号域sign = s,值为0,二进制位为0。

    指数域exp = E + Bias,值为128,8bit的二进制位为10000000。

    小数域0.frac=M - 1,值为0.11001100110011....,23bit的frac域二进制为11001100110011001100110。因为frac域截取了前23位,所以3.6无法被精确表示,得到的是一个近似值。

    4、合并符号域sign、指数域exp、小数域frac得到浮点数的二进制位。

    十进制3.6对应的二进制位为01000000011001100110011001100110

    四、浮点数转换工具

    手工对浮点数进行转换还是比较麻烦的,推荐使用下面的工具进行单精度浮点数之间的转换。

    工具URL:

    https://www.hschmidt.net/FloatConverter/IEEE754.html

    abdb300d808902f34cdf823588fe5c63.png

    该工具支持单精度浮点数各种进制直接的转换,以及数值无法准确被表示时的真实值和舍入的误差等。

    五、浮点数精度问题

    1、浮点数无法精确表示有效范围内所有数值

    与整数不同,因为浮点数在计算机中的存储方式(IEEE754),浮点数无法精确表示有效范围内的所有数值。有效范围内的数值是否可以被精确表示取决于有效数字M是否可以被小数域frac完全存储。例如3.5可以被精确存储,3.6无法被精确存储。

    2、浮点数有效数字

    通常认为单精度浮点数的有效数字时6~7位,绝对可以保证的是6位。

    说明:因为单精度浮点数使用23bit表示小数域,2的23次方是8,388,608。23位可以存储所有6位或更低的数字,以及大多数7位数字。

    但是仅按6~7位有效数字使用浮点数,更保守的只使用6位的话,如果小数点后保留两位有效数字,那么整数位只能有4位有效数字,这其实是大打折扣的!

    以保留小数点后两位小数为例,那么单精度浮点数整数部分可以使用的最大值是多少呢?要保证小数点后两位小数有效,即需要保证的精确度为0.01。小数域frac共23位,第一位代表2^(-1)=0.5,第二位代表2^(-2)=0.25,依次类推,第六位代表2^(-6)=0.015625,第七位代表2^(-7)=0.0078125,即至少需要7位小数域才能精确表示0.01。规格化浮点数有效数字域共23位,加上1默认占有的1位,共24位表示有效数字。小数部分需要占有7位有效数字域,那么整数部分占有位数为24-7=17位。2^17=131,072,即保留小数点后两位,单精度浮点数整数部分最大可以使用131071,超过该数值后,小数点后两位就无法被精确表示。

    通过下面的程序进行验证,整数部分为131071时,小数点后两位可以被准确输出;整数部分为131072时,小数点后两位不可以被准确输出。

    cb72c47eb8312c08e300f4118401693b.png

    图.验证程序

    6dda2a29cdd354482dc1a8875f33dcd3.png

    图.输出结果

    3、浮点数舍入

    浮点数默认舍入方式是向偶数舍入,也被称为向最近值舍入。使用该舍入方式是为了避免浮点数计算过程中偏差越来越大。C语言可以通过fegetround 函数获取当前浮点数环境的舍入方式,通过 fesetround设置当前浮点数环境的舍入方式。

    bd0d3e79b67f2b46a1e5a76d520c9f74.png

    六、参考文献

    《深入理解计算机操作系统》

    https://zh.cppreference.com/w/c/numeric/fenv/FE_round

    https://blog.demofox.org/2017/11/21/floating-point-precision/

    https://devblogs.microsoft.com/cppblog/do-you-prefer-fast-or-precise/

    9e579e09e75cf455ec6117ceb46b9e7e.png
    展开全文
  • (学习Verilog)3. FPGA有符号数,定点小数表示及计算机数值表示规则...通过介绍FPGA浮点数表示方法和用法,进而讲述计算机浮点数的表示规则,这部分涉及数电,微机原理的基础知识。浮点数需要提到IEEE754标准,计...

    09adddb83042f47abe79b99856aa143d.png

    (学习Verilog)3. FPGA有符号数,定点小数表示及计算机数值表示规则 介绍了FPGA内部常用的有符号数,符号位,定点小数的表示方法。定点数硬件实现简单,但表示的范围有限,且部分的小数运算IP核只支持浮点数运算,因此这里还需要提到浮点数的相关内容。

    通过介绍FPGA浮点数的表示方法和用法,进而讲述计算机浮点数的表示规则,这部分涉及数电,微机原理的基础知识。


    浮点数需要提到IEEE754标准,计算机的浮点数表示依照这个标准,以IEEE754的单精度浮点数为例。

    IEEE754单精度浮点数为32位,分为符号位,8位的指数部分,23位的尾数部分;

    以十进制下的12.5为例,首先12.5非负,所以符号位为0;

    12.5转换为二进制,1100.1,将其科学计数法化(正规化),变成了

    可知道此时2的指数为3,加上预设的偏移值127,得到了130,即1000 0010;这就是指数部分。

    (1.1001)去掉整数得到尾数1001,剩余尾数补0,这就是尾数部分。

    所以最终的IEEE754单精度值为 0 1000 0010 1001 0000 0000 0000 0000 000

    整合为16进制,为41 48 00 00 。

    再以-0.375为例,符号位为1;

    0.375转换为二进制,0.011,科学计数法化(正规化),

    可知2的指数位-2,加上127为125,即0111 1101;

    (1.1)去掉整数得到尾数1,剩余尾数补0

    最终为1 0111 1101 1000 0000 0000 0000 0000 000

    整合为16进制,为BE C0 00 00。

    反过来,通过浮点数的16进制表示,推出相应的10进制数,公式如下:

    s是符号位,决定数据的正负,fration是最后的23位对应的10进制小数,exponent是8位的指数部分,bias是预设的偏移值,32位中为127;

    当然,这样的计算方法没有办法表示0,所以做了特殊规定,当exponent为0时,相应的公式变成了这个样子:

    当fration也为0时,就表示出0了。当exponent为最大值,fration为0,表示正/负无穷大;fration不为0会报NaN,不是一个数。

    浮点数加法:

    以正数相加为例, 0.3 + 0.7 = ?

    • 0.3 -> 3E 99 99 99
    • 0.7 -> 3F 33 33 33

    可以知道,0.3的exponent为125,0.7的exponent为126;两者的exponent不一致,需要进行移位操作保持一致。这里移位的原则是小exponent向大exponent保持一致。所以0.3需要向右移动一位,保持exponent一致;

    即(1) 0011 0011 0011 0011 0011 001 -> (0) 1001 1001 1001 1001 1001 100

    然后进行两者尾数相加,这部分跟定点数加法规则一致。

    cab0c133775741c1dc6d201d32ebd628.png

    得到结果3f 7f ff ff,转换为10进制为0.9999999403953552;也就是说在计算机浮点数操作过程中,0.3+0.7不等于1,这也就是为什么编程里面浮点数不推荐直接做比较的原因,由于浮点数精度的原因,浮点数做比较更推荐使用与预设值做减法取绝对值,如果差值在一个很小的范围内,则认为相等。

    如果是正负相加,负数需要取补码进行相加操作,并扩展符号位,观察结果的正负性;如果结果的整数部分大于1,要进行科学计数法化(正规化)。

    浮点数乘法:

    1. 尾数相乘,得到结果,以12.5和-0.375为例,相关的浮点数表示在介绍IEEE754环节已给出;

    12.5 ->41 48 00 00 ; -0.375 -> BE C0 00 00

    1c75fc999ed9aef75a709b7f17bb924c.png

    2. 计算两者的exponent差值,得到结果1;将1中的结果科学计数法化(正规化),得到最终的exponent为127+1+1=129;

    3. 将两者的符号位做异或计算,得到结果1,所以最终结果的符号位为1;最终结果为C0 96 00 00,转换为10进制就是-4.6875 。

    相对比而言,浮点数能够表示更宽的数据范围,但计算过程可能较为复杂,但是明白它的表示规则之后,将定点小数转换成浮点数也并不难,这样就可以用到浮点运算的IP核了。

    经过各种处理之后的数据,为了平衡数据精度和资源占用,又需要使用到数据截位,至于如何截位,将在下一篇里面讲到。

    欢迎关注BUG记录公众号

    4add0e59c124f2fc8d4d20f3982ced7a.png
    微信号:bugrec

    如果有更好的解决方法可以留言一起谈论,欢迎大家点赞收藏留言讨论交流。


    万物皆可卷积:(学习Verilog)3. FPGA有符号数,定点小数表示及计算机数值表示规则zhuanlan.zhihu.com
    5a85484ab120be8c136af108a50aae74.png
    万物皆可卷积:使用Idelay进行时序调节遇到的问题及解决方法记录zhuanlan.zhihu.com
    1818800a00666173bb7eba7b58016834.png
    万物皆可卷积:(HLS实现verilog)使用HLS实现m序列zhuanlan.zhihu.com
    bcf0fec78a2a5003902dc5eb47dd0c0d.png
    展开全文
  • 具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。1 浮点数基础知识浮点数由四部分构成:符号位(Sign Bit)、尾数(Mantissa)、...

                浮点数基础

    浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。

    1 浮点数基础知识

    3189541e4e9cb2af548a04f6fd805a07.png
    浮点数由四部分构成:符号位(Sign Bit)、尾数(Mantissa)、基数(Radix)和指数(Exponent)。根据《IEEE Standard 754 for Binary Floating-Point Arithmetic》的定义–二进制标准浮点数,基数为2。s、m、e分别为符号数、尾数和指数,n为相应的浮点数值。a0a6489576a47ab2deae1761f9b38e74.png
    IEEE-754规定了三种浮点数:单精度(float)、双精度(double)和扩展精度。
    其中单精度为32bit,其中包含1位符号位S,8位指数位E和23位尾数位M。S、E、M为相应的二进制序列。dd48a2f767894852c3b012e182162cdc.png
    S:
    正数 0.1xxxxxx
    负数 1.1xxxxxx
    M:
    表示小数点之后的二进制尾数。
    M为0110表示:二进制.0110
    E:
    规格化(normalized)
    非规格化(denormalized)

    2 规格化浮点数

    E表示的二进制不全为0也不全为1时该浮点数为规格化浮点数。7800ce19a34a26b2a94410a086a20858.png
    e表示偏置(Biased)
    |E|表示E的二进制整数
    bias表示偏置
    k为指数位宽
    对于单精度浮点数来说k为8,所以bias为127。E="10001000"为例,|E|=136,故e为9。
    对于规格化浮点数,标准规定尾数位小数点左侧的隐含位为1,所以:
    m = |1.M|
    例如M="10010…0"则1.M="1.10010…0"所以m=1.56259eb4877ce1ec28740b7e623b311a5c33.png
    s=0
    m = 1.5625
    e =9
    n =55.5112
    单精度浮点数的公式可表示为:5c88d244d34e9fff4622b22304932c48.png

    3非规格化浮点数

    E的二进制位全为0时该浮点数为非规格化浮点数。
    bias=12731f492b0918035da6aee12719a8a1c27.png
    单精度非规格化浮点数公式:9ea6792942de524ec1b02b9e3927fa5d.png
    -0.0 符号位为1,其余位为0.
    +0.0全部为0.

    4特殊数值

    E的二进制位全为1时为特殊数值。
    M全0,n无穷大
    M全1,S为1,n负无穷大
    M全1,S为0,n正无穷大
    M不全为0和1,n NaN(Not a Number)94869ca2f1123190b200282fc1130f55.png

    5 双精度浮点数

    IEEE-754定义双精度浮点数共64bit 。1位符号位S,11位指数位E和52位尾数位M。同样可以划分为规格化、非规格化和特殊数值。d11eff408f509c1ccd5e3bb460001514.png84aaba944fc41946634da28be8a9e115.png

    更多精彩推荐,请关注我们

    64ade9b9109c3ff4da18db014e5e57a8.png

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

    千次阅读 2016-10-11 16:00:47
    参考至 : ... IEEE 754 浮点数的格式  参考上图,浮点数和双精度数表示方法, s 符号位 (正值为0,负值为1);...偏移量: 浮点数 27-1,双精度浮点数为210-1  + 指数 mantissa 尾数(有

    参考至 : http://blog.csdn.net/zcsylj/article/details/6787923



    IEEE 754 浮点数的格式 


    参考上图,浮点数和双精度数表示方法,

    s 符号位 (正值为0,负值为1);

    exponent 阶码 (指数)偏移量: 浮点数27-1,双精度浮点数为210-1  + 指数

    mantissa 尾数(有效位数)


    在计算机运算过程中,为了提高运算精度,避免丢失有效数字,二进制浮点数可以表示成格式化的形式. 就是使尾数最高位为1(小数点后面第一位数为1)


    因为尾数第一位都是1 , 所以 浮点数表示就省略了 尾数的第一位 1


    实例如下

    -12.5=(-1100.1)2,尾数为1.1001,指数为3,浮点数尾数即:110 0100 0000 0000 0000 0000,指数部分为27-1+3=(10000010)2,符号位为1,省略尾数第一位的1,即-12.5=(1100 0001 0100 1000 0000 0000 0000 00002

    1表示 符号为 '-' 负

    100 0001 0 表示 指数 27-1 + 3  (0111 1111 1111 + 0000 0000 0011)

    100 1000 0000 0000 0000 0000  表示 尾数

    展开全文
  • 经常会碰到一个问题,"为什么 0.1 + 0.2 !== 0.3?...= Number.EPSILON复制代码IEEE 754 64 位浮点类型IEEE 754IEEE 754 规定了四种表示浮点数值的方式:单精确度(32位)、精确度(64位)、延伸单精确...
  • IEEE754 浮点数表示方法

    万次阅读 多人点赞 2016-01-09 17:08:19
    1.浮点数的存储格式 浮点数在C/C++中对应float和double类型,我们有必要知道浮点数在...对于double双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。IEEE 浮点值的格式...
  • 为了表示浮点数,数被分为两部分:整数部分和小数部分。...浮点数还可以规范化,浮点数可以用单精度表示法和双精度表示法.规范化只存储这个数的三个部分的信息:符号,指教和尾数.如+1000111.0101规范化后为+ 2^6 ...
  • 一、表示方法 在计算机中,浮点数一般由三部分组成:符号位+阶码+尾数。 这种浮点数是用科学记数法来表示的,即:浮点数...(2) 双精度浮点数(64位),阶码11位,尾数53位(内含1位符号位)。 (3) 临时浮点数(80位),
  • IEEE754浮点数表示方法

    万次阅读 2018-01-05 10:54:03
    1.浮点数的存储格式 浮点数在C/C++中对应float和double类型,我们有必要知道浮点数在计算机中...对于double双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。IEEE 浮点值的格式
  • 精度浮点数转化为10进制数的原理

    千次阅读 2020-09-17 17:58:41
    在做MODBUS通讯时经常会用到单精度浮点数表示测量值,比如41 20 00 00代表十进制的10,用代码可以轻松实现转换,但是他是怎么计算出来的呢?查了一些资料后我知道了计算的方法,在此记录一下。 举个栗子: 比如10...
  • (图1)单精度和双精度浮点数 图1显示的分别是单精度(float)和双精度(double)表示形式。 但这样表示,exp只能为正数,及浮点数 V 的结果是一定大于 frac 这个值的,不好,所以人们就这样定义exp: 其中这个exp...
  • " 经常会碰到一个问题,"为什么 0.1 + 0.2 !== 0.3?...= Number.EPSILONIEEE 754 64 位浮点类型IEEE 754 规定了四种表示浮点数值的方式:单精确度(32位)、精确度(64位)、延伸单精确度(43比特以上,...
  • 浮点数精度计算

    2017-06-02 23:11:00
    浮点数精度计算单精度浮点数精度为7,双精度浮点数的精度为16. 这是计算机编程的常识。这里介绍一下7和16这两个数字是如何来的。 首先要说说浮点数的表示方法,根据 IEEE 754,任何一个浮点数的二进制形式可以写作V...
  • 浮点数表示方法

    万次阅读 2011-09-18 20:58:52
    Java 语言支持两种基本的浮点类型: float 和 double ,以及与它们对应...它们都依据 IEEE 754 标准,该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准。 IEEE 754 用科学记数法以底数为
  • 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M 表示公式 偏移量 1 8 23 (-1)S*2(P-127)*1.M 127 1 11 52 (-1)S...
  • 对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M 表示公式 偏移量 1 8 23 (-1...
  • 浮点数表示方法(转,修改) 关于为什么指数部分(E)要加一个偏移值,单精度+127 双精度+1013,可以参考:...
  • 浮点数表示

    2019-05-02 14:18:47
    在计算机中,浮点数用 尾数 和 阶码 表示如下: 浮点数真值 = 尾数 ×...汇编语言浮点数使用 IEEE754 规范,有 单精度REAL4 、 双精度REAL8 和 扩展精度REAL10 共3种类型。 这里只述说 单精度REAL4 的表示方法。...
  • 浮点数的二进制表示

    2019-09-27 17:23:05
    单精度浮点数float32和双精度浮点数float64的二进制表示方法相似,以float64为例,二进制位如图 sign bit(符号): 用来表示正负号,0代表数值...一个双精度浮点数所代表的数值为:(-1)sign× 2exponent - 0x3ff...
  • C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,...
  • 其中S是符号位,P是阶码,M是尾数对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M 表示公式 偏移量 1...
  • 快速浮点数exp算法

    千次阅读 2017-11-05 17:04:34
    现在的深度神经网络中,经常会使用到sigmoid函数或者softmax函数,而这些函数中都使用了浮点数的幂指数函数(ex)。...1.1. 双精度浮点数表示 64位的双精度浮点数中符号为1位,阶码域为11位,尾数域为5
  • 其中S是符号位,P是阶码,M是尾数对于IBM-PC而言,单精度浮点数是32位(即4字节)的,双精度浮点数是64位(即8字节)的。两者的S,P,M所占的位数以及表示方法由下表可知 S P M 表示公式 偏移量 1 8 ...
  • 浮点数就是有很我小数的那种并且不只单纯了数字了... //56结果可能有点出乎你的意外,PHP遵循IEEE 754双精度浮点数, 以64位的双精度, 采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).符号位:最高位表...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 161
精华内容 64
关键字:

双精度浮点数表示方法