我一直在从Matlab切换到IPython。 在IPython中,如果我们将3.1乘以2.1,则结果如下:
In [297]:
3.1 * 2.1
Out[297]:
6.510000000000001
有一个小的舍入错误。这不是一个大问题,但它有点烦人。我假设它在将十进制数转换为二进制数时出现,反之亦然,是不是?
但是,在Numpy数组中,结果是正确的:
>>> np.array([3.1 * 2.1])
array([ 6.51])
在Matlab命令行提示符下,结果也是正确的:
>> 3.1 * 2.1
ans =
6.5100
Python中的上述舍入错误看起来很烦人。有没有办法在python交互模式或IPython中避免这个错误?
答案 0 :(得分:3)
numpy结果并不比纯Python结果更精确 - 浮点不精确只是对你隐藏,因为默认情况下,numpy会打印结果中较少的小数位:
In [1]: float(np.array([3.1 * 2.1]))
Out[1]: 6.510000000000001
您可以使用np.set_printoptions
控制numpy如何显示浮点数。例如,要打印16个小数位而不是通常的8位
In [2]: np.set_printoptions(precision=16)
In [3]: np.array([3.1 * 2.1])
Out[3]: array([ 6.5100000000000007])
在IPython中,您还可以使用%precision
魔法来控制漂亮打印普通Python浮动时显示的小数位数:
In [4]: %precision 8
Out[4]: u'%.8f'
In [5]: 3.1 * 2.1
Out[5]: 6.51000000
请注意,这纯粹是装饰性的 - 3.1 * 2.1
的值仍然等于6.5100000000000006750155990...
而不是6.51
。
答案 1 :(得分:2)
在Octave中,一个MATLAB克隆,我可以显示那些遥远的小数:
error: too many arguments for method apply: (i: Int)String in class Array
他们也出现在octave:12> printf("%24.20f\n", 3.1*2.1)
6.51000000000000067502
numpy.array
即使是组件术语也涉及这种舍入:
In [6]: np.array([3.1*2.1]).item()
Out[6]: 6.510000000000001