【问题标题】:Range of int and float in PythonPython中int和float的范围
【发布时间】:2018-03-14 20:24:25
【问题描述】:

我有这两个小程序:

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 后打印“完成”——这是 x 取值 inf(可能是无限的)的时候。

我不明白这是如何工作的,任何解释都将不胜感激。谢谢!

【问题讨论】:

  • 整数在 python 中没有限制。一段时间后浮动(可能是您提到的 10^308 值)
  • Python 整数是对象。没有像其他语言中的原始类型。比你需要的大(或你的记忆可以存储的大)。把它们想象成 Java 的 BigInteger 类。
  • sys.float_info 将告诉您浮动是如何在您的特定平台上实现的。
  • 切普纳说了什么。通常,Python 浮点数实现为 IEEE 754 binary64

标签: python python-3.x while-loop floating-point


【解决方案1】:

第一个整数示例将循环直到没有可用内存(在这种情况下进程将停止或机器将交换到死):

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】:

    来自this article:

    当一个变量用一个整数值初始化时,这个值变成一个整数对象,变量指向它(引用该对象)。

    Python 消除了这种混淆,只有整数对象。它有任何限制吗?非常早期的 Python 版本有一个限制,后来被删除了。现在的限制是由您计算机中的内存量设置的。如果您想创建一个 5,000 位长的天文整数,请继续。打字或阅读将是唯一的问题! Python 是如何做到这一切的?它自动管理整数对象,该对象最初设置为 32 位以提高速度。如果超过 32 位,则 Python 会根据需要将其大小增加到 RAM 限制。

    因此,只要您的计算机有 RAM,示例 1 就会运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多