- Go语言底层原理剖析
- 郑建勋
- 453字
- 2025-02-21 18:08:17
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中定义。
