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

And*_*ely 9 python python-3.x

要将float常量初始化为+ inf,-inf,nan我总是使用带有字符串的float():

print(float('inf'), float('+inf'), float('-inf'), float('nan'))
Run Code Online (Sandbox Code Playgroud)

这打印:

[inf, inf, -inf, nan]
Run Code Online (Sandbox Code Playgroud)

1.)Python中是否存在初始化这些常量的替代方法(不使用字符串调用float)?

2.)我可以用一些数学运算产生这些常数(+/- inf,nan)吗?

例如,对于变量设置f+inf,通过编写类似f = 1.0 / 0.0(显然,这是零错误分公司).

aba*_*ert 14

从技术上讲,是的,还有其他方法来初始化这些值,但它们都不太明显,或者不那么方便.

如果你的平台使用IEEE浮点数1,那么任何float溢出的算法,除了溢出之外不会引发任何其他标志,都可以保证给你inf.这意味着1.0 / 0.0可能无法工作(Python将检测到这是一个除零),但更简单的意思1e500.2

一旦你有了inf,你可以做到-infinf/inf获得负无穷大和NaN值.

但是会有人读你代码的理解1e500 / 1e500是容易的float('nan')?可能不是.

与此同时,您可以随时执行类似的操作struct.unpack('>f', b'\x7f\x80\0\0')[0],将IEEE big-endian double inf值的明确定义的位模式解包为a float,无论您是否float属于封底类型.但是你为什么要写(或读)呢?3


但是,如果您使用的是Python 3.5或更高版本,则无需初始化这些值; 你可以使用模块中的常量math:

print(math.inf, +math.inf, -math.inf, math.nan)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 2.7或3.4或其他东西,您可以随时定义自己的常量并一遍又一遍地使用它们:

inf, nan = float('inf'), float('nan')

print(inf, +inf, -inf, nan)
Run Code Online (Sandbox Code Playgroud)

1.从技术上讲,Python不需要IEEE浮点.实际上,它所需要的东西就像平台的C-C double,它不需要是IEEE类型,只有当它对实现有意义时(例如,Jython显然会使用相关的Java类型而不需要关心用于编译JVM的C编译器认为是什么,并且它没有明确说明像C双重操作的含义.然而,float类型 - 更不用说像math模块这样的东西- 实际上是不会起作用的,除非它float是一种合理接近IEEE浮点类型的东西,比如可能是IEEE之前的IBM和英特尔类型或者不那么IEEE的摩托罗拉compat类型.此外,截至2018年,三个现有Python 3.x实现中任何一个支持的平台都提供IEEE 754-1985 double或IEEE 754-2008 float64.但是,如果这确实是您的代码的潜在问题,您应该检查sys.float_info以验证相关的假设.

2.可以想象某些平台可能使用IEEE 754-1985 long double或IEEE 754-2008等float128.如果您对此感到担心,请使用更大的数字.或者说,1e500 ** 1e500 ** 1e500.

3.好吧,如果你特别需要一个安静或信号NaN,或一个自定义位模式而不是默认位...但任何需要的人都可能已经知道他们需要它.


Mos*_*oye 7

您可以从math模块中访问这些数学常量:

>>> from math import inf, nan
>>> inf
inf
>>> nan
nan
>>> inf == float('inf')
True
Run Code Online (Sandbox Code Playgroud)

场景,在CPython的inplementation后面,math.infmath.nan使用相同的技术,其中产生float('inf')float('nan')使用; 这两种方法调用API函数_Py_dg_infinity_Py_dg_stdnan分别.