1

我对生成的对象有最奇怪的行为numpy.arange

for i in numpy.arange(xo, xn+h, h):
    xs.append(float(i))

在这种情况下,xo=1xn=4h=0.1

现在,我希望xs[-1]完全等于4.0== float(4)。但是,我得到以下信息:

>>> foo = xs[-1]
>>> foo == float(4)
False
>>> float(foo) == float(4)
False
>>> foo
4.0
>>> type(foo)
<type 'float'>
>>> int(sympy.ceiling(4.0)), int(sympy.ceiling(foo))
4 5

这里到底发生了什么?

放入print type(i)循环for打印<type 'numpy.float64'>。也许在float(i)选角过程中发生了什么?使用numpy.asscalar不会改变任何东西。

使用math.ceil(foo)而不是sympy.ceiling(foo)问题相同的事情(这是我实际需要工作的部分)。

4

2 回答 2

2
In [10]: for i in numpy.arange(xo, xn+h, h):
        xs.append(float(i))
....:     

In [11]: xs
Out[11]: 
[1.0,
1.1,
1.2000000000000002,
1.3000000000000003,
1.4000000000000004,
1.5000000000000004,
1.6000000000000005,
1.7000000000000006,
1.8000000000000007,
1.9000000000000008,
2.000000000000001,
2.100000000000001,
2.200000000000001,
2.300000000000001,
2.4000000000000012,
2.5000000000000013,
2.6000000000000014,
2.7000000000000015,
2.8000000000000016,
2.9000000000000017,
3.0000000000000018,
3.100000000000002,
3.200000000000002,
3.300000000000002,
3.400000000000002,
3.500000000000002,
3.6000000000000023,
3.7000000000000024,
3.8000000000000025,
3.9000000000000026,
4.000000000000003]

这就是为什么你没有得到想要的结果,由于浮点精度,它不能给你的测试 True。这也解释了为什么如果你在它上面做一个像天花板这样的圆形操作,你会得到五个而不是四个。

编辑:要检查 x 和 y 是否相同(在一定误差范围内),您可以执行以下操作,但我认为(应该)python 中已经有一些东西可以为您执行此操作

def isnear(x,y, precision = 1e-5):
    return abs(x-y)<precision

edit2:或如 ali_m 所说:

numpy.allclose(x, y, atol = 1e-5)
于 2013-10-22T07:42:20.450 回答
1

这并不奇怪——这正是浮点运算的工作方式,因为它不能准确地表示大多数值。如果您在浮点数中重复计算(arange()这里是将 0.1 加到 1,然后再将 0.1 加到该总和上 29 次)并且如果您正在处理的数字不能用浮点数精确表示,您将不会得到准确的答案在计算结束时。最好的文章是What Every Computer Scientist Should Know About Floating-Point Arithmetic

于 2013-10-22T07:41:50.410 回答