当系数是非常大的整数时,poly1d 会给出错误的系数

Ale*_*is 3 python numpy polynomials

我正在 ubuntu 16.04.2 LTS 和 NumPy 1.12.1 中使用 python 3.5.2。当我使用 poly1d 函数获取 coeffs 时,计算出现错误:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

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

x^3 - 80941330 x^2 + 221226728585581 x - 84732529566356580480
Run Code Online (Sandbox Code Playgroud)

最后一个系数与使用 poly1d 时不同(第一个系数以 ...496 结尾,另一个以 ...480 结尾)。我必须假设正确的系数是最后一次计算(由 WolframAlpha 制作)。

这是一个错误还是有什么我没有考虑到的?我用低绝对值的根进行了探索;在这种情况下,计算是正确的。但当我使用“大根”时,差异就很明显了。

小智 5

正如 Warren Weckesser 所说,这是一个精度问题。但可以通过将根数组声明为对象类型来解决此问题。通过这种方式,您可以利用 Python 的大整数或mpmath对象提供的更高精度。NumPy 足够体贴,不会强制它们使用双精度。例子:

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

输出:[1 -80941330 221226728585581 -84732529566356580480]