(点击上方公众号,可快速关注)
在看dijkstra算法时,看到了以下Python代码:
inf = float("inf")
上面使用了正无穷的值,非常现代。
无穷量在IEEE 754标准中有具体的定义,现代的编译器基本都实现了对IEEE 754标准的支持。实际上,在日常的编程中经常用到这个值,如果语言没有定义该值,我们通常会使用一些特殊的值迂回地实现。比如,假定值域为正整数,通常选取-1表示无穷大。虽然能实现相同的效果,但如果语言能支持无穷量,实现起来会更加容易。
在其他语言中,怎么表示呢?
C++
使用下面的代码可以取double
类型的正无穷值,numeric_limits
是模板,也可以取float
类型的。通常,浮点类型都可以取正无穷值。
double inf = std::numeric_limits<double>::infinity();
前面提到过,现代的编译器一般都实现了IEEE 754标准。谨慎起见,可以使用std::numeric_limits<T>::is_iec559
判断是否支持该标准。在编译器支持该标准的前提下再使用std::numeric_limits<float>::has_infinity
判断是否可以使用以上函数取无穷值。
在C99后,math.h
定义了INFINITY
宏也可以得到正无穷值。
Haskell
可以使用下面代码取Double
类型的正无穷值。
let inf = (read "Infinity") :: Double
除此之外,RealFloat
类型类提供了一些其他函数:
isInfinite
可以判断当前值是否是无穷量,将该函数应用于(read "Infinity") :: Double
将会得到True
;
isIEEE
可以判断当前当前参数是否是IEEE 754标准定义的浮点格式,功能与C++的is_iec559
类似。
其他三方包提供了更为丰富的功能,如ieee754
。
负无穷
上面都是正无穷,若编译器支持IEEE 754标准,负无穷很容易得到,只要在前面添加负号即可:
-inf