1

这似乎是非常简单的代码,但由于某种原因它不起作用。我需要在某些时候输出一个值,但 if 语句似乎没有在评估。以下是我正在尝试做的基本版本。

dt=.1

while t<=10:
     if t==5:
          print('yes')
     t+=.1

我在我的代码中确实尝试过这个,我什至让它在每个时间步都打印 t 但它不会打印“是”。我的代码中有其他 if 语句,时间间隔为

if 10<=t<60:
     do stuff

这些 if 语句运行完美。我已经尝试过t==5.0t==float(5)以防万一它需要,但它也不起作用。这让我发疯了,所以如果有人可以帮助我,那就太好了。我在 Ubuntu 12.4 上的 Spyder 中运行它,我收到一条消息说import sitecustomize失败。这和它有什么关系吗?我已经使用该消息运行了一段时间的代码,并且之前没有引起任何问题。

编辑

搞定了,我用过

if int(t)==5 and t<5+dt:

谢谢您的帮助

4

5 回答 5

3

1) 浮点数没有无限精度——它们在内存中占用一定数量的位(通常为 64 或 32)。

2)他们对尾数使用二进制内部表示(基本上除了第一个有效数字之外的所有有效数字)。

3) .1 不能精确地存储为二进制表示 - 只能作为二进制位的无限重复模式,并且由于尾数只有这么大,浮点数实际上是 0.1 的近似值,而不是真正的 0.1。(然而,像 0.5 和 0.25 这样的东西可以)

4) 因此,将 0.1s 相加并不能保证有完美的结果 - 以错误的方式四舍五入会出现错误。例如,将 0.1 添加到自身十次可能会得到 1.0000...1 或 0.999999...9。

请参阅http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html每个计算机科学家都应该了解的浮点运算知识

于 2013-04-11T05:19:27.357 回答
2

有很多评论为什么浮点运算不准确,但没有回答如何修复代码。

长话短说,while t<10.0+dt/2if abs(t-5.0) <= dt/2

于 2013-04-11T05:32:57.250 回答
1

根据您编写的代码编写的一个非常糟糕的示例对我来说已经足够好了。
所以精度控制可能是您正在寻找的:
http ://docs.python.org/3.3/library/decimal

    from decimal import *
    getcontext().prec = 3

    dt=.1

    t = 0

    while t <= 10:
        if Decimal(t) == 5:
            print('yes')
        t = Decimal(Decimal(t) + Decimal(dt))
        print(t)
于 2013-04-11T05:52:35.123 回答
0

这是因为您t是浮点数,并且在机器代码中的表示精度不是 100%。您需要将其转换为整数,或更改if条件以解决此问题(转换为整数或使用不等式)。

于 2013-04-11T05:18:26.470 回答
0

试试这个将 t (它是浮点数)转换为整数然后比较..

if int(t) == 5:
   ...

或者

import math
t_flr = math.floor(t)
if t_flr == 5:
   ...
于 2013-04-11T05:22:09.360 回答