0

我简单地测试了mpmathgsl的从句函数。代码如下:

mp.prec = 53
time_begin = time.time()
print "mpmath results:"
print clsin(2,3.1415926535897327)
print "time1:"
print (time.time() - time_begin)
time_begin = time.time()
print "gsl results:"
print gsl_sf_clausen(3.1415926535897327)
print "time2"
print (time.time() - time_begin)

结果如下:

mpmath results:
4.19482951966115e-14
time1:
0.00391387939453
gsl results:
4.18544219761e-14
time2
2.69412994385e-05

从我在相同精度上找到的结果来看,结果相差很大(mpmath:4.19...但是gsl:4.18...),我想知道哪个更准确?并且在相同精度下,mpmath 比 gsl_sf_clausen 慢 100 多倍,为什么?

谢谢

4

1 回答 1

1

您可能知道,克劳森函数在 x = pi 处正好为 0。你给它喂了一个非常接近 pi 的数字。根据克劳森函数的评估是如何实现的,此时的计算可能会由于几乎完全取消项而导致重要性的损失。

据推测,gsl 和 mpmath 没有相同的克劳森函数实现,因此它们的运行时间和输出不同。这并不罕见。即使对于像求矩阵的逆这样看似简单的事情,有时您也会遇到不同的包返回不同的结果,同时以相同的精度水平运行。

Wolfram Alpha返回 4.19620646966946940430... e-14,更接近 mpmath 值。如果mpmath提高精度,它本身将与 WolframAlpha 一致。

>>> mp.dps = 25
>>> clsin(2, mpf('3.1415926535897327'))
mpf('4.196206469668926047718406898e-14')

这给我们带来了另一点:mpmath设计用于任何给定精度的浮点数,而gsl似乎使用双精度浮点数(我真的不知道它的内部结构)。因此,在mpmath设计时考虑到可能需要非常高的精度的算法需要更长的运行时间也就不足为奇了。

于 2017-05-02T02:33:06.173 回答