精华内容
下载资源
问答
  • IEEE754

    多人点赞 2020-07-13 22:39:42
    一、定义:什么是IEEE754 IEEE754标准中规定float单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位来表示指数,用23 位来表示尾数,即小数部分。对于double双精度浮点数,用 1 位表示符号,用 11 位表示...

    一、定义:什么是IEEE754

     

    IEEE754标准中规定float单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位来表示指数,用23 位来表示尾数,即小数部分。对于double双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。

    IEEE754规定:

    单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移量127;双精度浮点数字长64位,尾数长度52,指数长度11,指数偏移量1023;

    注:单精度偏移量: 01111111 转成十进制 = 127=1+2+4+8+16+32+64


    约定小数点左边隐含有一位,通常这位数是1,所以上述单精度尾数长度实际为24(默认省略小数点左边的1则为23),双精度尾数长度实际为53(默认省略小数点左边的1则为52);
    下面讲述使用IEEE754标准表示浮点数:

    176.0625表示为单精度浮点数:
    解:
    1).先将176.0625转换为二进制数

    小数点前:176 / 2 = 88  余数为 0
    88 / 2=44 余数为 0                             
    44 / 2 =22 余数为 0                       
    22 / 2= 11 余数为 0                              
    11 / 2 =5   余数为 1        
    5 / 2=2 余数为 1                             
    2/ 2  =1 余数为 0                                                                             
    1/ 2=0        余数为 1    商为0,结束。   

    小数点前整数转换为二进制:10110000                                          

       小数点后:小数部分乘以2,取整数部分,直至乘积小数部分为0   
    0.0625 * 2 = 0.125   整数为0                 
    0.125 * 2 = 0.25     整数为0             
    0.25* 2 = 0.50       整数为0             
    0.5* 2 = 1.0 整数为1,小数部分为0,结束

    小数点后的小数位转换为二进制:0001

          故176.0625转换为二进制为:10110000.0001

    2).IEEE754约定小数点左边隐含有一位,通常这位数是1,所以10110000.0001=1.01100000001 *  2^7(小数点向左偏移7位);

    IEEE754约定单精度指数偏移量为127,所以176.0625使用IEEE754标准表示时,指数偏移量为 7+127=134 ,即:10000110

    IEEE754约定单精度尾数长度为23,所以176.0625使用IEEE754标准表示时,尾数为:01100000001000000000000

    尾数 = 二进制10110000.0001 去掉1  和小数点  剩余位补0  一共 23位

    176.0625>0,即为正数,所以符号位为0

    3)由上得出:176.0625使用IEEE754规格化后的表示为:0  10000110 01100000001000000000000

    300 转成双精度浮点数

     

    0    10000000111        0010110000000000000000000000000000000000000000000000

    解析:

    300转成2进制=100101100

    100101100=1.00101100*2^8  所以指数偏移量=8+1023=1031

    1031转成2进制=10000000111 (7个0)

    尾数为 300转成2进制的100101100 去掉1 之后的数字都补0 (一共52位)

    300>0 所以首位(符号位)为0

    所以 300 = 0  10000000111  0010110000000000000000000000000000000000000000000000

    注:尾数减一的相关说明:


    大概是如果一个数大于 1 时是这样的

    小于 1 有点儿区别

     大于小于是指绝对值
     

    ————————————————

    参考链接:https://blog.csdn.net/crjmail/article/details/79723051

    展开全文
  • IEEE 754

    2021-03-04 18:46:12
    如果你要了解Number类型,那我建议你还是需要先了解一下IEEE 754. IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点数运算器所采用。这个标准定义了表示浮点数...

    如果你要了解Number类型,那我建议你还是需要先了解一下IEEE 754.

    IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点数运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和物种例外状况(包括例外发生的时机与处理方式)。

    在IEEE-754标准下,浮点格式主要分为四种类行,即单精度格式、双精度格式、扩展单精度格式和扩展双精度格式。其中32位单精度格式与64位双精度格式作为基础格式更为常用,扩展格式则有特殊目的,一般对用户透明。

    在IEEE-754标准下,浮点数一共分为5种:

    • NaN:即Not a Number。非数的指数位全部为1同时尾数位不全为0。在此前提下,根据尾数位首位是否为1,NaN还可以分为SNaN和QNaN两类。前者参与运算时将会发生异常。
    • 无穷数:指数位全部为1同时尾数位全为0。大。
    • 规格化数:指数位不全为1同时尾数不全为0。此时浮点数的隐含位有效,其值为1。
    • 非规格化数:指数位全为0且尾数位不全为0,此时隐含位有效,值为0。另外需要注意,以单精度为例,真实指数E并非0-127=-127,而是-126,这样一来就与规格化下最小真实指数E=1-127=-126达成统一,形成过度。
    • 0:指数位与尾数位都全为0,根据符号位决定正负。
    展开全文
  • IEEE754 浮点数的表示方法

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

    1.浮点数的存储格式

    浮点数(Floating-point Number)是对实数的一种近似表示,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次幂得到。以这种表示法表示的数值,称为浮点数。表示方法类似于基数为10的科学计数法。利用浮点进行运算,称为浮点计算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。

    计算机对浮点数的表示规范遵循电气和电子工程师协会(IEEE)推出的 IEEE754 标准,浮点数在 C/C++ 中对应 float 和 double 类型,我们有必要知道浮点数在计算机中实际存储的内容。

    IEEE754 标准中规定 float 单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位表示指数,用 23 位表示尾数,即小数部分。对于 double 双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数,其中指数域称为阶码。IEEE754 浮点数的格式如下图所示。
    这里写图片描述
    注意,IEE754 规定浮点数阶码 E 采用"指数e的移码-1"来表示,请记住这一点。为什么指数移码要减去 1,这是 IEEE754 对阶码的特殊要求,以满足特殊情况,比如对正无穷的表示。

    2.移码

    移码(又叫增码)是对真值补码的符号位取反,一般用作浮点数的阶码,引入的目的是便于浮点数运算时的对阶操作。

    对于定点整数,计算机一般采用补码的来存储。正整数的符号位为 0,反码和补码等同于原码。负整数符号位为1,原码、反码和补码的表示都不相同,由原码变成反码和补码有如下规则:
    (1)原码符号位为1不变,整数的每一位二进制数位求反得反码;
    (2)反码符号位为1不变,反码数值位最低位加1得补码。

    比如,以一个字节 8bits 来表示 -3,那么[3]=10000011[-3]_原=10000011[3]=11111100[-3]_反=11111100[3]=11111101[-3]_补=11111101,那么 -3 的移码就是[3]=01111101[-3]_移=01111101

    如何将移码转换为真值 -3 呢?先将移码转换为补码,再求值。

    3.浮点数的规格化

    若不对浮点数的表示作出明确的规定,同一个浮点数的表示就不是唯一的。例如(1.75)10(1.75)_{10}可以表示成1.11×201.11\times 2^00.111×210.111\times2^10.0111×220.0111\times2^2等多种形式。当尾数不为0时,尾数域的最高有效位为1,这称为浮点数的规格化。否则,以修改阶码同时左右移动小数点位置的办法,使其成为规格化数的形式。

    3.1 单精度浮点数真值

    IEEE754 标准中,一个规格化的 32 位浮点数 x 的真值表示为:
    x=(1)S×(1.M)×2ex=(-1)^S\times(1.M)\times2^e
    e=E127e=E-127
    其中尾数域值是1.M。因为规格化的浮点数的尾数域最左位总是1,故这一位不予存储,而认为隐藏在小数点的左边。

    在计算指数 e 时,对阶码E的计算采用原码的计算方式,因此 32 位浮点数的 8bits 的阶码 E 的取值范围是 0 到 255。其中当E为全 0 或者全 1 时,是 IEEE754 规定的特殊情况,下文会另外说明。

    3.2 双精度浮点数真值

    64 位的浮点数中符号为 1 位,阶码域为 11 位,尾数域为 52 位,指数偏移值是 1023。因此规格化的 64 位浮点数 x 的真值是:
    x=(1)S×(1.M)×2ex=(-1)^S\times(1.M)\times2^e
    e=E1023e=E-1023

    4.浮点数的具体表示

    4.1 十进制到机器码

    (1)0.5
    0.5=(0.1)20.5=(0.1)_2,符号位S为0,指数为e=1e=-1,规格化后尾数为1.0。

    单精度浮点数尾数域共23位,右侧以0补全,尾数域:
    M=[000 0000 0000 0000 0000 0000]2M=[000\ 0000\ 0000\ 0000\ 0000\ 0000]_2

    阶码E:
    E=[1]1=[0111 1111]21=[0111 1110]2E=[-1]_移-1=[0111\ 1111]_2-1=[0111\ 1110]_2

    对照单精度浮点数的存储格式,将符号位S,阶码E和尾数域M存放到指定位置,得0.5的机器码:
    0.5=[0011 1111 0000 0000 0000 0000 0000 0000]20.5=[0011\ 1111\ 0000\ 0000\ 0000\ 0000\ 0000\ 0000]_2

    十六进制表示为0.5=0x3f000000。

    (2)1.5
    1.5=[1.1]21.5=[1.1]_2,符号位为0,指数e=0e=0,规格化后尾数为1.1。

    尾数域M右侧以0补全,得尾数域:
    M=[100 0000 0000 0000 0000 0000]2M=[100\ 0000\ 0000\ 0000\ 0000\ 0000]_2

    阶码E:
    E=[]1=[10000000]21=[01111111]2E=[0]_移-1=[1000 0000]_2-1=[0111 1111]_2

    得1.5的机器码:
    1.5=[0011 1111 1100 0000 0000 0000 0000 0000]21.5=[0011\ 1111\ 1100\ 0000\ 0000\ 0000\ 0000\ 0000]_2

    十六进制表示为1.5=0x3fc00000。

    (3)-12.5
    12.5=[1100.1]2-12.5=[-1100.1]_2,符号位S为1,指数e为3,规格化后尾数为1.1001,

    尾数域M右侧以0补全,得尾数域:
    M=[100 1000 0000 0000 0000 0000]2M=[100\ 1000\ 0000\ 0000\ 0000\ 0000]_2

    阶码E:
    E=[3]1=[1000 0011]21=[1000 0010]2E=[3]_移-1=[1000\ 0011]_2-1=[1000\ 0010]_2

    即-12.5的机器码:
    12.5=[1100 0001 0100 1000 0000 0000 0000 0000]2-12.5=[1100\ 0001\ 0100\ 1000\ 0000\ 0000\ 0000\ 0000]_2

    十六进制表示为-12.5=0xc1480000。

    用如下程序验证上面的推算,代码编译运行平台Win32+VC++ 2012:

    #include <iostream>
    using namespace std;
    
    int main() {
    	float a=0.5;
    	float b=1.5;
    	float c=-12.5;
    
    	unsigned int* pa=NULL;
    	pa=(unsigned int*)&a;
    	unsigned int* pb=NULL;
    	pb=(unsigned int*)&b;
    	unsigned int* pc=NULL;
    	pc=(unsigned int*)&c;
    	
    	cout<<hex<<"a=0x"<<*pa<<endl;
    	cout<<hex<<"b=0x"<<*pb<<endl;
    	cout<<hex<<"c=0x"<<*pc<<endl;
    	
    	return 0;
    }
    

    输出结果:

    a=0x3f000000
    b=0x3fc00000
    c=0xc1480000
    

    验证正确。

    4.2 机器码到十进制

    (1)若浮点数 x 的 IEEE754 标准存储格式为 0x41360000,那么其浮点数的十进制数值的推演过程如下:

    0x41360000=[0 10000010 011 0110 0000 0000 0000 0000]0x41360000=[0\ 10000010\ 011\ 0110\ 0000\ 0000\ 0000\ 0000]

    根据该浮点数的机器码得到符号位 S=0,指数 e=阶码-127=1000 0010-127=130-127=3

    注意,根据阶码求指数时,可以像上面直接通过 "阶码-127"求得指数e,也可以将+1=阶码+1=移码,再通过移码求其真值便是指数 e。比如上面阶码 10000010+1=10000011[]=>00000011[]=3(e)10000010+1=10000011_{[移码]}=>00000011_{[补]}=3(指数e)

    包括尾数域最左边的隐藏位1,那么尾数 1.M=1.011 0110 0000 0000 0000 0000=1.011011。

    于是有:
    x=(1)S×1.M×2e=+(1.011011)×23=+1011.011=(11.375)10x=(-1)^S\times1.M\times2^e=+(1.011011)\times2^3=+1011.011=(11.375)_{10}

    通过代码同样可以验证上面的推算:

    #include <iostream>
    using namespace std;
    
    int main() {
    	unsigned int hex=0x41360000;
    	float* fp=(float*)&hex;
    	cout<<"x="<<*fp<<endl;
    	return 0;
    }
    

    输出结果:

    x=11.375
    

    验证正确。

    5.浮点数的几种特殊情况

    (1)0 的表示
    对于阶码为 0 或 255 的情况,IEEE754 标准有特别的规定:
    如果 阶码 E=0 并且尾数 M 是 0,则这个数的真值为 ±0(正负号和数符位有关)。

    因此 +0 的机器码为:0 00000000 000 0000 0000 0000 0000 0000。
    -0 的机器码为:1 00000000 000 0000 0000 0000 0000 0000。

    需要注意一点,浮点数不能精确表示 0,而是以很小的数来近似表示 0,因为浮点数的真值等于(以32bits单精度浮点数为例):
    x=(1)S×(1.M)×2ex=(-1)^S\times(1.M)\times2^e
    e=E127e=E-127
    那么 +0 的机器码对应的真值为1.0×21271.0\times2^{-127}。同理,-0 机器码真值为1.0×2127-1.0\times2^{-127}

    (2)++\infty-\infty 的表示
    如果阶码 E=255 并且尾数 M 全是0,则这个数的真值为 ±∞(同样和符号位有关)。因此++\infty的机器码为:0 11111111 000 0000 0000 0000 0000 0000。-\infty的机器吗为:1 11111111 000 0000 0000 0000 0000 0000。

    (3)NaN(Not a Number)
    如果 E = 255 并且 M 不是0,则这不是一个数(NaN)。

    6.浮点数的精度和数值范围

    6.1 浮点数的数值范围

    根据上面的探讨,浮点数可以表示-∞到+∞,这只是一种特殊情况,显然不是我们想要的数值范围。

    以 32 位单精度浮点数为例,阶码 E 由 8 位表示,取值范围为 0-255,去除 0 和 255 这两种特殊情况,那么指数 e 的取值范围就是 1-127=-126 到 254-127=127。

    (1)最大正数
    因此单精度浮点数最大正数值的符号位S=0,阶码E=254,指数e=254-127=127,尾数M=111 1111 1111 1111 1111 1111,其机器码为:0 11111110 111 1111 1111 1111 1111 1111。

    那么最大正数值:
    PosMax=(1)S×1.M×2e=+(1.11111111111111111111111)×21273.402823e+38PosMax=(-1)^S\times1.M\times2^e=+(1.111 1111 1111 1111 1111 1111)\times2^{127}\approx3.402823e+38
    这是一个很大的数。

    (2)最小正数
    最小正数符号位S=0,阶码E=1,指数e=1-127=-126,尾数M=0,其机器码为0 00000001 000 0000 0000 0000 0000 0000。

    那么最小正数为:
    PosMin=(1)S×1.M×2e=+(1.0)×21261.175494e38PosMin=(-1)^S\times1.M\times2^e=+(1.0)\times2^{-126} \approx1.175494e-38

    这是一个相当小的数。几乎可以近似等于0。当阶码E=0,指数为-127时,IEEE754就是这么规定1.0×21271.0\times2^{-127}近似为0的,事实上,它并不等于0。

    (3)最大负数
    最大负数符号位S=1,阶码E=1,指数e=1-127==-126,尾数M=0,机器码与最小正数的符号位相反,其他均相同,为:1 00000001 000 0000 0000 0000 0000 0000。

    最大负数等于:
    NegMax=(1)S×1.M×2e=(1.0)×21261.175494e38NegMax=(-1)^S\times1.M\times2^e=-(1.0)\times2^{-126} \approx-1.175494e-38

    (4)最小负数
    符号位S=0,阶码E=254,指数e=254-127=127,尾数M=111 1111 1111 1111 1111 1111,其机器码为:1 11111110 111 1111 1111 1111 1111 1111。

    计算得:
    NegMin=(1)S×1.M×2e=+(1.11111111111111111111111)×2127=3.402823e+38NegMin=(-1)^S\times1.M\times2^e=+(1.111 1111 1111 1111 1111 1111)\times2^{127}=-3.402823e+38

    6.2 浮点数的精度

    说到浮点数的精度,先给精度下一个定义。浮点数的精度是指浮点数的小数位所能表达的位数。

    阶码的二进制位数决定浮点数的表示范围,尾数的二进制位数表示浮点数的精度。以 32 位浮点数为例,尾数域有 23 位。那么浮点数以二进制表示的话精度是 23 位,23 位所能表示的最大数是2231=83886072^{23}-1=8388607,所以十进制的尾数部分最大数值是 8388607,也就是说尾数数值超过这个值,float 将无法精确表示,所以 float 最多能表示小数点后 7 位,但绝对能保证的为 6 位,即 float 的十进制的精度为 6~7 位。

    64 位双精度浮点数的尾数域 52 位,因2521=4,503,599,627,370,4952^{52}-1=4,503,599,627,370,495,所以双精度浮点数的十进制的精度最高为 16 位,绝对保证的为 15 位,所以 double 的十进制的精度为 15~16 位。

    7.小结

    本文操之过急,难免出现编辑错误和不当说法,请网友批评指正。不明之处,欢迎留言交流。对浮点数的加减乘除运算还未涉及,后续可能会去学习并记录学习所得,与大家分享。


    参考文献

    [1] 百度百科.移码
    [2] 百度知道.关于IEEE754标准浮点数阶码的移码
    [3] 白中英.计算机组成原理第四版[M].科学出版社:P16-30
    [4] 维基百科.浮点数

    展开全文
  • t implement IEEE 754-2008 but only IEEE 754-1985, and which can deviate in their floating implementation from IEEE 754-2008? Some MIPS platforms come to my mind that implement signaling NaNs ...
  • Python 3中的IEEE 754实现。 描述 有几种算法可以将浮点数转换为基于IEEE 754的二进制表示形式,反之亦然。 注意:我出于学习目的创建了这个项目。 我当时在想许多编程语言都存在的浮点数精度错误,所以我决定深入...
  • 我正在尝试将以下IEEE 754十六进制数0x805c00f0转换为其十进制等效值,根据在线转换器,该值等于-8.44920195816662938E-39 . 逐步在纸上进行,我得到以下结果:805c00f0 = 1000 0000 0101 1100 0000 0000 1111 0000...

    我正在尝试将以下IEEE 754十六进制数0x805c00f0转换为其十进制等效值,根据在线转换器,该值等于-8.44920195816662938E-39 . 逐步在纸上进行,我得到以下结果:

    805c00f0 = 1000 0000 0101 1100 0000 0000 1111 0000最左边1表示数字为负数 . 接下来的8位000 0000 0表示减去偏差后的指数为-127 . 我留下的位是101 1100 0000 0000 1111 0000,即尾数 .

    在回忆隐含的1后,我有-1.101 1100 0000 0000 1111 0000 * 2 ^ -127 . 将小数点移动到左侧127位,我有-0.00(...)1101 1100 0000 0000 1111 0000.求和,得到-1(2 ^( - 127)2 ^( - 128)2 ^( - 130)2 ^( - 131)2 ^( - 132)2 ^( - 143)2 ^( - 144)2 ^( - 145)2 ^( - 146))= -1.01020727331947522E-38 . 这不等于转换器给我的东西,我无法理解为什么 . 我错了什么?

    展开全文
  • ieee754分享

    2018-08-24 15:57:34
    ieee754浮点数标准分享 讲得很详细 讲得很详细 讲得很详细
  • ieee754.rar

    2019-10-27 20:17:45
    【压缩包密码ieee754IEEE754标准,定义了计算机中浮点数的存储格式和计算规则,Java/C++等主流语言中的浮点数均符合此标准。
  • IEEE754浮点数乘法设计

    2018-09-28 00:50:53
    IEEE754浮点数乘法设计,针对IEEE754标准,使用C语言对IEEE754浮点数表示和乘法计算过程进行了还原,编译器和IDE分别为GC++和DEV c++。
  • IEEE754转浮点数代码

    2020-12-08 14:09:51
    大二上计算机基础实验的Linux下环境下的c语言代码,编写一个IEEE754标准浮点数转十进制程序。输入一个IEEE754标准浮点数,输出一个有符号的十进制数。
  • IEEE754标准

    2020-07-18 19:08:45
    IEEE754标准
  • ieee754_implementation
  • IEEE754标准浮点数转换

    万次阅读 多人点赞 2018-08-02 16:13:13
    IEEE754标准是一种浮点数表示标准,一般分为单、双精度两种,单精度是32位的二进制数,双精度是64位的二进制数,一个浮点数的组成分为三个部分 ①第1位是数符s,s=1表示负数,s=0表示正数。 ②第2-9位为阶码E, (双...
  • 十进制转IEEE754浮点

    2020-12-08 14:11:38
    编写一个十进制数转IEEE754标准浮点数程序。输入一个有符号十进制数,输出一个IEEE754标准浮点数。
  • <br />本文主要介绍了什么是IEEE745标准,IEEE 754标准规定了什么?... 最权威的解释是IEEE754标准本身ANSI/IEEE Std 754-1985《IEEE Standard for Binary Floating-Point Arithmetic》,网
  • IEEE 754 浮点数标准

    2021-02-20 18:27:36
    IEEE 754 浮点数标准 本文是转载,阅读之后的补充如下,供大家参考: 1、 2、 IEEE 754标准的主要起草者是加州大学伯克利分校数学系教授William Kahan,他帮Intel公司设计了8087浮点数处理器(FPU),并...
  • 浮点数IEEE754标准

    2018-08-25 20:34:41
    2008-IEEE754浮点数标准文件,英文版本 共11章节,包含浮点数格式、运算等
  • IEEE754浮点数

    2015-03-26 14:44:41
    详细讲解了IEEE754标准对浮点数的定义,很专业,值得拥有。
  • IEEE 754 compatiblity

    2020-12-08 21:04:22
    <div><p>Does this library conform to IEEE 754, insofar as the instructions it uses do? If so, could this be noted (prominently) in the readme?</p><p>该提问来源于开源项目:JuliaMath/openlibm</p>...

空空如也

空空如也

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

ieee754