Go语言底层原理剖析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6 NaN与Inf

在Go语言中有正无穷(+Inf)与负无穷(-Inf)两类异常的值,例如正无穷1/0。NaN代表异常或无效的数字,例如0/0或者Sqrt(-1)。下例中分别构造出+Inf、-Inf与NaN。

在IEEE754浮点数标准中,在正常情况下,不可能所有的指数位都为1或者都为0。例如,Float32的最大值其实是0|1111 1110|111 1111 1111 1111 1111 1111。

当所有的指数位都为0时代表0,当所有的指数位都为1时代表-1。在IEEE-754标准中,NaN分为sNAN与qNAN。qNAN代表出现了无效或异常的结果,sNAN代表发生了无效的操作,例如将字符串转化为浮点数。qNAN的指数位全为1,且小数位的第一位为1;sNAN的指数位全为1,但是小数位的第一位为0。用math.NaN函数可以生成一个NaN,对NAN的任何操作都会返回NAN。另外,对NAN的任何比较都会返回false。例如:

有些时候需要判断浮点数是否为NaN或者Inf,这需要借助Math.IsNaN和Math.IsInf函数。其判断条件很简单,在IEEE-754标准中,NaN!=NaN会返回true,Go语言编译器在判断浮点数时,浮点数的比较会被编译成UCOMISD或COMISD CPU指令,该指令会判断和处理NaN等异常情况从而实现当NaN!=NaN时返回true[3]。可以通过判断浮点数是否在有效的范围内来检查其是否为Inf。浮点数的最大和最小值的常量在math/const.go中定义。