Python中整数和浮点数的范围

4

I have these two small programs:

1.

x = 1000

while (1000 * x != x):
    x = 1000 * x

print("Done")

2.

x = 1000.0

while (1000.0 * x != x):
    x = 1000.0 * x

print("Done")

我正在努力猜测这些程序的执行方式。由于整数存储在4个字节(32位)中,我认为第一个程序将执行循环,直到x达到2^31,然后可能会出现错误。我猜测第二个循环将永远继续,因为浮点数可以存储比int更多的信息。
我的猜测完全错误。第一个程序似乎永远执行,而第二个程序在x达到大约10 ^ 308时退出循环并打印“Done” - 这是当x取inf(可能无限)时的情况。
我不明白这是如何工作的,任何解释都将不胜感激。谢谢!

6
在Python中,整数没有限制。而浮点数在一段时间后会溢出(可能是你提到的10^308值)。 - Jean-François Fabre
Python整数是对象,不同于其他语言中的原始类型。它们可以增长到你需要的大小(或者内存可以存储的大小)。将其视为Java中的BigInteger类即可。 - Christian Dean
3
sys.float_info会告诉你有关你所在平台上浮点数的实现方式。 - chepner
通常情况下,Python浮点数的实现是IEEE 754 binary64,正如chepner所说。 - PM 2Ring
这个回答解决了你的问题吗?int类型的最大值和最小值 - phuclv
2个回答

4
第一个整数示例会一直循环,直到没有可用内存为止(在这种情况下,进程将停止或机器将崩溃)。
x = 1000

while (1000 * x != x):
    x = 1000 * x

由于在Python中整数没有固定的大小,它们将使用所有可用的内存(在进程地址范围内)。
在第二个示例中,您正在乘以浮点值,该值具有限制,因为它使用了处理器浮点,8字节(Python float通常使用C double类型)
达到最大值后,它会溢出到“inf”(无限),在这种情况下。
1000 * inf == inf

一个小型的交互演示:

>>> f = 10.0**308
>>> f*2
inf
>>> f*2 == f*1000
True
>>> 

2

根据这篇文章:

当变量被初始化为整数值时,该值成为整数对象,并且变量指向它(引用该对象)。

Python消除了这种混乱,只有整数对象。它有限制吗?早期版本的Python有一个后来被删除的限制。现在的限制由计算机内存量设置。如果您想创建一个长度为5,000位的天文数字,那就去试试吧。唯一的问题是输入和阅读!Python是如何做到这一点的?它自动管理整数对象,最初设置为32位以提高速度。如果超过32位,则Python会根据需要增加其大小,直到达到RAM限制。

因此,示例1将在计算机具有RAM的情况下运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接