精华内容
下载资源
问答
  • 2021-09-13 16:16:42

    浮点数格式如下:
    S-E-M
    S:表示数符,0代表+,1代表-;
    E:表示阶码,用移码表示,比如2的三次方是3+127=130=1000 0010
    M:表示尾数数值
    单精度32位,阶码8位;双精度64位,阶码11位。

    单精度浮点数为实列,最高位是数符位,后面是8位阶码,以2为底,23位是尾数数值位,因为最高位总是1,将1隐含,实际尾数是24位的,实际尾数的有效值是1.M。

    规格化的单精度浮点数真值为:
    N = (-1)的s次方* 1.M * 2的E次方减127次方
    规格化的双精度浮点数的真值为:
    N=(-1)的s次方* 1.M*2的E次方减1023次方

    本文全是算的是32位的单精度浮点小数的转换
    实列:(20.59375)10进制 转浮点数
    先(20.59375)10进制 = (10100.10011)2进制
    将尾数规范为1.M的形式:10100.10011=1.01001001*2的4次方,因为小数点左移4位所以是2的4次方,即指数e=4
    可得:M=01001001,因为把最高位隐藏了
    ,S=0,因为这个真值是正数,所以数符等于0,
    E=4+127=131=1000 0011。
    因此,32位的二进制浮点数格式:
    S-E-M:
    0(数符)10000011(阶码)01001001100000000000000(尾数)
    尾数后面补0

    在把0(数符)10000011(阶码)01001001100000000000000(尾数)转回真值:
    即S=0,E=1000 0011-127=4,1.M=1.010010011(因为尾数最高位隐藏了1,所以加回来)。
    浮点数N=(-1)s的次方1.M2的E-127的次方=(-1)的0次方1.0100100112的4次方=1*1.287109375(注意把这个尾数换成10进制数,在拿来乘)× 16=20.59375的十进制真值。

    更多相关内容
  • IEEE754浮点数转换

    2011-12-02 10:54:09
    IEEE754浮点数和十六进制数的相互转换,非常好。有利于初学者学习
  • 根据IEEE754协议手动编程,源代码无加密,请放心下载 2012以上版本
  • 网上搜索了一下,发现有很多人在搜索这个转换的。但没有一个有互换功能,所以就自己手动写了一个,拿给有需要的人;IEEE754浮点数转整数;整数转浮点数的源码,
  • C# IEEE754浮点数转换示例代码

    热门讨论 2012-11-11 17:46:07
    c# IEEE754浮点数转换,已通过测试。实现浮点数与整型字节的相互转换,用于MODBUS协议的开发。
  • 自己用Qt5.4.1的Qt Creator开发的IEEE754浮点数与十六进制数转换器,可以供Qt初学者学习槽函数的用法,也可以学习IEEE754浮点数与十六进制数转换的算法。两个文本框关联,实时将浮点数与十六进制数互相转换,代码...
  • IEEE754浮点数转换软件

    热门讨论 2011-11-03 16:58:32
    能查看浮点数内部存储和读取方式,HEX转DOUBLE DOUBLE转HEX
  • Qt写的IEEE754浮点数与十六进制数转换器。这是exe程序,没有网站在线转换的好,在没网的时候可以用这个
  • VB小工具,免费使用,实现float数据与四字节数据相互转化以及Double数据与八字节数据相互转化。
  • 32位浮点数转换十六进制数,一个四字节十六进制数可按四种顺序转换成32位浮点数,方便串口通讯时的数据正误预判。
  • IEEE754浮点数转换器(C#实现)

    热门讨论 2010-03-29 19:47:23
    学习计算机组成原理时实现的IEEE754标准的浮点数的机器数转换器,只要填入十进制浮点数值,便可以求出单精度的IEEE754标准的机器数表示方法,反之,给出IEEE754的机器数,可以求出其对应的十进制浮点数值
  • IEEE754 浮点数 小工具

    2014-10-22 11:19:44
    用来在桌面上计算IEEE754各种浮点类型数值同二进制字节之间的转换. 方便片上系统作显示/协议换算. 帮助里有联系方式, 需要源码的可以直接联系我.
  • IEEE754 浮点数计算器

    2018-03-25 10:21:11
    IEEE754 浮点数计算器 。。。。。。。。。。。。。。。。。。。。。。。
  • Modbus IEEE754 浮点数 转换 方法 VB 代码 使用VB6把MODBUS协议中的32位整数,变换为浮点数 MODBUS协议 数据 转换 IEEE754 Float Long
  • float2bin:将十进制浮点数转换IEEE 754 二进制字符串 bin2float:将二进制字符串转换为浮点数 bitstr2vec:将二进制字符串转换为 0 和 1 的二进制向量 bitvec2str:将二进制向量转换为二进制字符串 这篇文章...
  • VB.Net源码,通过获取文本框中浮点数转换IEEE754 格式。非常适合需要格式转换的朋友使用。
  • Public Function MODBUSFloattoLong32(inputS As Single) As String 'IEEE754标准 浮点格式转换 我看网上介绍需要把整数部分和小数部分分开转成二进制,太复杂了,其实有非常简单的方法,看程序就知道了。相互学习。
  • IEEE754浮点数

    2021-03-08 10:13:11
    前言Go语言之父Rob Pike大神曾吐槽:不能掌握正则表达式或浮点数就不配当码农!You should not be permitted to write production code if you do not have an journeyman license inregular expressions or ...

    前言

    Go语言之父Rob Pike大神曾吐槽:不能掌握正则表达式或浮点数就不配当码农!

    You should not be permitted to write production code if you do not have an journeyman license in regular expressions or floating point math.

    此前使用Java写Spark SQL业务时,也有遇到浮点数比较问题即x>70的记录行居然出现了70的记录,尽管SQL做了类型转换再比较也无济于事....

    因此了解浮点数是很有必要的哟~~

    什么是浮点数

    电气和电子工程师协会IEEE对于计算机浮点数的存储、运算、表示等推出了IEEE754标准!

    标准中规定:

    float32位单精度浮点数在机器中表示用 1 位表示数字的符号,用 8 位表示指数,用 23 位表示尾数。

    double64位双精度浮点数,用 1 位表示符号,用 11 位表示指数,52 位表示尾数。

    其中指数域也称为阶码。浮点数存储字节定义如图:

    b9f51e8f02528b240a66ff395d4ffc32.png

    浮点数正规化

    尾数不为0时,尾数域的最高有效位为1,这称为规格化。否则,以修改阶码同时左右移动小数点位置的办法,使其成为规格化数的形式。

    浮点数x真值表示:

    x=(−1)S×(1.M)×2e

    float:    e=E−127

    double:     e=E−1023

    S  符号位    0表示正 1表示负

    e  指数位    阶码E减去移码

    M 尾数位    二进制形式移码

    移码

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

    对于定点整数,计算机一般采用补码的来存储。

    正整数的符号位为0,反码和补码等同于原码。

    负整数符号位都为1,原码,反码和补码的表示都不相同,由负数原码表示法变成反码和补码有如下规则:

    (1)原码符号位为1不变,整数的每一位二进制数位求反得反码;

    (2)反码符号位为1不变,反码数值位最低位加1得补码。

    比如,以一个字节来表示-3,那么[−3]原=10000011 [−3]反=11111100 [−3] 补=11111101  [−3]移=01111101

    6d1724c4042f554df19ffda417ac5cc4.png

    举个栗子

    【3.14的单精度浮点数表示】

    首先将3.14转成二进制:

    整数部分3的二进制是11

    小数部分0.14的二进制是:0.0010001111010111000010[10001111.....](方括号中表示小数点后第23位及之后)

    这样,3.14的二进制代码就是:11.0010001111010111000010[10001111....]×20

    那么用正规化表示就是:1.10010001111010111000010[10001111....]×21

    方括号表示的超出23位之后的二进制部分,由于单精度浮点数尾数只有23位,所以需要舍入(舍入方法见后)

    由于第24位为1,且之后 不全为 0,所以需要向第23位进1完成上舍入:1.10010001111010111000011×21

    而其指数是1,需要加上移码127,即128,也就是1000 0000

    它又是正数,所以符号为0

    综上所述,3.14的单精度浮点数表示为:

    0 1000-0000 1001-0001-1110-1011-1000-011

    S符号位0

    e指数位1000-0000

    M尾数位1001-0001-1110-1011-1000-011

    十六进制代码为:0x4048F5C3

    误差

    通过栗子可知,3.14的单精度浮点数表示是0 1000-0000 1001-0001-1110-1011-1000-011。现在我们来还原,看看它的误差:

    指数是128,那么还原回去(减去移码),实际指数就是1

    尾数还原也就是:10010001111010111000011,所以正规化形式是:1.10010001111010111000011×21

    也就是11.0010001111010111000011

    利用二进制转十进制,可得它对应的十进制数是:3.1400001049041748046875  不等于3.14

    这就是为什么浮点数运算结果在业务代码中总是不可确切预期的原因!!!!

    机器ε

    机器ε表示1与大于1的最小浮点数之差。例如双精度表示1和表示大于1的最小浮点数

    7562f09165a634759e6d8a83c299e358.png

    c00e28d16b0493e04bdec0b6f41b8b80.png

    双精度浮点数的机器ε = 2-52≈ 2.220446049250313e-16

    同理,单精度的机器ε = 2-23≈ 1.1920928955078125e-7

    在舍入规则中,相对舍入误差不能大于机器ε的一半。

    非正规化

    单精度浮点数为例

    (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。因为浮点数的真值等于

    x=(−1)S×(1.M)×2e

    e=E−127

    那么

    +0的机器码真值为  1.0×2−127

    -0机器码真值为  −1.0×2−127

    (2)无穷的表示

    如果阶码E=255 并且尾数M全是0,则这个数的真值为±∞(同样和符号位有关)。

    因此

    +∞的机器码为:0 11111111 000 0000 0000 0000 0000 0000

    -∞的机器吗为:1 11111111 000 0000 0000 0000 0000 0000

    (3)NaN(Not a Number)

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

    舍入规则

    以23位尾数位的单精度浮点数为例,舍入时需要重点参考第24位

    若第24位为1,且第24位之后全部为0。此时就要使第23位为0:若第23位本来就是0则不管,若第23位为1,则第24位就要向第23位进一位,这样第23位就可以为0

    若第24位为1,且第24位之后不全为0,则第24位就要向第23位进一完成上舍入。

    若第24位为0,此时直接舍去不进位,称为下舍入。

    再来个栗子

    JavaScript console 双精度浮点数

    >>9.4 - 9 - 0.4 === 0

    <

    >>(9.4-9-0.4).toFixed(20)

    <

    9.4-9-0.4不严格等于0,其运算结果误差。

    因为按照上面的浮点数知识可知

    9.4在机器内被表示为:9.4+0.2×2-49

    0.4被表示为:0.4+0.1×2-52

    当9.4-9时(因为9是整数是可以精确存储的)得0.4+0.2×2-49,再减去0.4+0.1×2-52得3×2-53,约等于"0.00000000000000033307"。

    详细解释:

    9的二进制是1001,而0.4的二进制是0.0110-0110-0110-……无限循环的。从而9.4的二进制是1001.0110-0110……,正规化以后就变成 1.001-0110-0110-……×2^3,

    因为双精度浮点数是52位尾数,所以小数部分保留0.001-0110-0110-……-0110-0 [110-0110-0110-……]。即001后跟12个0110循环节,然后第52位是0,中括号表示从

    第53位起开始舍弃的部分。根据我提到的舍入规则,第53位1且后面不全为0,要向第52位完成上舍入,所以小数部分就变成 0.001-0110-0110-……-0110-1。至此我们

    可以看到,这个数较之9.4,由于小数部分第52位由0变为1,所以多加了2-52,但是因为从小数部分第53位开始舍弃了,舍弃部分是 0.1100-1100-…×2-52= 0.8×2-52。

    所以我们多加了2-52,但是少了0.8×2-52,这就意味着,但考虑尾数部分,这个数比9.4多了 2-52- 0.8×2-52= 0.2×2-52,别忘记之前还有一个2^3,所以整

    体多了0.2×2-52×2^3= 0.2×2-49

    这就是为什么9.4在机器内被表示为:9.4+0.2×2-49

    同理,0.4在机器内被表示为:0.4+0.1×2-52

    展开全文
  • IEEE754浮点数精度转换

    2020-12-23 22:20:04
    最近在利用串口读取温度采集模块上面的数据时发现返回过来的数据是16进制的IEEE754类型,很...这时我们就需要了解浮点数在计算机中是如何表示的了:在计算机中,浮点数的存储均采用4字节的IEEE-754格式,如,浮点...

    最近在利用串口读取温度采集模块上面的数据时发现返回过来的数据是16进制的IEEE754类型,很显然这不是我们想要看到的,因此我们必须对他进行解析:

    因为我用的是Java,所以首先翻了相关文档,发现还真提供的有:

    Float.intBitsToFloat(hex)

    当然自己也可以手写一个,这时我们就需要了解浮点数在计算机中是如何表示的了:

    在计算机中,浮点数的存储均采用4字节的IEEE-754格式,如,浮点数32.375的IEE表示形式如下

    Java代码实现:

    public static double transfer(String hexStr){

    StringBuffer binaryStr = new StringBuffer();

    for(int i=0;i< hexStr.length();i+=2){

    String a = hexStr.substring(i,i+2);

    int c = Integer.parseInt(a,16);

    String item = String.format("%08d",Integer.parseInt(Integer.toBinaryString(c)));

    binaryStr.append(item);

    }

    int n = Integer.parseInt(binaryStr.substring(1,9),2);

    String mStr = binaryStr.substring(9,binaryStr.length()-1);

    double sum = 0;

    for(int i =1;i<=mStr.length();i++){

    if(mStr.charAt(i-1)=='1'){

    sum = sum+Math.pow(0.5,i);

    }

    }

    double a =( Math.pow(2,n-127))*(1+sum);

    return a;

    }

    Python代码实现

    def transfer(hexStr):

    ret = str();

    for x in range(0,len(hexStr),2):

    a = hexStr[x:x+2];

    intItem = int(a,16);

    binnaryStr = bin(intItem)[2:len(bin(intItem))];

    binnaryStr = "%(binnary)08d"%{'binnary':int(binnaryStr)}

    ret = ret+binnaryStr;

    s= int(ret[0]);

    n = int(ret[1:9],2);

    mStr = ret[9:len(ret)-1];

    m = float();

    print(mStr);

    for x in range(1,len(mStr)-1,1):

    if mStr[x-1] == "1":

    print(x);

    m=m+math.pow(0.5,x);

    val = math.pow(-1,s)*(math.pow(2,n-127))*(1+m);

    print(val)

    return ret;

    展开全文
  • 输入十进制浮点数,可转换IEEE-754标准的数据,也可以将IEEE-754标准的数据转换成十进制浮点数,非常好用的小工具
  • IEEE754标准浮点数转换

    千次阅读 2020-12-07 16:31:13
    IEEE754标准浮点数转换 IEEE754标准是一种浮点数表示标准,一般分为单、双精度两种,单精度是32位的二进制数,双精度是64位的二进制数,一个浮点数的组成分为三个部分。 ①第1位是数符s,s=1表示负数,s=0表示正数...

    原文:https://blog.csdn.net/hqh131360239/article/details/81353582

    IEEE754标准浮点数转换

    IEEE754标准是一种浮点数表示标准,一般分为单、双精度两种,单精度是32位的二进制数,双精度是64位的二进制数,一个浮点数的组成分为三个部分。

    • ①第1位是数符s,s=1表示负数,s=0表示正数。
    • ②第2-9位为阶码E, (双精度为2-12位)
    • ③第10-32位为尾数M (双精度为13-64位)

    转换大致过程如下:
    首先将十进制数转为二进制数,用类似于科学计数法的形式表示成
    num=(-1)^s (1+M) 2^(E-127)(单精度)
    num=(-1)^s (1+M) 2^(E-1023)(双精度)
    然后将每部分算出的数值按顺序排列
    例如:
    -0.0625=-0.0001=-1.0*2^(-4)
    s=1,M=1-1=0,E=-4 +127=123=0111 1011 ,E(双精度)=-4 +1023=1019 =0111 1111 011
    单精度:1011 1101 1000 0000 0000 0000 0000 0000 (S E M顺序)
    双精度:1011 1111 1011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

    浮点数转换二进制

    举例:22.8125转二进制,这样计算:
    整数和小数分别转换。
    整数除以2,商继续除以2,得到0为止,将余数逆序排列。

    22 / 2    11 余 0
    11 / 2     5 余 1
    5 / 2      2 余 1
    2 / 2      1 余 0
    1 / 2      0 余 1
    

    所以22的二进制是10110
    小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。

    0.8125x2=1.625 取整1,小数部分是0.625
    0.625x2=1.25 取整1,小数部分是0.25
    0.25x2=0.5 取整0,小数部分是0.5
    0.5x2=1.0 取整1,小数部分是0,结束
    

    所以0.8125的二进制是0.1101
    十进制22.8125等于二进制10110.1101
    工具1: http://www.styb.cn/cms/ieee_754.php
    工具2: http://www.speedfly.cn/tools/hexconvert/

    思路

    第一步求二进制,负数按照正数处理,不用考虑原反补,s代表正负(正负数转换后只是第一位不同)
    第二步按照公式计算S、E、M,其中E是需要转换成二进制的,但是M并不需要不够的后面补0。
    比如:22.8125等于二进制10110.1101
    22.8125—>10110.1101–>1.01101101* 2^4
    单精度:S=0,E=4+127=131(8位),M=0.01101101(23位)
    ans=0 10000011 01101101000000000000000
    双精度:S=0,E=4+1023=1027(10位) M=0.01101101 (53位)
    ans=0 1000000011 01101101000000000000000000000000000000000000000000000

    GPS坐标工具:https://www.sunearthtools.com/dp/tools/conversion.php?lang=cn#help_Format

    展开全文
  • 大部分编程语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE 754问世之前就有的C语言,现在有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。 ...
  • IEEE标准754浮点数转换【代码篇】

    千次阅读 2019-09-05 10:06:52
    编写一个程序,找出32位单精度IEEE 754浮点表示的给定实数,反之亦然。 示例: Input: real number = 16.75 Output: 0 | 10000011 | 00001100000000000000000 Input: floating point number = 0 | 10000011 | ...
  • IEEE754 浮点数:简读+案例=秒懂

    千次阅读 多人点赞 2020-09-20 21:32:37
    IEEE754 浮点数:简读+案例=秒懂 在IEEE 754 格式浮点数由 3 个部分组成,分别是 符号码,阶码,尾数码,对应部分所占位数如图 1-1 所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 图 ...
  • static quint32 toUint(const QByteArray &data, bool bigEndian) { if (data.size() != 4) return 0; quint32 word = 0; ... if (bigEndian) { word = quint32((quint8(data.at(0)) <...
  • IEEE 754浮点数转换,不断完善中。。。
  • C# IEEE754浮点数转换方法

    千次阅读 2018-03-28 11:21:08
    ref: https://blog.csdn.net/jvouge/article/details/589417416进制转换为10进制的公式如下: SGL = (-1)^SIGN * 1.MANTISSA * 2^(EXPONENT-...字节转换浮点数int data1=0x41; int data2=0x45; int data3=0x70...
  • 根据IEEE754浮点数与十进制数互相转换原理编写,可以实现数据转换验证。
  • 十进制转IEEE754浮点

    2020-12-08 14:11:38
    编写一个十进制数转IEEE754标准浮点数程序。输入一个有符号十进制数,输出一个IEEE754标准浮点数

空空如也

空空如也

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

ieee754浮点数转换

友情链接: yaokong.rar