为啥 math.inf 是浮点数,为啥我不能将其转换为整数?

Posted

技术标签:

【中文标题】为啥 math.inf 是浮点数,为啥我不能将其转换为整数?【英文标题】:Why is math.inf a float and why can't I convert it to an integer?为什么 math.inf 是浮点数,为什么我不能将其转换为整数? 【发布时间】:2019-05-02 23:32:18 【问题描述】:

我正在做一些实验,我正在尝试这样做:

import math
for i in range(math.inf):
    print(i)

我希望它和这个完全一样:

c = 0
while True:
    print(c)
    c += 1

但它更像这样

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object cannot be interpreted as an integer

然后我尝试将inf 转换为浮点数:

import math
for i in range(int(math.inf)):
    print(i)

但这给了我这个错误,说你不能将浮点无穷大转换为整数。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: cannot convert float infinity to integer

现在我的问题是为什么会发生这种情况以及为什么无穷大首先是一个浮点数。是因为一些潜在的数学规律,还是因为这样做而产生的某些问题的解决方案?

提前致谢!

【问题讨论】:

部分原因是在传统平台上,整数只能与 CPU 内部可用的每个寄存器的位数一样大,因此会溢出。在数据结构方面,IEEE 浮点数旨在以特定方式“表示”inf。但是,从数学上讲,无穷大实际上是不同的类型,因此它不是数字,因此它实际上不能是整数。在 this answer I gave in this thread 中,其他用户遇到了与您可能感兴趣的类似但不同的问题。 【参考方案1】:

无穷大不是整数

math.inf 等价于float('inf') 并且是按照IEEE 754 实现的浮点功能(除了NaN 值等)。来自 Python 更新摘要:

添加了许多浮点功能。 float() 函数现在将 将字符串 nan 转换为 IEEE 754 Not A Number 值,然后 +inf 和 -inf 为正无穷或负无穷。这适用于任何具有 IEEE 754 语义的平台。 (克里斯蒂安·海姆斯供稿;问题 第1635章)


但是,如果您想迭代 ℕ 而不使用 while 循环,那么生成器的魔力可以帮助您。

import itertools
natural_numbers = itertools.count()

for n in natural_numbers:
    ...

或者您可以使用itertools.count(1) 遍历ℤ+ ;)

【讨论】:

【参考方案2】:

math.inf 不是特定值;它是一个特殊的标识符,更多的是nan 的顺序而不是一个值。它被定义为一个浮点数,用于标记需要特殊处理的值。它的语义定义是它大于任何可表达的值:它是无穷大。您不能将其转换为 int,因为没有定义的等效项。

可能想要将常量sys.maxint 用于您的目的。更多详情请参阅here。

【讨论】:

math.inf 是一个具体的值;根据 IEEE-754 标准,它是 ∞。

以上是关于为啥 math.inf 是浮点数,为啥我不能将其转换为整数?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们不能在不添加偏差或将其转换为 2 或 1 补码的情况下存储 IEEE 浮点数的指数? [复制]

为啥我会收到不支持的操作数类型错误?

java做除法运算,为啥除不开时也会得到整数呢

为啥 std::abs() 不能与浮点数一起使用

OpenGL:为啥我不能将单个浮点数从顶点着色器传递到片段着色器?

为啥不能为非浮点数定义“round”?