为什么这会失败?我创建一个数组,用该数组创建一个新变量减去数组中的值,然后将数组与出现的值进行比较。那么为什么平等测试会失败呢?
import numpy as np
import platform
print platform.python_version()
print np.__version__
x = np.arange( -1,1,0.1 )
new_x = x - x[5]
print new_x
print new_x == -0.2
输出:
2.7.9
1.9.2
[-0.5 -0.4 -0.3 -0.2 -0.1 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4]
[False False False False False False False False False False False False False False False False False False False False]
编辑: 使用np.round()会使比较按预期运行;现在的问题是,为什么我打印数组时会出现舍入数字?根据我的经验,当数字不准确时,python通常会打印科学记数法或只是一堆小数位。
令人震惊的是,我已经在科学上用python编程了6年,从未见过这个!这感觉就像一个菜鸟问题,但我真的不明白为什么打印的是圆形的。
答案 0 :(得分:3)
正如您所怀疑的,奇怪的行为是由于在浮点计算期间发生的小精度错误。要查看差异,可以使用float.hex()
:
>>> new_x[3].hex()
'-0x1.9999999999998p-3'
>>> (-0.2).hex()
'-0x1.999999999999ap-3'
请注意,它们实际上是两个不同的浮点数。 "舍入"仅在打印时发生,实际上是Python itself does by default。基本思想是Python对象(包括浮点数)有两种形式的字符串表示形式:str
和repr
。虽然repr
应该返回一个"真实的",可重现的字符串表示,str
应优化人类可读性 - 其中一部分包括"舍入",以隐藏精度误差小。注意:
>>> repr(new_x[3])
'-0.19999999999999996'
>>> repr(-0.2)
'-0.2'
对于浮点数,您可以使用numpy.isclose()
模拟相等性检查,如下所示:
>>> print numpy.isclose(new_x, -0.2)
[False False False True False False False False False False False False
False False False False False False False False]