浮点数在计算机中的表示法
- 格式:doc
- 大小:154.50 KB
- 文档页数:9
浮点数在计算机中是如何表⽰的话题:浮点数在计算机中是如何表⽰的?回答:浮点数浮点数是属于有理数中某特定⼦集的数的数字表⽰,在计算机中⽤以近似表⽰任意某个实数。
具体的说,这个实数由⼀个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)话题:浮点数的解释回答:浮点数是属于有理数中某特定⼦集的数的数字表⽰,在计算机中⽤以近似表⽰任意某个实数。
具体的说,这个实数由⼀个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表⽰⽅法类似于基数为10的科学记数法。
浮点计算是指浮点数参与的运算,这种运算通常伴随着因为⽆法精确表⽰⽽进⾏的近似或舍⼊。
⼀个浮点数a由两个数m和e来表⽰:a = m * b^e。
在任意⼀个这样的系统中,我们选择⼀个基数b(记数系统的基)和精度p(即使⽤多少位来存储)。
m(即尾数)是形如±d.dddddd的p位数(每⼀位是⼀个介于0到b-1之间的整数,包括0和b-1)。
如果m的第⼀位是⾮0整数,m称作格化的。
有⼀些描述使⽤⼀个单独的符号位(s +或者-)来表⽰正负,这样m必须是正的。
e是指数。
这种设计可以在某个固定长度的存储空间内表⽰定点数⽆法表⽰的更⼤范围的数。
例如,⼀个指数范围为±4的4位⼗进制浮点数可以⽤来表⽰43210,4.321或0.0004321,但是没有⾜够的精度来表⽰432.123和43212.3(必须近似为432.1和43210)。
当然,实际使⽤的位数通常远⼤于4。
此外,浮点数表⽰法通常还包括⼀些特别的数值:+∞和−∞(正负⽆穷⼤)以及NaN('Not a Number')。
⽆穷⼤⽤于数太⼤⽽⽆法表⽰的时候,NaN则指⽰作或者⽆法定义的结果。
众所知,计算机中的所有数据都是以⼆进制表⽰的,浮点数也不例外。
然⽽浮点数的⼆进制表⽰法却不像定点数那么简单了。
先澄清⼀个概念,浮点数并不⼀定等于⼩数,定点数也并不⼀定就是整数。
浮点数的表示方法
一、浮点数表示
一个数的浮点形式(设基数是2)可写成:
N = M × 2E
其中:M代表尾数,E代表阶码。
计算机中浮点数只用尾数和阶码表示,其形式如下:
浮点数的精度由尾数决定,数的表示范围由阶码的位数决定。
为了最大限度提高精度,尾数采用规格化形式,既1/2≤M<1。
采用二进制表示时,若尾数大于零,则规格化数应该是01XXXX的形式;若尾数小于零,则规格化数应为10XXXX的形式。
二、机器零
当浮点数的尾数为0或阶码为最小值时,计算机通常把该数当作零,因此程序中进行浮点运算时,判断某数是否为零,通常可以用小于某个极小值来代替。
三、实例
【例1】设X=0.0110×23 ,用补码、浮点数形式表示阶码为X j=011,尾数为00110,这时由于X 尾数不符合01XXXX的形式,因此不是规格化数,必须先进行规格化处理。
方法:若尾数小于1/2,把尾数左移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码减1即可,否则继续左移和调整阶码;若尾数大于1,则把尾数右移一位(不包括符号位),观察结果是否满足规格化条件,满足则在把阶码加1即可,否则继续右移和调整阶码。
上例中,00110左移一位为01100,符合规则化标准,此时阶码减1,为010即得到浮点表示形式。
这个数具体在计算机中如何表示要看计算机中规定的阶码和尾数的位数,若阶码和尾数均为16位,则上面的数X在计算机内部表示就是00000000000000100110000000000000 ,不足
均用零填充。
浮点数1,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。
2、浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
一个浮点数a由两个数m和e来表示:a = m × b^e。
在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。
m(即尾数)是形如±d.ddd...ddd 的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。
如果m的第一位是非0整数,m称作规格化的。
有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。
e是指数。
3、结构由此可以看出,在计算机中表示一个浮点数,其结构如下:尾数部分(定点小数)阶码部分(定点整数)4、浮点加法减法运算设有两个浮点数x和y,它们分别为x=2Ex·Mxy=2Ey·My 其中Ex和Ey分别为数x和y的阶码,Mx和My为数x和y的尾数。
两浮点数进行加法和减法的运算规则是x ±y=(Mx2Ex-Ey±My)2Ey,Ex<=Ey 完成浮点加减运算的操作过程大体分为四步: 1. 0 操作数的检查; 2. 比较阶码大小并完成对阶; 3. 尾数进行加或减运算; 4. 结果规格化并进行舍入处理。
⑴0 操作数检查浮点加减运算过程比定点运算过程复杂。
如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。
0操作数检查步骤则用来完成这一功能。
⑵比较阶码大小并完成对阶两浮点数进行加减,首先要看两数的阶码是否相同,即小数点位置是否对齐。
若二数阶码相同,表示小数点是对齐的,就可以进行尾数的加减运算。
反之,若二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作对阶。
浮点数在计算机中的存储浮点数是在计算机中表示实数的一种方法。
它由两个部分组成:尾数和指数。
单精度浮点数和双精度浮点数是两种不同精度的浮点数表示方式。
单精度浮点数采用32位的二进制表示,其中1位表示符号位,8位表示指数位,剩下的23位表示尾数位。
符号位确定数的正负,指数位表示浮点数的指数部分,尾数位表示浮点数的尾数部分。
双精度浮点数采用64位的二进制表示,其中1位表示符号位,11位表示指数位,剩下的52位表示尾数位。
双精度浮点数的存储空间比单精度浮点数更大,因此能够表示更大范围和更高精度的数值。
在计算机中存储浮点数时,会将其转换为二进制,并按照指定的格式存储。
以单精度浮点数为例,符号位、指数位和尾数位会按照一定的规则进行编码和存储。
这种编码方式被称为IEEE754浮点数标准。
根据IEEE754浮点数标准,单精度浮点数的取值范围约为1.4×10⁻⁴⁵~3.4×10³⁸,双精度浮点数的取值范围约为4.9×10⁻³²~1.8×10³⁰⁸。
双精度浮点数相比单精度浮点数能够表示更大范围和更高精度的数值,但同时也需要更多的存储空间。
浮点数在计算机存储中的表示方式是通过将数字拆分成符号、指数和尾数三个部分,并使用二进制编码进行存储。
这种表示方式能够满足大多数实数的表示需求,但由于浮点数在计算机中的存储是近似表示,所以在进行浮点数运算时可能会存在一定的舍入误差。
因此,在高精度计算或要求精度较高的应用中,可能需要采用其他更精确的表示方法。
浮点数在计算机中是如何表⽰的前⾔相⽐int等整型,float等浮点类型的表⽰和存储较为复杂,但它⼜是⼀个⽆法回避的话题,那么就有必要对浮点⼀探究竟了。
在计算机中,⼀般⽤IEEE浮点近似表⽰任意⼀个实数,那么它实际上⼜是如何表⽰的呢?下⾯的表达式⾥,i的值是多少,为什么?如果你不确定答案,那么你应该好好看看本⽂。
float f = 8.25f;int i = *(int*)&f;IEEE浮点表⽰IEEE浮点标准⽤的形式近似表⽰⼀个数。
并且将浮点数的位表⽰划分为三个字段:符号(sign)s决定这个数是负数(s=1)还是正数(s=0)。
可以⽤⼀个单独的符号s直接编码符号s。
尾数(signficand)M是⼀个⼆进制⼩数,它的范围是1~2-ξ或者是0~1-ξ。
n位⼩数字段编码尾数M。
阶码(exponent)E的作⽤是对浮点数加权,这个权重是2的E次幂(可能是负数)。
k位的阶码字段编码阶码E。
在单精度浮点格式(c语⾔的float)中,s,exp和frac字段分别为1位,8位和23位,⽽双精度浮点格式(c语⾔中的double)中,s,exp和frac 字段分别为1位,11位和52位。
⼀个浮点数的常见⽐特位表⽰如下:单精度双精度⽽根据exp的值,被编码的值可以分为三⼤类不同的情况。
下⾯进⾏⼀⼀解释。
情况1:规格化的值即最普遍的情况,当exp,即阶码域既不为全0,也不为全1的情况。
在这种情况下,阶码字段解释为以偏置(biased)形式表⽰有符号整数,即E=exp-Bias,exp是⽆符号数(1~254)。
Bias是⼀个等于的偏置值,对于单精度来说,k=23,Bias=127,因此E的范围是-126~+127。
frac被描述为⼩数值,且0≤frac<1,其⼆进制表⽰为0.frac。
尾数定义为 M=1+frac ,则M=1.frac。
那么就有1≤M<2,由于总是能够调整阶码E,使得M在范围1≤M<2,所以不需要显⽰的表⽰它,这样还能获得⼀个额外的精度位。
也就是说,不管是双精度浮点数(64位)还是单精度浮点数(32位),都会被拆这是IEEE规定的浮点数内部构造,符号部分即使用一位来表示正负;尾数部分使用的是“将小数点前面的值固定为1的正则表达式”;指数部分使用的是EXCESS系统表
接下来再看指数部分,EXCESS系统是通过将指数部分表示范围的中间值设为0,使得负数不需要用符号位来表示。
比如指数部分是8位浮点数时,那么最大值11111111 = 255的一半,即01111111 = 127,127用来表示0,比127小的数表示负数,比127大的表示正数,如下表所示。
我们可以使用程序进行确认,代码如下所示。
1public static void main(String[] args) {
2float f = -0.75f;
3
4//指定的返回一个表示浮点值根据IEEE 754浮点“单一格式”布局。
5 Integer i = Float.floatToIntBits(f);
6
7//返回一个整数参数是一个无符号整数的字符串表示。
8 String res = Integer.toBinaryString(i);
9 System.out.println(res);
10
11//结果:1 01111110 10000000000000000000000
12 }。
下列数中是浮点数的正确表达形式
浮点数是计算机中表示实数的一种方式,通常使用科学计数法表示。
它由两部分组成:尾数和指数。
尾数是实数的二进制表示,指数则表示小数点的位置。
浮点数的大小和精度取决于尾数和指数的长度。
下面是一些正确的浮点数的表达形式。
1. 3.14
这是一个十进制浮点数,尾数为3.14,指数为0,可以写成3.14e0或3.14E0。
2. 0.00123
这是一个十进制浮点数,尾数为1.23,指数为-3,可以写成
1.23e-3或1.23E-3。
3. 1.5e10
这是一个十进制浮点数,尾数为1.5,指数为10,可以写成1.5e10或1.5E10。
4. 0.10100101
这是一个二进制浮点数,尾数为1.0100101,指数为-3,可以写成1.0100101e-3或1.0100101E-3。
5. 1.11100000
这是一个二进制浮点数,尾数为1.111,指数为0,可以写成
1.111e0或1.111E0。
以上是一些常见的浮点数表达形式。
需要注意的是,浮点数在计算机中存储时往往存在精度误差,因为计算机中的浮点数只能表示有
限的小数,而实数是无限的。
在进行浮点数计算时,应该尽量避免使用等于比较,而应该使用范围比较,以免误差影响计算结果。
总之,浮点数是计算机中表示实数的一种方式,它由尾数和指数组成,可以使用科学计数法表示。
在进行浮点数计算时,需要注意精度误差的存在,正确比较浮点数应该使用范围比较。
计算机组成原理float小数的表示
在计算机组成原理中,单精度浮点数(float)通常采用IEEE 754标准进行
表示。
这种表示方法将一个浮点数分为三个部分:符号位、指数位和尾数位。
符号位:表示浮点数的正负,占1位。
指数位:表示浮点数的指数,占8位(对于单精度)或11位(对于双精度)。
尾数位:表示浮点数的小数部分,占23位(对于单精度)或52位(对于
双精度)。
在IEEE 754标准中,单精度浮点数的表示形式如下:
S EEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
其中:
S:符号位,占1位。
0表示正数,1表示负数。
E:指数位,占8位。
表示为移码形式,即偏移了8位的二进制数。
M:尾数位,占23位。
表示浮点数的小数部分。
在将一个十进制数转换为IEEE 754单精度浮点数时,需要将十进制数的小数部分除以2并取整数部分作为尾数,然后根据指数和符号确定最终的二进制表示。
例如,将十进制数-转换为IEEE 754单精度浮点数的过程如下:
-可以表示为-6+(-4/2)+,其中-6是符号位(1),-4是偏移了8位的二进制数(-100),是尾数部分()。
所以,-的单精度浮点数表示为1 。
浮点数的用法-概述说明以及解释1.引言1.1 概述概述部分的内容可以涵盖浮点数的基本概念、其在计算机中的重要性以及本文将要讨论的主要内容。
概述:在计算机科学中,浮点数是一种用于表示实数的数值类型。
相比整数类型,浮点数可以表示更广范围的数值,包括小数、分数以及极大或极小的数值。
浮点数的重要性在于它们广泛应用于科学计算、图形处理和工程领域等许多计算机应用中。
本文将深入探讨浮点数的基本概念以及其在计算机中的表示方法。
首先,我们将介绍浮点数的基本概念,包括浮点数的定义和特点。
然后,我们将详细解释浮点数在计算机内部是如何表示的,以及在不同计算机系统中浮点数的表示方法是否存在差异。
除此之外,本文还会探讨浮点数在实际应用中的一些场景和注意事项。
我们将介绍一些常见的浮点数应用场景,例如科学计算、金融建模和图像处理等领域。
同时,我们也会谈到使用浮点数进行计算时需要注意的一些问题,例如浮点数精度损失、舍入误差和比较运算等。
通过阅读本文,读者将能够全面了解浮点数的基本概念和计算机中的表示方法,同时也将对浮点数的应用场景和注意事项有更深入的了解。
这将有助于读者在实际编程和计算过程中更好地理解和处理浮点数,提高计算结果的准确性和可靠性。
1.2 文章结构文章结构是指文章的组织方式和框架,它有助于读者更好地理解和消化文章的内容。
在本文中,我们将介绍浮点数的用法,并以以下三个部分来构建文章结构:1. 引言:在引言部分,我们将对浮点数的用法进行概述,并介绍本文的目的和重要性。
我们将简要解释浮点数的基本概念,并阐述浮点数在计算机中的表示方法,为读者打下基础,使他们能够更好地理解和应用浮点数。
2. 正文:在正文部分,我们将详细讨论浮点数的基本概念,并解释它在计算机中的表示方法。
我们将介绍浮点数的精度和范围,并讨论浮点数的运算和舍入误差等相关问题。
此外,我们还将探讨浮点数在科学计算、图形处理、金融和物理模拟等领域中的应用场景,并提供相应的示例和实际案例,以便读者更好地理解浮点数的用法和意义。
浮点数1.什么是浮点数在计算机系统的发展过程中,曾经提出过多种方法表达实数。
典型的比如相对于浮点数的定点数(Fixed Point Number)。
在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。
货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。
由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。
SQL 中的 NUMBER 数据类型就是利用定点数来定义的。
还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。
定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。
最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。
这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa,尾数有时也称为有效数字——Significand;尾数实际上是有效数字的非正式说法),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。
比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102,其中1.2345 为尾数,10 为基数,2 为指数。
浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。
2.IEEE 浮点数计算机中是用有限的连续字节保存浮点数的。
在 IEEE 标准中,浮点数是将特定长度的连续字节的所有二进制位分割为特定宽度的符号域,指数域和尾数域三个域,其中保存的值分别用于表示给定二进制浮点数中的符号,指数和尾数。
这样,通过尾数和可以调节的指数(所以称为"浮点")就可以表达给定的数值了。
IEEE 754 指定:⏹两种基本的浮点格式:单精度和双精度。
IEEE 单精度格式具有 24 位有效数字精度,并总共占用 32 位。
IEEE 双精度格式具有 53 位有效数字精度,并总共占用 64 位。
⏹两种扩展浮点格式:单精度扩展和双精度扩展。
此标准并未规定这些格式的精确精度和和大小,但它指定了最小精度和大小。
例如,IEEE 双精度扩展格式必须至少具有 64 位有效数字精度,并总共占用至少 79 位。
具体的格式参见下面的图例:IEEE 精度C、C++Fortran (仅限 SPARC)单精度float REAL 或 REAL*4双精度double DOUBLE PRECISION 或 REAL*8双精度扩展long double REAL*16IEEE 754 明确规定了单精度浮点格式和双精度浮点格式,并为这两种基本格式分别定义了一组扩展格式。
表中显示的 long double 和 REAL*16 类型适用于 IEEE 标准定义的一种双精度扩展格式。
3.1.单精度格式IEEE 单精度格式由三个字段组成:23 位小数 f ; 8 位偏置指数 e ;以及 1 位符号 s。
这些字段连续存储在一个 32 位字中(如下图所示)。
0:22 位包含 23 位小数 f,其中第 0 位是小数的最低有效位,第 22 位是最高有效位。
IEEE 标准要求浮点数必须是规范的。
这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。
这样我们实际上用 23 位长的尾数域表达了 24 位的尾数。
23:30 位包含 8 位偏置指数 e,第 23 位是偏置指数的最低有效位,第 30 位是最高有效位。
8 位的指数为可以表达 0 到 255 之间的 256 个指数值。
但是,指数可以为正数,也可以为负数。
为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为 127;偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -127 到 128 之间(包含两端)。
在本文中,最小指数和最大指数分别用e min和e max来表达。
稍后将介绍实际的指数值 -127(保存为全0)以及 +128(保存为全 1)保留用作特殊值的处理。
最高的第 31 位包含符号位s。
s为0表示数值为正数,而s为1则表示负数。
3.2.双精度格式IEEE 双精度格式由三个字段组成:52 位小数 f ; 11 位偏置指数 e ;以及 1 位符号s。
这些字段连续存储在两个 32 位字中(如下图所示)。
在 SPARC 体系结构中,较高地址的 32 位字包含小数的 32 位最低有效位,而在 x86体系结构中,则较低地址的 32-位字包含小数的 32 位最低有效位。
如果用 f[31:0] 表示小数的 32 位最低有效位,则在这 32 位最低有效位中,第 0 位是整个小数的最低有效位,而第 31 位则是最高有效位。
在另一个 32 位字中, 0:19 位包含 20 位小数的最高有效位 f[51:32],其中第 0 位是这20 位最高有效位中的最低有效位,而第 19 位是整个小数的最高有效位; 20:30 位包含11 位偏置指数 e,其中第 20 位是偏置指数的最低有效位,而第 30 位是最高有效位;最高的第 31 位包含符号位 s。
上图将这两个连续的 32 位字按一个 64 位字那样进行了编号,其中0:51 位包含 52 位小数 f,其中第 0 位是小数的最低有效位,第 51 位是最高有效位。
IEEE 标准要求浮点数必须是规范的。
这意味着尾数的小数点左侧必须为 1,因此我们在保存尾数的时候,可以省略小数点前面这个 1,从而腾出一个二进制位来保存更多的尾数。
这样我们实际上用 52 位长的尾数域表达了 53 位的尾数。
52:62 位包含 11 位偏置指数 e,第 52 位是偏置指数的最低有效位,第 62 位是最高有效位。
11 位的指数为可以表达 0 到 2047 之间的2048个指数值。
但是,指数可以为正数,也可以为负数。
为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为1023;偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成 -1023到1024之间(包含两端)。
在本文中,最小指数和最大指数分别用e min和e max来表达。
稍后将介绍实际的指数值 -1023(保存为全0)以及 +1024(保存为全 1)保留用作特殊值的处理。
最高的第 63 位包含符号位s。
s为0表示数值为正数,而s为1则表示负数。
3.3.双精度扩展格式 (SPARC)SPARC 浮点环境的四倍精度格式符合双精度扩展格式的 IEEE 定义。
四倍精度格式占用 32 位字并包含以下三个字段:112 位小数 f、15 位偏置指数 e 和 1 位符号 s。
这三个字段连续存储,如图2-3 所示。
地址最高的 32 位字包含小数的 32 位最低有效位,用 f[31:0] 表示。
紧邻的两个 32 位字分别包含 f[63:32] 和 f[95:64]。
下面的 0:15 位包含小数的 16 位最高有效位 f[111:96],其中第0 位是这 16 位的最低有效位,而第 15 位是整个小数的最高有效位。
16:30 位包含 15 位偏置指数 e,其中第 16 位是该偏置指数的最低有效位,而第 30 位是最高有效位;第 31 位包含符号位 s。
下图将这四个连续的 32 位字按一个 128 位字那样进行了编号,其中 0:111 位存储小数 f ;112:126 位存储 15 位偏置指数 e ;而第 127 位存储符号位 s。
因此按单精度格式表示为:1 10000010 00110100000000000000000同理按双精度格式表示为:1 10000000010 00110100000000000000000000000000000000000000000000005.特殊值通过前面的介绍,你应该已经了解的浮点数的基本知识,这些知识对于一个不接触浮点数应用的人应该足够了。
不过,如果你兴趣正浓,或者面对着一个棘手的浮点数应用,可以通过本节了解到关于浮点数的一些值得注意的特殊之处。
我们已经知道,单精度浮点数指数域实际可以表达的指数值的范围为 -127 到 128 之间(包含两端)。
其中,值 -127(保存为全0)以及 +128(保存为全1)保留用作特殊值的处理。
本节将详细 IEEE 标准中所定义的这些特殊值。
浮点数中的特殊值主要用于特殊情况或者错误的处理。
比如在程序对一个负数进行开平方时,一个特殊的返回值将用于标记这种错误,该值为 NaN(Not a Number)。
没有这样的特殊值,对于此类错误只能粗暴地终止计算。
除了 NaN 之外,IEEE 标准还定义了±0,±∞以及非规范化数(Denormalized Number)。
对于单精度浮点数,所有这些特殊值都由保留的特殊指数值 -127 和 128 来编码。
如果我们分别用e min和e max来表达其它常规指数值范围的边界,即 -126 和 127,则保留的特殊指数值可以分别表达为e min- 1 和e max + 1; 。
基于这个表达方式,IEEE 标准的特殊值如下所示:其中f表示尾数中的小数点右侧的(Fraction)部分。
第一行即我们之前介绍的普通的规范化浮点数。
随后我们将分别对余下的特殊值加以介绍。
5.1NaNNaN 用于处理计算中出现的错误情况,比如 0.0 除以 0.0 或者求负数的平方根。
由上面的表中可以看出,对于单精度浮点数,NaN 表示为指数为e max + 1 = 128(指数域全为 1),且尾数域不等于零的浮点数。
IEEE 标准没有要求具体的尾数域,所以 NaN 实际上不是一个,而是一族。
不同的实现可以自由选择尾数域的值来表达 NaN,比如 Java 中的常量 Float.NaN 的浮点数可能表达为 01111111110000000000000000000000,其中尾数域的第一位为 1,其余均为 0(不计隐藏的一位),但这取决系统的硬件架构。
Java 中甚至允许程序员自己构造具有特定位模式的 NaN 值(通过 Float.intBitsToFloat() 方法)。
比如,程序员可以利用这种定制的 NaN 值中的特定位模式来表达某些诊断信息。
定制的 NaN 值,可以通过 Float.isNaN() 方法判定其为 NaN,但是它和 Float.NaN 常量却不相等。
实际上,所有的 NaN 值都是无序的。
数值比较操作符 <,<=,> 和 >= 在任一操作数为 NaN 时均返回 false。
等于操作符 == 在任一操作数为 NaN 时均返回 false,即使是两个具有相同位模式的 NaN 也一样。