使用math.pow、pow或**是很棘手的,因为它的行为并不像它应该的那样。当两个实数的结果太高而无法容纳双精度浮点时,它抛出溢出异常(它应该返回无穷大),但当输入为inf或-inf时,它的行为正确并返回inf或0.0。当第二个参数是NaN时,它返回NaN,除非第一个参数是1.0。还有更多的问题,不是所有的covered in the docs。
math.exp与math.pow有相同的问题。解决此溢出问题的方法是使用类似于以下代码:
try:
res = math.exp(420000)
except OverflowError:
res = float('inf')
C99也是。
所有现代处理器使用的IEEE 754浮点表示法都有几个特殊的位模式,保留给正无穷大(sign=0,exp=~0,frac=0)、负无穷大(sign=1,exp=~0,frac=0)和许多NaN(不是数字:exp=~0,frac不等于0)。
所有你需要担心的是:一些算法可能会导致浮点异常/陷阱,但这些不限于这些“有趣”的常量。
您仍然可以从涉及
inf
的简单算术中获取非数字(NaN)值:请注意,通常情况下,您将不会通过通常的算术计算获得
inf
值:inf
值被认为是一个非常特殊的值,具有不寻常的语义,因此最好直接通过异常了解一个OverflowError
值,而不是在计算中无声地注入一个inf
值。Python's implementation很好地遵循了IEEE-754 standard,您可以将其用作指导,但它依赖于编译它所依赖的底层系统,因此platform differences可能会发生。最近,已经应用了一个允许"infinity" as well as "inf"的修复程序,但这在这里并不重要。
以下各节同样适用于正确实现IEEE浮点运算的任何语言,它不是仅针对Python的。
不等式的比较
当处理无穷大且大于
>
或小于<
运算符时,以下计数:+inf
在内的任何数字都高于-inf
-inf
在内的任何数字都低于+inf
+inf
是neither higher nor lower而不是+inf
-inf
既不高于也不低于-inf
NaN
的比较都是错误的(inf
既不高于也不低于NaN
)相等性比较
当比较相等时,
+inf
和+inf
是相等的,同样的还有-inf
和-inf
。这是一个很有争议的问题,听起来可能会有争议,但在IEEE标准中,Python的行为就是这样。当然,
+inf
不等于-inf
,所有东西,包括NaN
本身,都不等于NaN
。无穷大
的计算除非两个操作数都是无穷大,否则大多数具有无穷大的计算都会产生无穷大,当运算除法或模运算或与零相乘时,需要记住一些特殊的规则:
NaN
0.0
或^{NaN
。inf - inf
时,结果未定义:NaN
inf - -inf
时,结果是inf
-inf - inf
时,结果是-inf
-inf - -inf
时,结果未定义:NaN
。inf + inf
时,结果是inf
inf + -inf
时,结果未定义:NaN
-inf + inf
时,结果未定义:NaN
-inf + -inf
时,结果是-inf
。math.pow
、pow
或**
是很棘手的,因为它的行为并不像它应该的那样。当两个实数的结果太高而无法容纳双精度浮点时,它抛出溢出异常(它应该返回无穷大),但当输入为inf
或-inf
时,它的行为正确并返回inf
或0.0
。当第二个参数是NaN
时,它返回NaN
,除非第一个参数是1.0
。还有更多的问题,不是所有的covered in the docs。math.exp
与math.pow
有相同的问题。解决此溢出问题的方法是使用类似于以下代码:注释
注1:作为另一个警告,根据IEEE标准的定义,如果计算结果不足或溢出,结果将不是不足或溢出错误,而是正或负无穷大:
1e308 * 10.0
产生inf
。注2:因为任何带有} 函数来确定一个数字是否确实是
NaN
的计算都返回NaN
,并且任何与NaN
的比较,包括NaN
本身就是false
,所以应该使用^{NaN
。注意3:虽然Python支持写
float('-NaN')
,但是忽略符号,因为内部不存在NaN
上的符号。如果除以-inf / +inf
,结果是NaN
,而不是-NaN
(没有这样的东西)。注4:注意在上面,由于Python依赖于它所编译的C或Java库,所以并不是所有的底层系统都能正确地实现所有这些行为。如果你想确定,在计算之前先测试无穷大。
(1)最近指version 3.2.{产生}。此外,^{} is ^{} ,如果不想让符号为真,则必须手动检查该符号。
(2)浮点支持正零和负零,因此:
x / float('inf')
保留其符号,-1 / float('inf')
产生-0.0
,1 / float(-inf)
产生-0.0
,^{0.0
,-1/ float(-inf)
产生^相关问题 更多 >
编程相关推荐