将float初始化为'+ inf','-inf'和'nan'的替代方法

时间:2018-08-01 19:51:23

标签: python python-3.x

要将浮点常量初始化为+ 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(显然,这是零误差除法)。

5 个答案:

答案 0 :(得分:14)

从技术上讲,是的,还有其他初始化此类值的方法,但它们要么不那么明显,要么不那么方便。

如果您的平台使用IEEE浮点,则 1 任何溢出的float算法都可以为您提供inf,并且不会引起溢出。这意味着1.0 / 0.0可能无法正常工作(Python会检测到这是一个零除数),但更简单的1e500将会。 2

一旦有了inf,就可以执行-infinf/inf来获得负无穷大和NaN值。

但是有人会读您的代码吗?1e500 / 1e500float('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.infmath.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。