要将浮点常量初始化为+ inf,-inf,nan,我总是使用带字符串调用的float():
print(float('inf'), float('+inf'), float('-inf'), float('nan'))
此打印:
[inf, inf, -inf, nan]
1。)Python中是否存在初始化这些常量的替代方法(不使用字符串调用float)?
2。)我可以通过一些数学运算来产生这些常数(+/- inf,nan)吗?
例如通过写类似f
的方式将变量+inf
设置为f = 1.0 / 0.0
(显然,这是零误差除法)。
答案 0 :(得分:14)
从技术上讲,是的,还有其他初始化此类值的方法,但它们要么不那么明显,要么不那么方便。
如果您的平台使用IEEE浮点,则 1 任何溢出的float
算法都可以为您提供inf
,并且不会引起溢出。这意味着1.0 / 0.0
可能无法正常工作(Python会检测到这是一个零除数),但更简单的1e500
将会。 2
一旦有了inf
,就可以执行-inf
和inf/inf
来获得负无穷大和NaN值。
但是有人会读您的代码吗?1e500 / 1e500
和float('nan')
一样容易理解吗?可能不是。
与此同时,您始终可以执行类似struct.unpack('>f', b'\x7f\x80\0\0')[0]
的操作,无论您的{{否,它都会将IEEE大端双精度inf
值的定义明确的位模式解压缩为float
。 1}}是该类型是否包含在内。但是为什么要写(或读)那个书? 3
但是,如果您使用的是Python 3.5或更高版本,则不需要 初始化这些值;您可以只使用the constants in the math
module:
float
如果您使用的是Python 2.7或3.4或类似的东西,则始终可以定义自己的常量并一遍又一遍地使用它们:
print(math.inf, +math.inf, -math.inf, math.nan)
1。从技术上讲,Python不需要IEEE浮点数。实际上,它所需要的是类似于平台的C inf, nan = float('inf'), float('nan')
print(inf, +inf, -inf, nan)
的行为,即C不必是IEEE类型,并且仅在对实现有意义的情况下才需要(例如,Jython显然将使用相关的Java类型,而无需关心用于编译JVM的C编译器的想法),并且它并没有确切说明像C double一样意味着什么。但是,除非double
与IEEE float类型相当接近,否则float
类型(更不用说math
模块之类的东西)真的无法工作。 -IEEE IBM和Intel类型或非IEEE-Motorola兼容类型。另外,自2018年起,三个现有Python 3.x实现中唯一受支持的平台都为您提供IEEE 754-1985 float
或IEEE 754-2008 double
。但是,如果这确实是代码的潜在问题,则应检查sys.float_info
以验证是否有任何相关假设。
2。可以想象某些平台可能使用IEEE 754-1985 float64
或IEEE 754-2008 long double
等。如果您担心这一点,请使用更大的数字。或者说float128
。
3。好吧,如果您特别需要一个安静的或发信号的NaN,或者是使用自定义位模式而不是默认位模式的…,但是任何需要的人大概已经知道他们需要它。
答案 1 :(得分:7)
您可以从math
模块访问那些数学常数:
>>> from math import inf, nan
>>> inf
inf
>>> nan
nan
>>> inf == float('inf')
True
在幕后,在CPython扩充中,使用与math.inf
和math.nan
相同的技术生成float('inf')
和float('nan')
;两种方法分别调用API函数_Py_dg_infinity
和_Py_dg_stdnan
。
答案 2 :(得分:4)
不确定这是否是您想要的,但是numpy具有为此内置的变量。
import numpy as np
a = np.inf
b = -np.inf
c = np.nan
print(a, b, c)
[inf, -inf, nan]
答案 3 :(得分:3)
math.inf
常量是python3.5中引入的,您可以在https://docs.python.org/3/library/math.html#constants中了解更多信息:
math.inf浮点正无穷大。 (对于负无穷大, 使用-math.inf。)等效于float('inf')的输出。
3.5版的新功能。
正如您在下面看到的,它们都是相同的:
>>> import math
>>> math.inf == float('inf')
True
>>> math.isinf(math.inf)
True
>>>
如果您还对如何在窗帘下检查无穷大感兴趣,可以看一下Py_IS_INFINITY宏。
答案 4 :(得分:2)
如果您希望通过数学运算获得这些值:
import numpy as np
a = np.array([-1,0,1],dtype='int8')
a/0
输出:
array([-inf, nan, inf])
此结果与IEEE 754 floating point behavior一致。
在IEEE 754算术中,当a为+时,a÷+0为正无穷大 正,当a为负时为负无穷大,当a =±0时为NaN。