在处理某个问题时,我偶然发现了一些我自己无法解决的问题。
我有一个变量:
a = pow(2, 1024)
它的类型是long int。如果我尝试将其显式转换为float,例如float(a)
,则会收到OverflowError
。这个数字太大,不适合64位浮点数,所以这是可以理解的。
然后我尝试使用隐式转换,通过浮点数多次执行:
b = a * 11.0
再次发生OverflowError
,这很好,因为根据python docs,从long int到float的隐式转换发生了。结果就像之前一样。
最后,我尝试比较:
a > 11.0
返回True
。 OverflowError
没有发生。这让我很困惑。 Python比较机制如何工作,如果它不要求数字采用相同的格式? Accordind this,
Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有“较窄”类型的操作数被扩展为另一个的操作数,其中普通整数比窄整数更窄比浮点比复杂更窄。 混合类型数之间的比较使用相同的规则。构造函数int(),long(),float()和complex()可用于生成特定类型的数字。
我的问题是,为什么a
在前面提到的比较中没有被抛弃?
我使用的Python版本是2.7.15。谢谢你提前
答案 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
(并且确实)