2017-05-25 53 views
2

我在ubuntu 16.04.2 LTS和NumPy 1.12.1中使用python 3.5.2。当我使用poly1d函数获取coeffs,有一个与计算的错误:当他们是非常大的整数时,poly1d会给出错误的系数

>>> from numpy import poly1d 
>>> from math import fabs 
>>> pol = poly1d([2357888,459987,78123455],True) 
>>>[int(x) for x in pol.coeffs] 
[1, -80941330, 221226728585581, -84732529566356586496] 

如您在此列表中看到的最后一个元素是不正确的。当我建立使用Wolfram Alpha的多项式,我得到:

x^3 - 80941330 x^2 + 221226728585581 x - 84732529566356580480 

最后系数不同使用poly1d(第一一端在... 496和480 ...的另一端)。②有假设正确的是最后一次计算(由WolframAlpha制作)。

这是一个错误还是我没有考虑到的东西?我用低绝对值的根探查;在这种情况下计算是正确的。但是当我使用“大根”时,差异是显着的。

回答

3

正如Warren Weckesser所说,这是一个精确的问题。但是可以通过将根数组声明为object类型来解决它。通过这种方式,您可以利用Python的大整数或mpmath对象提供的更高精度。 NumPy足够体贴not to coerce them to double precision。例如:

import numpy as np 
roots = np.array([2357888, 459987, 78123455], dtype=object) 
pol = np.poly1d(roots, True) 
print(pol.coeffs) 

输出:[1 -80941330 221226728585581 -84732529566356580480]

3

系数存储为64位浮点值。这些没有足够的精确度来准确表示值-84732529566356580480。

+0

是的,这是我的猜测,但我需要确认。 – Alexis

相关问题