使用IPython时避免小的数字错误

时间:2015-12-28 00:38:34

标签: python numpy floating-point ipython

我一直在从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中避免这个错误?

2 个答案:

答案 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