打印的值不正确。在您的情况下,使用时y小于使用时1,使用时float64大于或等于. 这是意料之中的,因为舍入误差取决于.1float32float
为避免此类问题,在处理浮点数时,您应该始终确定“最小误差”,通常称为“最小误差”,而不是比较是否相等,而是检查结果是否与目标值epsilon最远:epsilon
In [13]: epsilon = 1e-11
In [14]: number = np.float64(1) - 1e-16
In [15]: target = 1
In [16]: abs(number - target) < epsilon # instead of number == target
Out[16]: True
特别是,numpy已经提供了np.allclose在给定一定容差的情况下比较数组是否相等的有用的方法。即使参数不是数组(例如np.allclose(1 - 1e-16, 1) -> True),它也可以工作。
但是请注意,numpy.set_printoptions这不会影响np.float32/64的打印方式。它只影响数组的打印方式:
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: np.array([1 - 1e-16])
Out[3]: array([ 1.])
In [4]: np.set_printoptions(precision=16)
In [5]: np.array([1 - 1e-16])
Out[5]: array([ 0.9999999999999999])
In [6]: np.float(1) - 1e-16
Out[6]: 0.9999999999999999
另请注意,在交互式解释器中执行print y或评估会产生不同的结果:y
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: print(np.float64(1) - 1e-16)
1.0
不同之处在于在评估调用时print调用:strrepr
In [9]: str(np.float64(1) - 1e-16)
Out[9]: '1.0'
In [10]: repr(np.float64(1) - 1e-16)
Out[10]: '0.99999999999999989'