之前只知道设置变量的初始值为0。今天在写网络路径分析的时候,为了找到离任意坐标距离最近的节点,初始设置最短距离为无穷大,然后不断的去替换,直到找到最近的节点。
刚开始设置是min_dis = 999999999999,作为距离不是特别大的也是可以的,于是试想是不是Python提供了有无穷大的表示方法,查阅文档,果然如此:
from random import randrange seq = [randrange(10**10) for i in range(100)] dd = float("inf") for x in seq: for y in seq: if x == y: continue d = abs(x-y) if d < dd: xx, yy, dd = x, y, d print (xx,yy)
上述代码的目的是:从100个随机数里面找2个最靠近的自然数(不相等):
注意到其中的dd初始值:
dd = float("inf")
此处需要保证dd初始足够大,可以判断dd表示的是一个很大的值,经查验,dd表示的即为无穷大,见文档:
float also accepts the strings “nan” and “inf” with an optional prefix “+” or “-” for Not a Number (NaN) and positive or negative infinity.
那么负无穷的表示呢?
>>> float('-Inf')==-float('Inf') true
以下内容转自:http://blog.sina.com.cn/s/blog_a9303fd90101d3tx.html
---------------------------------------------------------------
infinite(无穷大)数
显然,这是与finite数相对的。在无穷大数里值是固定的,分为+∞(正无穷大)和-∞(负无穷大)。exponent和significand的值如下所示。
类型 | exponent | significand | 值 |
单精度 | FF | 0 | 2128 |
双精度 | 7FF | 0 | 21024 |
扩展双精度 | 7FFF | 0x80000000_00000000 | 216384 |
NaN(not a number)数
如果一个数超出infinite,那就是一个NaN(not a number)数。在NaN数中,它的exponent部分为可表达的最大值,即FF(单精度)、7FF(双精度)和7FFF(扩展双精度)。
NaN数与infinite数的区别是:infinite数的significand部分为0值(扩展双精度的bit63位为1)。而NaN数的significand部分不为0值。
NaN数包括下列两类。
① SNaN(Signaling NaN)数:SNaN数表示是一种比较严重的错误值。
② QNaN(Quiet NaN)数:在一般情况下,QNaN数是可接受的。
SNaN和QNaN数的编码区别在于significand部分的不同,如下所示。
NaN类型 | significand | 备注 |
SNaN | 1.0XXX…XXX | XXX不为0 |
QNaN | 1.1… | 1.1 后面任意值 |
x87 FPU或SSE指令遇到SNaN数时会产生#IA异常,而遇到QNaN时不产生#IA异常(部分指令除外)。
那么既然NAN不是一个真实的数值,在程序如何判断变量是否变成了NAN呢?大部分语言中针对NAN值都有一系列的函数定义,C语言中最常见的函数如下:
_isnan(double x); //判断是否为NAN
_finite(double x); //判读是否为无穷大