`

浮点数

 
阅读更多

http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

 

1.浮点数与定点数

在计算机系统的发展过程中,业界曾经提出过许多种实数的表达方法,比较典型的有相对于浮点数(Floating Point Number)的定点数(Fixed Point Number)。在定点数表达法中,其小数点固定地位于实数所有数字中间的某个位置。例如,货币的表达就可以采用这种表达方式,如 55.00 或者 00.55 可以用于表达具有 4 位精度,小数点后有两位的货币值。由于小数点位置固定,所以可以直接用 4 位数值来表达相应的数值。

但我们不难发现,定点数表达法的缺点就在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。因此,最终绝大多数现代的计算机系统都采纳了所谓的浮点数表达法。

 

2.浮点数表示法

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
(2)M表示有效数字,大于等于1,小于2。
(3)2^E表示指数位。

举例来说,十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。

十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。

 

IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

 

3.浮点数表示法中的特别规定

IEEE 754对有效数字M和指数E,还有一些特别规定。

M

前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

E

首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

 

然后,指数E还可以再分成三种情况:

(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

 

4.精度

常说的java中单精度浮点数float的有效数字8位,double的有效数字为16位,这是怎么回事呢。float的长度为32位,所以M是23+1位。所以M能够表达的最大值为2^24-1=16777215。所以我们说的有效数字8位指的是十进制,其实就是二进制有效数字24位。不过其实这个十进制有效数字8位的说法也不准确,因为一旦数字超过16777215就不能保证准确表达。比如:

float a = 16777215;
float b = 16777216;
float c = 16777217;
float d = 33554432;
float e = 335522222;
System.out.println(a);//1.6777215E7
System.out.println(b);//1.6777216E7
System.out.println(c);//1.6777216E7
System.out.println(d);//3.3554432E7
System.out.println(e);//3.35522208E8

 解释:(下文中M值把前面默认1带上)

a:实际值为 1111 1111 1111 1111 1111 1111  ,  M值为 1111 1111 1111 1111 1111 1111  , E为23+127:1001 0110  , 最终值为 1.1111 1111 1111 1111 1111 1111 * 2^23

b:实际值为 1 0000 0000 0000 0000 0000 0000  , M截取前24位为 1000 0000 0000 0000 0000 0000  , E为24+127: 1001 0111  ,  最终值为 1.0 * 2^24

c:实际值为 1 0000 0000 0000 0000 0000 0001  , M截取前24位为 1000 0000 0000 0000 0000 0000  , E为24+127: 1001 0111   ,  最终值为 1.0 * 2^24

d:实际值为 10 0000 0000 0000 0000 0000 0000  , M截取前24位为 1000 0000 0000 0000 0000 0000  , E为25+127: 1001 1000   ,  最终值为 1.0 * 2^24

d:实际值为 1 0011 1111 1111 1010 1001 1010 1110  , M截取前24位为 1001 1111 1111 1101 0100 1101  , E为28+127:   1001 1011   ,  最终值为 1.001 1111 1111 1101 0100 1101  * 2^28

分享到:
评论

相关推荐

    浮点数(单精度浮点数,双精度浮点数)

    浮点数(单精度浮点数,双精度浮点数) 浮点数是一种数字表示方法,用于近似表示任意实数。在计算机中,浮点数由一个整数或定点数(即尾数)乘以某个基数(通常是 2)的整数次幂得到。这种表示方法类似于基数为 10 ...

    float_2_char.zip_C51 float转char_单片机 浮点数_浮点数 char_浮点数 转换_浮点数转换

    `float_2_char.zip` 提供的代码着重解决了单片机中浮点数(`float`)与字符型(`char`)之间的转换问题,这对于节省存储空间、提高通信效率以及降低错误率非常有用。下面将详细介绍浮点数与字符型之间的转换原理和...

    64位浮点数与32位整数或32位浮点数之间的相互转换(V17版本仅限1500系列PLC使用).zip

    此外,当涉及到32位整数和32位浮点数之间的转换时,整数转浮点数时可能会因为浮点数的精度而产生非预期的结果,而浮点数转整数时可能因四舍五入规则产生误差。因此,在编写程序时,应充分考虑这些潜在问题,并进行...

    十六进制转浮点数,十六进制转浮点数在线,LabView

    本文将深入探讨十六进制到浮点数的转换,特别是在LabVIEW环境下的实现。LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是由美国国家仪器公司(NI)开发的一种图形化编程语言,广泛应用于工程、...

    TMS320C3x浮点数简介、IEEE754的32位转VC33的32位浮点数算法、IEEE754的64位浮点数转VC33的40位浮点数算法

    在数字信号处理领域,浮点数运算在许多高级计算任务中扮演着重要角色。TMS320C3x是一款由德州仪器(TI)推出的数字信号处理器(DSP),它支持浮点运算,使得复杂的数学计算得以高效执行。本文将深入探讨TMS320C3x中...

    浮点数转换工具(十六进制转浮点数)

    浮点数转换在计算机科学中是一项基础且重要的概念,特别是在编程和数字处理领域。浮点数,顾名思义,是指可以表示小数部分的数值,与整数相对。它们在计算机内部通常以二进制浮点数的形式存储,遵循IEEE 754标准。这...

    C语言浮点数转字符串_C语言浮点数字符串_浮点数转换_

    在C语言中,将浮点数转换为字符串是一项常见的任务,尤其在需要将数值数据输出到文件或屏幕上时。这个过程通常涉及到`printf`函数家族的使用,它们能够按照指定的格式将各种类型的数据转化为可读的字符串。本文将...

    S7-200SMART_双精度浮点数转换为单精度浮点数库文件及使用说明.rar

    本文将详细介绍如何使用S7-200SMART进行双精度浮点数到单精度浮点数的转换,并提供相应的库文件及使用说明。 1. **浮点数类型**: 浮点数在计算机中分为单精度浮点数(32位,IEEE 754标准)和双精度浮点数(64位,...

    三菱PLC浮点数运算指令

    在三菱PLC编程中,浮点数运算指令是非常重要的功能,因为工业控制中的许多参数和变量都需要进行浮点数运算。在三菱PLC中,浮点数运算指令能够处理32位的浮点数,并进行比较、变换、四则运算、开方运算以及三角函数...

    javaScript实现浮点数转十六进制字符

    JavaScript实现浮点数转十六进制字符的过程涉及到了浮点数的表示、IEEE 754标准、二进制与十六进制的转换等多个知识点。由于JavaScript直接使用浮点数转十六进制的功能实现并不直接,因此需要借助其他方法来实现。...

    S7-200SMART 64位浮点数转32位浮点数(源文件+库文件+程序注释).rar

    在处理数值计算时,有时我们需要将不同精度的浮点数进行转换,如将64位浮点数转换为32位浮点数。这个过程涉及到浮点数的表示方式、数据类型的转换以及可能的精度损失问题。 64位浮点数,也称为双精度浮点数(Double...

    十六进制数转换为浮点数浮点数转换

    在计算机科学中,十六进制(Hexadecimal)和浮点数(Floating Point)是两种不同的数值表示方式。十六进制是一种逢16进1的数制,常用于编程和计算机内存中表示数据,因为它可以更紧凑地表示二进制数。而浮点数则是一...

    浮点数与16进制转换(含源代码)_单片机_浮点数_转换_十六进制_实数_

    浮点数与十六进制转换在计算机科学,尤其是单片机编程中,是常见的数据处理操作。浮点数是一种表示实数的方式,它包括一个符号位、指数部分和尾数部分,而十六进制(Hexadecimal)是数字系统中的一种表示方式,常...

    双精度浮点数转换

    在计算机科学中,浮点数是一种用于表示数值的近似方式,主要分为单精度浮点数和双精度浮点数。这些数据类型广泛应用于各种计算,特别是在需要处理大量精确度和范围的数学运算中,例如科学计算、图像处理和游戏开发。...

    库卡机器人浮点数转换.docx

    在上述文档中,我们看到的是如何将浮点数在库卡机器人和PLC之间进行转换和通信的过程。浮点数是一种用于表示带有小数的数值类型,通常在计算和精度要求较高的应用中使用。以下是对这一过程的详细说明: 1. **变量...

    HEX与浮点数相互转换

    标题中的“HEX与浮点数相互转换”指的是在计算机科学中处理数字时的一个常见操作。HEX(十六进制)是计算机中广泛使用的数字表示方式,尤其在内存和CPU指令中,而浮点数则用于表示带有小数部分的数值,常用于科学...

    IEEE754浮点数_数值转换_浮点数转换_

    IEEE754浮点数标准是计算机科学中用于表示和操作浮点数的国际标准,由电气和电子工程师协会(IEEE)制定。这个标准对于数字计算的精确性和可移植性至关重要,广泛应用于现代计算机系统、编程语言以及硬件处理器。在...

    浮点数与二进制转换工具

    浮点数与二进制转换在计算机科学中是至关重要的概念,特别是在通信开发、数据存储和计算领域。本文将深入探讨浮点数和二进制之间的转换,以及如何利用工具进行这种转换。 浮点数是一种表示实数的方式,它允许在有限...

    TIA博途-截取浮点数-自定义小数位数-全局FC库文件-V17版本-GF-截取浮点数-自定义小数点后位数.zip

    本篇将详细讲解如何在TIA博途V17版本中,利用全局功能块(FC,Function Block)库文件实现对浮点数的截取,并自定义小数点后的位数。 首先,浮点数在PLC编程中常用于处理需要较高精度的数值运算。在TIA博途V17中,...

    浮点数二进制互转小工具

    浮点数在计算机科学中扮演着至关重要的角色,特别是在数值计算、图形处理和科学计算等领域。浮点数的表示方式是基于二进制的,但为了方便人类阅读和理解,通常我们使用十进制形式。浮点数与二进制之间的转换是理解和...

Global site tag (gtag.js) - Google Analytics