【问题标题】:Is it normal that my 2015 macbook air having trouble at running a simple while loop?我的 2015 macbook air 在运行简单的 while 循环时遇到问题是否正常?
【发布时间】:2015-08-25 19:55:15
【问题描述】:
from math import cos 
x = 2
while x != cos(x):
    x = cos(x)
print (x)

这是我运行基本级别 2015 mac Air 的代码。我等了大约 30-40 秒,此时我的笔记本电脑开始变成热板。我没有得到答案。这是正常的吗?我不认为运行它会花费那么多精力,尤其是在阅读了人们如何轻松地在他们的 Airs 上同时运行 30 多个标签、Xcode、电影流之后。

如果有帮助,我会使用终端运行它。

规格为 4gb 内存/128gb sdd/i5-5250u(?)

【问题讨论】:

  • 繁忙的 CPU 就是热 CPU:工作需要能量,会产生热量。循环永远不会终止并使 CPU 毫无意义地忙碌。运行循环并不是“可怕”;就是这台可怜的笔记本电脑正在推动它的散热范围,试图完成所要求的(尽管没用的)任务。
  • 可能会遇到一些浮点问题。
  • 在我的 Ubuntu PC 上,这个循环运行了 92 次迭代,然后才找到相等性。但是,所描述的症状是使 CPU 处于忙碌状态的无限循环。
  • IIRC,在CPython中,math.cos只是调用底层C平台的余弦函数。我希望不同的操作系统有不同的 C 编译器,所以行为不同并不让我感到惊讶。

标签: python macos floating-point


【解决方案1】:

更好的是:

from math import cos

def diff(lhs, rhs, delta):
    return abs(lhs - rhs) > delta

curr = 2.0
prev = 0.1    
while diff(curr, prev, 0.00000001):
    curr, prev = cos(curr), curr

这样你每次循环只计算一次cos()

【讨论】:

    【解决方案2】:

    由于浮点数学不精确(尝试在您的解释器中使用0.1 + 0.2),您很有可能永远不会得到相等。即使是这样,是否需要大量的迭代才能获得 exact 相等性(它可能是一个无限级数;我不知道)?您应该做的是检查差异是否大于一些非常小的数字,例如 0.000000000001:

    while abs(x - cos(x)) > 0.000000000001:
    

    这将确保它最终停止。

    【讨论】:

    • 谢谢!那工作得很好。天哪,这些东西有很多细微差别,这太疯狂了!对不起,如果这个问题有点毫无意义......你可以告诉我是一个初学者
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2017-06-02
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多