Python numpy的浮点精度不好

Python numpy的浮点精度不好,python,numpy,Python,Numpy,我有一个数学问题的解决方案,看起来像这样(很抱歉格式化,这就是PyCharm所做的): 这个计算在Python中运行得比较慢,所以我想使用numpy来提高速度。结果如下所示: u2 = u ** 2 u3 = u ** 3 u4 = u ** 4 v2 = v ** 2 v3 = v ** 3 v4 = v ** 4 uv_s = np.array((u4, u3 * v, u3, u2 * v2, u2 * v, u2, u * v3, u * v2, u * v, u, v4, v3, v

我有一个数学问题的解决方案,看起来像这样(很抱歉格式化,这就是PyCharm所做的):

这个计算在Python中运行得比较慢,所以我想使用numpy来提高速度。结果如下所示:

u2 = u ** 2
u3 = u ** 3
u4 = u ** 4
v2 = v ** 2
v3 = v ** 3
v4 = v ** 4

uv_s = np.array((u4, u3 * v, u3, u2 * v2, u2 * v, u2, u * v3, u * v2, u * v, u, v4, v3, v2, v, 1))
sigma = np.dot(wf_s[:15], uv_s) / np.dot(wf_s[15:], uv_s)

sigma = sqrt(sigma)

uv_xy_n = np.array((u2 * sigma, u2, u * v * sigma, u * v, u * sigma, u, v2 * sigma, v2, v * sigma, v, sigma, 1))
uv_xy_d = np.array((u2, u * v, u, v2, v, 1))
x12 = np.dot(wf_x1[:12], uv_xy_n) / np.dot(wf_x1[12:], uv_xy_d)
x22 = np.dot(wf_x2[:12], uv_xy_n) / np.dot(wf_x2[12:], uv_xy_d)
y12 = np.dot(wf_y1[:12], uv_xy_n) / np.dot(wf_y1[12:], uv_xy_d)
y22 = np.dot(wf_y2[:12], uv_xy_n) / np.dot(wf_y2[12:], uv_xy_d)
理论上,这个方法很好,运行速度比我的第一个方法快3倍,但结果的准确性很糟糕。在我的例子中,x和y有数百个,第二种方法产生的结果与实际结果相差0.2。这种准确性在我的情况下是没有用的。绘制第一种方法的结果将生成预期的完美曲线图。绘制第二种方法的结果将生成超噪图


为什么numpy版本的准确性如此之差?我如何改进它?

如果您可以选择更长的数字类型(np.longdouble),可以尝试一下吗?(它是否有效地使用它,取决于您的系统)一个问题是numpy总是计算pow(基数,指数)。对于小指数,这是非常缓慢的。一如既往,绩效相关问题提供了一些有代表性的输入数据。(一个带有输入和输出的函数,输入数据可以是一些带有随机数的数组…)如果您可以选择更长的数字类型(np.longdouble),是否可以尝试一下?(它是否有效地使用它,取决于您的系统)一个问题是numpy总是计算pow(基数,指数)。对于小指数,这是非常缓慢的。一如既往,绩效相关问题提供了一些有代表性的输入数据。(一个具有输入和输出的函数,输入数据可以是一些带有随机数的数组…)
u2 = u ** 2
u3 = u ** 3
u4 = u ** 4
v2 = v ** 2
v3 = v ** 3
v4 = v ** 4

uv_s = np.array((u4, u3 * v, u3, u2 * v2, u2 * v, u2, u * v3, u * v2, u * v, u, v4, v3, v2, v, 1))
sigma = np.dot(wf_s[:15], uv_s) / np.dot(wf_s[15:], uv_s)

sigma = sqrt(sigma)

uv_xy_n = np.array((u2 * sigma, u2, u * v * sigma, u * v, u * sigma, u, v2 * sigma, v2, v * sigma, v, sigma, 1))
uv_xy_d = np.array((u2, u * v, u, v2, v, 1))
x12 = np.dot(wf_x1[:12], uv_xy_n) / np.dot(wf_x1[12:], uv_xy_d)
x22 = np.dot(wf_x2[:12], uv_xy_n) / np.dot(wf_x2[12:], uv_xy_d)
y12 = np.dot(wf_y1[:12], uv_xy_n) / np.dot(wf_y1[12:], uv_xy_d)
y22 = np.dot(wf_y2[:12], uv_xy_n) / np.dot(wf_y2[12:], uv_xy_d)