单精度浮点数与机器精度解析
单精度浮点数的转换和解析
单精度浮点数的转换和解析
单精度浮点数是计算机中用于表示带有小数的数值的数据类型之一,它使用32位二
进制数进行表示。本文将介绍单精度浮点数的转换和解析方法。
单精度浮点数采用IEEE 754标准进行表示。其中,32位字长分为三部分:符号位、
指数位和尾数位。
符号位:用于表示正负号,0为正,1为负。
指数位:用于表示数值的大小,采用二进制补码表示。在单精度浮点数中,指数位占
8位。
单精度浮点数的结构示意图如下:
+---+----------+------------------+
|符号位|指数位| 尾数位 |
+---+----------+-----------------+
其中,指数位和尾数位之间还存在一个偏移量,用于对指数位进行偏移,以使其能够
表示正负数。
在计算机中,单精度浮点数的数值是以二进制形式存储的,因此我们需要进行二进制
到十进制的转换才能将其转化为可读的数值形式。
(1)将单精度浮点数的符号位、指数位和尾数位分别取出,并转换为二进制数,得
到一个32位(共32个0或1)的二进制数。
(3)将得到的十进制数按照以下公式进行计算:
value = (-1) ^ sign * (1 + fraction) * 2^(exponent - bias)
其中,sign表示符号位(0为正,1为负),fraction表示尾数位转换得到的十进制数,exponent表示指数位转换得到的十进制数,bias为偏移量(单精度浮点数中为127)。
解析单精度浮点数,即将一个十进制数转换为单精度浮点数格式的二进制数。
(1)首先确定数值的符号位。如果数值为正,则符号位为0,否则为1。
单精度 整型取值范围
单精度整型取值范围
【实用版】
目录
1.单精度浮点数的概念
2.单精度浮点数的取值范围
3.整型取值范围
4.单精度与整型的比较
正文
【1.单精度浮点数的概念】
单精度浮点数(Single Precision Floating Point Number)是一种计算机中表示实数的方式,它使用 32 位二进制数来表示一个实数,其中1 位表示符号,8 位表示指数,23 位表示尾数。这种表示方法可以在保证较高精度的同时,减少存储空间的占用。
【2.单精度浮点数的取值范围】
单精度浮点数的取值范围为:-1.4E-45 ≤ x ≤ 3.4028235E38,有效位数为 7 位。这意味着,单精度浮点数可以表示约±1.4 乘以 10 的-45 次方到±3.4028235 乘以 10 的 38 次方之间的实数。
【3.整型取值范围】
整型(Integer)是一种计算机中表示整数的数据类型。在不同的编程语言和计算机体系结构中,整型的取值范围可能有所不同。以 C 语言为例,它的整型取值范围为:-2147483648 ≤ x ≤ 2147483647。这意味着,整型可以表示从 -2147483648 到 2147483647 之间的整数。
【4.单精度与整型的比较】
从取值范围上看,单精度浮点数的取值范围远大于整型的取值范围。
这意味着,单精度浮点数可以表示更多的数值,特别是在科学计算和大数据处理等领域,单精度浮点数具有更高的精度和更广泛的应用。然而,在需要精确表示整数的情况下,整型是更为合适的选择。
总之,单精度浮点数和整型在取值范围和应用场景上各有特点。
单精度浮点数的精度
单精度浮点数的精度
在计算机科学中,浮点数是一种用来表示实数(包括小数)的数值格式。单精度浮点数是一种常见的浮点数格式,它在计算机中占用32位的存储空间,能够表示的范围较广。
然而,单精度浮点数的精度相对较低。它的精度受到两个主要因素的限制:尾数位数和指数范围。
首先,单精度浮点数的尾数只有23位,这就意味着它能够表示的小数部分的精度有限。当小数位的精度要求超过23位时,单精度浮点数就无法精确表示了。这种情况下,会发生舍入误差,导致结果的精确度下降。
其次,单精度浮点数的指数范围也是有限的。它的指数部分占用了8个位,因此能够表示的指数范围为-126到127。这就意味着当需要表示非常大或非常小的数字时,单精度浮点数也会产生精度损失。超出指数范围的数字将被舍入或近似表示,从而引入进一步的误差。
由于这些限制,单精度浮点数在某些应用中可能不够精确。例如,在金融领域或需要高精度计算的科学研究中,使用双精度浮点数(64位)或其他更高精度的数值格式更为常见。这些格式能够提供更高的精度,并减少舍入误差。
然而,单精度浮点数也有它的优势。它的存储需求更小,能够更高效地使用计算机的内存和处理能力。在许多实时应用中,如图形处理、嵌入式系统和游戏开发中,单精度浮点数已经足够满足需求,并且能够提供良好的性能。
总而言之,单精度浮点数的精度相对较低,受到尾数位数和指数范围的限制。在某些应用中,可能需要使用更高精度的数值格式来确保计算结果的准确性。然而,在许多实时应用中,单精度浮点数仍然是一个高效且可靠的选择。
单精度和双精度的取值范围
单精度和双精度的取值范围
单精度和双精度是计算机中用于表示浮点数的两种格式。在计算机中,浮点数被用来表示实数,包括整数和小数。单精度和双精度的取值范围决定了计算机能够表示的最大和最小的浮点数。
单精度(float)是一种用32位二进制表示的浮点数格式。它由三个部分组成:符号位、指数位和尾数位。符号位用来表示数的正负,0代表正数,1代表负数。指数位用来表示浮点数的指数部分,尾数位用来表示浮点数的小数部分。单精度的取值范围大约为±3.4E38,即正负3.4乘以10的38次方。
双精度(double)是一种用64位二进制表示的浮点数格式。它与单精度类似,也由三个部分组成:符号位、指数位和尾数位。双精度的取值范围大约为±1.8E308,即正负1.8乘以10的308次方。
单精度和双精度的取值范围之所以不同,是因为它们使用的位数不同。单精度使用32位,双精度使用64位。由于双精度使用更多的位数来表示浮点数,所以它能够表示的范围更大。
在实际应用中,单精度和双精度的取值范围是非常重要的。如果数值超出了浮点数的取值范围,就会发生溢出或下溢的情况,导致结果不准确。因此,在进行计算时,需要根据实际情况选择合适的浮点数格式。
例如,在科学计算中,需要处理非常大或非常小的数值,这时应该选择双精度浮点数来保证计算的准确性。而在一些对精度要求不高的应用中,可以选择单精度浮点数来节省内存空间。
除了取值范围之外,单精度和双精度还有精度的区别。单精度的精度约为7位有效数字,而双精度的精度约为15位有效数字。有效数字是指一个数中有效的数字个数,即除去前导零和末尾的零之后,剩余的数字个数。
单精度浮点数的定义形式
单精度浮点数的定义形式
单精度浮点数是一种数据类型,用于在计算机系统中表示有小数部分的实数。它的定义形式由三个主要部分构成:符号位、指数部分和尾数部分。每个部分用特定的位数来表示,以便在计算机中进行存储和运算。
在单精度浮点数中,总共有32位(bit)的存储空间来表示一个数值。这32位被划分为三个不同的部分:1位用于表示符号位,8位用于表示指数部分,以及剩下的23位用于表示尾数部分。
首先,符号位用来表示数值的正负。0表示正数,1表示负数。这一位通常是最高位,也就是第32位。
接下来是指数部分,它用来表示数值的指数。通常使用的是移码表示法,也就是将指数的真值加上一个偏移值来表示。在单精度浮点数中,偏移值为127。例如,如果指数部分的8位值为01111111,那么其真值为127-127=0。如果指数部分的8位值为10000000,那么其真值为128-127=1。这样,通过指数部分,我们可以表示从-126到127的指数范围,而不是从0到255的指数范围。
最后是尾数部分,它用来表示数值的小数部分。在单精度浮点数中,尾数部分由23位组成。尾数部分通常使用二进制小数表示法,也就是将小数点后的数值转化为二进制表示。例如,如果尾数部分的23位值为01010101010101010101010,那么其对应的小数值为
0.333333343。
综合起来,单精度浮点数可以表示的数值范围很广。它可以表示从接近0的很小的数值到接近无穷大的很大的数值。具体的数值范围取决于指数部分的取值范围。
需要注意的是,单精度浮点数是一种近似表示的方法,而不是精确表示。由于浮点数的存储空间有限,无法用精确的方式来表示所有的实数。因此,在对浮点数进行运算和比较时,可能会出现舍入误差和精度损失的情况。
单精度浮点数的转换和解析
单精度浮点数的转换和解析
单精度浮点数的转换和解析
工业现场通信经常遇到浮点数解析的问题,如果需要自己模拟数据而又不懂浮点数解析的话会很麻烦!很久以前根据modbus报文格式分析得到的,供大家参考。
浮点数保存的字节格式如下:
地址+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。
浮点数作为一个十六进制数0xC1480000保存在存储区中,这个值如下:
地址+0 +1 +2 +3
内容0xC1 0x48 0x00 0x00
浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值如何转
换。
浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表所列的那样分开,例如:
地址+0 +1 +2 +3
格式SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
二进制01001000 00000000 00000000
十六进制C1 48 00 00
从这个例子可以得到下面的信息:
符号位是1 表示一个负数
幂是二进制或十进制130,130减去127是3,就是实际的幂。
尾数是后面的二进制数0000000000
在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数点到尾数的开头,得到尾数值如下: 接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为
单精度浮点型
单精度浮点型
单精度浮点型(float),在C++中,单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一
半的空间,但是当值很大或很小的时候,它将变得不精确。
codesys 浮点数类型 -回复
codesys 浮点数类型-回复
CodeSys 是一种常用的嵌入式开发平台,被广泛应用于工业自动化和控制领域。在CodeSys 中,浮点数类型是一种重要的数据类型之一。在本文中,我们将深入探讨CodeSys 中浮点数类型的特点、使用方法以及相关的注意事项等。
首先,让我们介绍一下浮点数类型在CodeSys 中的定义和特点。在CodeSys 中,浮点数类型用于表示带小数部分的数值。它可以存储非常大或非常小的数值,并具有高精度的表示能力。有两种常见的浮点数类型在CodeSys 中被广泛使用:单精度浮点数(float)和双精度浮点数(double)。其中,单精度浮点数占用4个字节,双精度浮点数占用8个字节。
浮点数类型在CodeSys 中的使用十分灵活。我们可以使用浮点数类型来进行各种算术运算,如加法、减法、乘法和除法等。此外,CodeSys 还提供了一系列的数学函数,用于处理浮点数类型的变量。这些函数包括取整函数(round、floor、ceil)、求平方根函数(sqrt)、求正弦函数(sin)、求余弦函数(cos)等等。通过使用这些函数,我们可以充分发挥浮点数类型的优势,并实现更加复杂和精确的数值计算。
在CodeSys 中,浮点数类型还具有一些特殊的数值常量。例如,正无穷大(Infinity)、负无穷大(-Infinity)和非数字(NaN)等。这些特殊的
数值常量在某些场景下非常有用,可以用于表示某些运算的结果不存在或无穷大等情况。此外,CodeSys 还提供了一些浮点数类型的特定比较函数,如判断浮点数是否等于、大于或小于另一个浮点数等。
单精度浮点数的有效位
单精度浮点数通常具有7位有效数字(在某些情况下可能是更多或更少)。这是因为单精度浮点数的标准表示法为IEEE 754,它规定了一个单精度浮点数应具有1位符号位、8位指数位和23位尾数位。
然而,这并不意味着所有单精度浮点数都有7位有效数字。有效数字的数量取决于浮点数的具体值。例如,一个非常小的数可能只有很少的有效数字,而一个非常大的数可能有更多的有效数字。
西门子数据类型
西门子数据类型
概述:
西门子数据类型是指在西门子自动化系统中使用的各种数据类型,用于存储和
处理不同类型的数据。这些数据类型包括整数、浮点数、字符串等,每种数据类型都有其特定的格式和取值范围。
1. 整数类型:
西门子数据类型中的整数类型包括有符号整数和无符号整数。有符号整数用于
表示正负整数,取值范围为-32768到32767;无符号整数用于表示非负整数,取值
范围为0到65535。整数类型可以用于表示设备的状态、计数器的值等。
2. 浮点数类型:
西门子数据类型中的浮点数类型用于表示实数,包括单精度浮点数和双精度浮
点数。单精度浮点数占用4个字节,精度为6位有效数字,取值范围为-3.4E38到3.4E38;双精度浮点数占用8个字节,精度为15位有效数字,取值范围为-1.7E308到1.7E308。浮点数类型可以用于表示温度、压力等实际物理量。
3. 字符串类型:
西门子数据类型中的字符串类型用于表示字符序列,可以包含字母、数字、特
殊字符等。字符串类型可以用于表示设备的名称、报警信息等。字符串类型的长度可以根据需求进行设置,最大长度为255个字符。
4. 时间类型:
西门子数据类型中的时间类型用于表示日期和时间,包括年、月、日、时、分、秒等信息。时间类型可以用于记录事件发生的时间、定时任务的执行时间等。时间类型的格式可以根据需求进行设置,如YYYY-MM-DD HH:MM:SS。
5. 布尔类型:
西门子数据类型中的布尔类型用于表示逻辑值,只有两个取值:真和假。布尔类型可以用于表示开关状态、报警状态等。布尔类型在内存中占用1个字节。
说明ieee754单精度浮点数表示的数值范围
说明ieee754单精度浮点数表示的数值范围
IEEE 754标准是一种用于表示浮点数的机器数学格式,这种格式具有
单精度和双精度两种模式。在本文中,我们将重点探讨单精度浮点数
表示的数值范围,以帮助读者更深入地理解这一主题。
1. IEEE 754单精度浮点数表示
IEEE 754单精度浮点数采用32位二进制表示,其中1位表示符号位,8位表示指数,23位表示尾数。根据这种表示方式,我们可以计算出
单精度浮点数的数值范围。
2. 最小正非规格化数
在IEEE 754标准中,最小正非规格化数是指尾数部分全为0,指数部
分为1的情况。根据单精度浮点数的表示方式,最小正非规格化数可
以表示为2的-126次方。
3. 最小正规格化数
最小正规格化数是指指数部分为1,尾数部分全为0的情况。根据单
精度浮点数的表示方式,最小正规格化数可以表示为2的-126次方乘以2的-23次方。
4. 最大规格化数
最大规格化数是指指数部分全为1,尾数部分全为1的情况。根据单精度浮点数的表示方式,最大规格化数可以表示为(2-2^-23)乘以
2^127。
5. 无穷大和NaN
在IEEE 754标准中,还有表示正无穷大、负无穷大和NaN的特殊情况。这些特殊情况是在计算机中处理异常情况时非常重要的。
6. 总结和回顾
通过对IEEE 754单精度浮点数表示的数值范围进行全面评估,我们可以更好地理解计算机中浮点数的表示方式。从最小正非规格化数到最大规格化数,我们可以清晰地看到单精度浮点数的数值范围。了解无穷大和NaN的表示方式也能帮助我们更好地理解计算机中浮点数的特殊情况。
PLC基本数据类型
PLC基本数据类型
引言概述:
PLC(可编程逻辑控制器)是一种常用的自动化控制设备,广泛应用于工业控
制系统中。PLC的基本数据类型是其编程的基础,对于了解和使用PLC至关重要。本文将详细介绍PLC的基本数据类型,包括整数、浮点数、位、字节、字和字符串。
正文内容:
1. 整数类型
1.1 有符号整数:PLC中的有符号整数用于表示正负数值,常用的有16位和
32位有符号整数。其中,16位有符号整数的取值范围为-32768至32767,32位有
符号整数的取值范围为-2147483648至2147483647。
1.2 无符号整数:PLC中的无符号整数仅用于表示正数值,常用的有8位和16
位无符号整数。其中,8位无符号整数的取值范围为0至255,16位无符号整数的
取值范围为0至65535。
2. 浮点数类型
2.1 单精度浮点数:PLC中的单精度浮点数用于表示带小数部分的数值,采用IEEE 754标准表示。单精度浮点数的长度为32位,可表示的范围为正负
3.4E-38
至正负3.4E+38。
2.2 双精度浮点数:PLC中的双精度浮点数用于表示更大范围和更高精度的数值,也采用IEEE 754标准表示。双精度浮点数的长度为64位,可表示的范围为正
负1.7E-308至正负1.7E+308。
3. 位类型
3.1 布尔型:PLC中的布尔型数据只有两个取值,即真(True)和假(False)。布尔型数据常用于表示开关状态、触发条件等。
3.2 位型:位型数据用于表示二进制位的状态,可以表示开关量、传感器状态等。位型数据通常用于与控制器的输入输出模块进行交互。
浮点数的表示范围和精度
浮点数的表示范围和精度
浮点数是计算机科学中非常重要的数值类型,它能够表示数值的范围和精度。浮点数的表示范围和精度不仅决定了它在应用程序中的使用范围,而且还是计算机科学领域重要的基础。
浮点数是具体数据类型,目前,主要有单精度浮点数(Single precision floating point,SPFP)和双精度浮点数(Double precision floating point,DPFP)。SPFP使用32位存储空间,而DPFP使用64位存储空间,这些存储空间分为三个部分,分别是符号位、指数位和尾数位。其中,符号位用来表示数据的正负,指数位用来表示数字的大小,尾数位主要用来表示精度,而指数位和尾数位的组合就定义了浮点数的表示范围。
SPFP的有效数字有7位,而DPFP的有效数字有15位。有效数字表明浮点数的精度,SPFP的有效数字范围是在0 ~ 9之间,而DPFP 的有效数字范围是在0 ~ 18之间。由于DPFP的精度更高,故使用这两种类型的浮点数的应用场景也有很大的不同。
SPFP在计算型语言中较为常见,比如C/C++等。因为SPFP的有效数字范围比较小,故它不太适合用于数学和科学运算,也不能用于表示大范围的数值。然而SPFP在计算速度和存储空间上比较节省,因此在日常的计算任务上得到广泛的应用,比如数据类型的定义等。 DPFP比SPFP拥有更高的精度,因而在科学计算和数学运算中得到非常广泛的应用,能够表示大范围的数值。同时,DPFP还支持更高级别的语言,比如Fortran、Pascal等,用于表示更复杂的数值,
单精度、双精度、多精度和混合精度计算的区别是什么?
单精度、双精度、多精度和混合精度计算的区别是什么?
我们学过数学,都知道有理数和无理数,然后在有理数中有一类叫浮点数的数字,不知道大家对这些还有没有印象?
在软件编程的时候,我们也会用到浮点数,一种既包含小数又包含整数的数据类型。
下面就来讲讲关于浮点数中,单精度、双精度、多精度和混合精度计算的区别。
嵌入式专栏
1
关于圆周率π我们提到圆周率π 的时候,它有很多种表达方式,既可以用数学常数3.14159表示,也可以用一长串1和0的二进制长串表示。圆周率π 是个无理数,既小数位无限且不循环。因此,在使用圆周率进行计算时,人和计算机都必须根据精度需要将小数点后的数字四舍五入。在小学的时候,小学生们可能只会用手算的方式计算数学题目,圆周率的数值也只能计算到小数点后两位——3.14;而高中生使用图形计算器可能会使圆周率数值排到小数点后10位,更加精确地表示圆周率。在计算机科学中,这被称为精度,它通常以二进制数字来衡量,而非小数。对于复杂的科学模拟,开发人员长期以来一直都依靠高精度数学来研究诸如宇宙大爆炸,或是预测数百万个原子之间的相互作用。数字位数越高,或是小数点后位数越多,意味着科学家可以在更大范围内的数值内体现两个数值的变化。借此,科学家可以对最大的星系,或是最小的粒子进行精确计算。但是,计算精度越高,意味着所需的计算资源、数据传输和内存存储就越多。其成本也会更大,同时也会消耗更多的功率。由于并非每个工作负载都需要高精度,因此 AI 和HPC 研究人员可以通过混合或匹配不同级别的精度的方式进行运算,从而使效益最大化。NVIDIA Tensor Core GPU 支持多精度和混合精度技术,能够让开发者优化计算资源并加快 AI 应
算力精度分类
算力精度分类
随着人工智能和大数据时代的到来,计算机算力的需求也越来越高。而算力的精度则是衡量计算机性能和准确度的重要指标之一。在计算机科学中,算力精度主要分为单精度和双精度两种。本文将对这两种算力精度进行详细介绍和比较。
一、单精度
单精度,也称为浮点型,是计算机中一种常见的数据类型。它用32位二进制数来表示一个浮点数,其中1位表示符号位,8位表示指数,23位表示尾数。由于单精度的数据长度较短,所以它的存储空间相对较小,可以在很短的时间内完成计算任务。然而,由于尾数位数的限制,单精度的精度相对较低,对于一些要求精确度较高的计算任务,可能会出现误差。
二、双精度
双精度,也称为双精度浮点型,是计算机中一种高精度的数据类型。它用64位二进制数来表示一个浮点数,其中1位表示符号位,11位表示指数,52位表示尾数。双精度的数据长度较长,所以它的存储空间相对较大,可以存储更多的数据信息。双精度的精度相对较高,可以满足大部分计算任务的需求,但相应的计算时间也会相对较长。
三、单精度与双精度的比较
1. 精度:单精度的精度相对较低,双精度的精度相对较高。对于一些要求较高精度的计算任务,双精度更加适合。
2. 存储空间:单精度的存储空间较小,双精度的存储空间较大。对于一些对存储空间要求较高的场景,单精度更加适合。
3. 计算速度:由于单精度的数据长度较短,所以它的计算速度相对较快。而双精度的数据长度较长,计算速度相对较慢。
四、应用场景
1. 单精度适用于对精度要求不高但计算速度要求较快的场景,比如图像处理、音视频编码等。
西门子数据类型
西门子数据类型
引言概述:
西门子数据类型是指在西门子PLC编程中所使用的数据类型。对于PLC编程人员来说,熟悉并正确使用不同的数据类型是非常重要的。本文将详细介绍西门子数据类型的种类和使用方法。
一、基本数据类型
1.1 位(BOOL):位是最基本的数据类型之一,用于表示开关状态,取值为0或者1。在PLC编程中,常用于表示开关信号的状态。
1.2 字节(BYTE):字节是由8个位组成,用于存储较小的整数值。在PLC 编程中,字节常用于存储传感器的数据或者控制信号。
1.3 整数(INT):整数用于存储不带小数点的数字,取值范围为-32768到32767。在PLC编程中,整数常用于计数或者存储较大的整数值。
二、浮点数数据类型
2.1 单精度浮点数(REAL):单精度浮点数用于存储带有小数点的数字,取值范围为-
3.4E38到3.4E38。在PLC编程中,单精度浮点数常用于存储测量数据或者计算结果。
2.2 双精度浮点数(LREAL):双精度浮点数用于存储更大范围的带有小数点的数字,取值范围为-1.7E308到1.7E308。在PLC编程中,双精度浮点数常用于存储高精度的计算结果。
2.3 定点数(FIXED):定点数用于存储带有小数点的数字,取值范围和精度可以根据实际需求进行设置。在PLC编程中,定点数常用于对测量数据进行精确控制。
三、字符数据类型
3.1 字符串(STRING):字符串用于存储文本信息,可以包含字母、数字和符号等字符。在PLC编程中,字符串常用于存储和处理文本数据。
3.2 字符(CHAR):字符用于存储单个字符,可以表示字母、数字或者符号等。在PLC编程中,字符常用于处理键盘输入或者显示文本信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单精度浮点数与机器精度解析
一、单精度浮点数
先来简单了解一下浮点数在计算机中的存储方式。根据IEEE 754标准,单精度浮点数格式如下(所有位取0):
各部分解释
单精度浮点数有32个二进制位,左侧是高位,右侧是低位。最高位被指定为符号位,0代表正数,1代表负数。指数部分将是2的幂次,其编码值(即上表指数部分对应的八个二进制位)规定为指数的实际值加上偏移值2^7-1=127,这是为了避免负数,将[-127, 128]映射到[0, 255],这样指数部分编码就可以简单地编排为[00000000, 11111111]。例如指数部分为00001000,十进制为8。那么其所代表的实际指数是8-127=-119,即要乘上2-119。最后23位尾数是不包含整数位的实际有效小数位。规约数的整数位是1,非规约数的整数位是0。
规约形式的浮点数与非规约形式的浮点数
指数部分的编码值在[1, 2e-2]内,且尾数部分的整数位是1,这样的浮点数被称为规约形式的浮点数。
指数部分的编码值为0,尾数非零,这样的浮点数被称为非规约形式的浮点数。
规约浮点数的尾数∈[1, 2),而非规约浮点数的尾数∈(0, 1)。需要注意,非规约数指数编码为00000000,但指数实际值是-126,而非-127。非规约浮点数被IEEE 754-1985标准采用是因为它的渐进式下溢出,而规约浮点数将导致突然式下溢出,具体原理不再展开。
实际计算
设符号位为s。sign(s)确定正负:sign(0)=1,sign(1)=-1;指数部分为e;尾数部分为f。用(N)2表示二进制数N。
规约形式:sign(s)*2e-127*(1.f)2
非规约形式:sign(s)*2-126*(0.f)2
特殊值和极值
上下溢出值
由浮点数的存储方式可以看出计算机所能表示的浮点数是有限的,我们把所能表示的最大正值称为上溢值,而把最接近0的正值称为下溢值。由表二我们看到上溢值为±3.40e38,下溢值为±1.40e-45。
二、机器精度
Wikipedia上机器精度Machine Epsilon是这样描述的:“Machine epsilon gives an upper bound on the relative error due to rounding in floating point arithmetic”。因
为浮点数是离散的,所以实数的表示存在着误差。例如圆周率这样的无限不循环小数不可能精确地由某一个浮点数表示。
我们需要一些具体的量去刻画这种误差,以估计结果的准确性。机器精度便是其中之一:它是所有相对误差的上限。相对误差是绝对误差与精确值的比值的绝对值。例如一个精确的实数x,所有单精度浮点数中与x距离最近的数为y,绝对误差为|y-x|,相对误差即|y−x|/|x|,而所有相对误差的上限便是单精度浮点数的机器精度。
对于32位浮点数,指数8位,尾数为23位。对于两个指数实际值为E的相同的浮点数,若它们尾数部分相差(00000000000000000000001)2,即2-23,易见它们是相邻的。那么与它们指数相同的实数x与距x最近的浮点数y之间的距离|y-x|一定小于此相邻两浮点数的距离2-23 * 2E。可以取x=1.0(或者其他任何数),此时实际指数为0,所以机器精度是2−23×2E /1.0。
三、C++程序实现
利用库求值
标准库
上溢值: std::numeric_limits
规约下溢值: std::numeric_limits
非规约下溢值: std::numeric_limits
机器精度: std::numeric_limits
其中numeric_limits
实际二进制存储值
std::string get_binary(float f)
{
int index_byte, index_bit;
unsigned int byte = 0;
char ch, *p;
std::string bin_f = "";
p = (char *)(&f);
for (index_byte = sizeof(float)-1; index_byte>=0; index_byte--) {
ch = *(p+index_byte); //从最高位开始取
byte = ch; //将地址中8个二进制位赋值成十进制数
for (index_bit = 1; index_bit<=8; index_bit++) {
if (byte >=128) bin_f += "1";
else bin_f += "0"; //判断首位是1还是0
byte <<= 1; //将当前位变成首位
byte &= 255; //确保始终8个二进制位
}
}
return bin_f;
}