在比较Python中的数值时进行隐式转换

时间:2018-06-05 11:40:01

标签: python

在处理某个问题时,我偶然发现了一些我自己无法解决的问题。

我有一个变量: a = pow(2, 1024)

它的类型是long int。如果我尝试将其显式转换为float,例如float(a),则会收到OverflowError。这个数字太大,不适合64位浮点数,所以这是可以理解的。

然后我尝试使用隐式转换,通过浮点数多次执行:

b = a * 11.0

再次发生OverflowError,这很好,因为根据python docs,从long int到float的隐式转换发生了。结果就像之前一样。

最后,我尝试比较:

a > 11.0 返回TrueOverflowError没有发生。这让我很困惑。 Python比较机制如何工作,如果它不要求数字采用相同的格式? Accordind this

  

Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有“较窄”类型的操作数被扩展为另一个的操作数,其中普通整数比窄整数更窄比浮点比复杂更窄。 混合类型数之间的比较使用相同的规则。构造函数int(),long(),float()和complex()可用于生成特定类型的数字。

我的问题是,为什么a在前面提到的比较中没有被抛弃?

我使用的Python版本是2.7.15。谢谢你提前

2 个答案:

答案 0 :(得分:7)

来自source

/* Comparison is pretty much a nightmare.  When comparing float to float,
 * we do it as straightforwardly (and long-windedly) as conceivable, so
 * that, e.g., Python x == y delivers the same result as the platform
 * C x == y when x and/or y is a NaN.
 * When mixing float with an integer type, there's no good *uniform* approach.
 * Converting the double to an integer obviously doesn't work, since we
 * may lose info from fractional bits.  Converting the integer to a double
 * also has two failure modes:  (1) a long int may trigger overflow (too
 * large to fit in the dynamic range of a C double); (2) even a C long may have
 * more bits than fit in a C double (e.g., on a 64-bit box long may have
 * 63 bits of precision, but a C double probably has only 53), and then
 * we can falsely claim equality when low-order integer bits are lost by
 * coercion to double.  So this part is painful too.
 */

因此,考虑了转换的潜在缺陷。

答案 1 :(得分:3)

确切错误为OverflowError: int too large to convert to float

这也意味着产生该错误的任何int按照定义更大然后任何可能的浮点数。所以只要检查它是否更大就应该返回True

我不完全确定,但如果实现只是在后台捕获此错误(尝试转换为float)并在此情况下返回True,我不会感到惊讶

除了float('inf')之外,情况总是如此,这是一个特殊情况应该返回False(并且确实)