从技术上讲,是的,还有其他方法可以初始化这些值,但它们要么不太明显,要么不太方便。
如果您的平台使用 IEEE 浮点,1 任何溢出的float 算术,除了溢出之外不引发任何其他标志,保证给您inf。这意味着1.0 / 0.0 可能不起作用(Python 会检测到这是除以零),但更简单的1e500 会。2
拥有inf 后,您只需执行-inf 和inf/inf 即可获得负无穷大和NaN 值。
但是阅读您的代码的人会像理解float('nan') 一样容易理解1e500 / 1e500 吗?应该不会吧。
同时,您始终可以执行struct.unpack('>f', b'\x7f\x80\0\0')[0] 之类的操作,它将 IEEE 大端双精度 inf 值的明确定义的位模式解压缩为 float,无论您的 float 是否是覆盖与否。但是你为什么要写(或读)那个呢?3
但是,如果您使用的是 Python 3.5 或更高版本,则不需要 初始化这些值;你可以使用the constants in the math module:
print(math.inf, +math.inf, -math.inf, math.nan)
如果您使用的是 Python 2.7 或 3.4 或其他版本,您始终可以定义自己的常量并反复使用它们:
inf, nan = float('inf'), float('nan')
print(inf, +inf, -inf, nan)
1。从技术上讲,Python 不需要 IEEE 浮点。事实上,它需要的是类似于平台的 C double 的东西——C 不需要是 IEEE 类型,并且只有在这对实现有意义的情况下(例如,Jython 显然会使用相关的Java 类型而不关心用于编译 JVM 的 C 编译器的想法),并且它并没有明确说明像 C 双精度一样的行为意味着什么。然而,float 类型——更不用说math 模块之类的东西——真的不会工作,除非float 是相当接近 IEEE 浮点类型的东西,比如可能是前 IEEE 的 IBM 和 Intel 类型或不完全 IEEE 摩托罗拉兼容类型。此外,截至 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,或者一个具有自定义位模式而不是默认的......但任何需要它的人可能已经知道他们需要它。