有没有办法确定两种语言中哪一种计算更准确?
Is there a way to determine which of two languages is calculating more accurately?
情况:我运行用两种不同的语言(C++和Scilab)进行相同的计算。使用 sin() 和 exp() 等超越函数时,结果会略有不同。我假设这个小差异是由于以下原因造成的:
The IEEE standard does not require transcendental functions to be exactly rounded because of the table maker's dilemma.
来源:What Every Computer Scientist Should Know About Floating-Point Arithmetic.
问题:有没有办法让我确定这些语言中哪一种(如果有的话)在我的具体计算中更准确,没有自己手动计算?
我正在考虑将计算简单地放入 Wolfram Alpha 中,然后看看两者中哪一个更准确。不幸的是,我正在等待 this 问题(关于 Wolfram Alpha 的准确性)得到解答。
注意:发布这个问题后我仍然会尝试上面提到的 Wolfram 方法,但是有没有更简单、更有效的方法来确定两种语言中哪一种输出的结果更准确?
如果您想要超越数学函数的一致准确性,我建议您自己编写。
sin
等功能的实现方法多种多样。有些使用 table 值(例如小型嵌入式系统平台)进行硬件计算。
先验数学函数的实现通常取决于语言实现者。
顺便说一句,一般实现是 space、速度和准确性之间的中间地带。高度准确的版本可能需要大量 space 或大量时间。
至少如果你有自己的实现,你可以控制准确性而不是猜测语言实现的准确性。
从技术上讲,对此有一个初步的讨论:精度不同于准确度。准确性是衡量您的计算与真实值的接近程度的度量,无论它是什么;精度是许多计算彼此之间接近程度的度量。如果您根据一组计算结果的概率分布来思考,您会更好地理解。因此,例如,您的精度可能很差但精度很高。您 post 的标题是关于准确性的,但在 body 中您提到了精度。
我猜你的意思是 accuracy.
就是说,没有通用的答案。
您可以使用多种方法,实际上无限算法可以满足您的需求。
您需要:
- 像 GMP 这样的库,正如已经建议的那样
- 用纸笔评估算法的准确性
这是为什么?您需要比要比较的两个结果更准确地评估 sin(x)
。超越函数的算法是级数。所以你必须估计算法错误——在某些情况下,仍然是表示错误——如何影响你的计算。届时,实施您选择的方法,并评估您的结果与其他两个结果之间的距离,确保影响您的结果的总误差小于某个可控常数。
例如,评估 exp(10)
可以使用通常的围绕零的指数泰勒展开并使用许多项来完成;但是如果你对 exp(-10)
使用相同的方法,你可能会失败,因为它的展开式有交替的符号项。这意味着您可能会产生累积的抵消效应。你不想要这个,否则你的计算可能是精确的,但有偏见,不准确。
通常使用GMP,因为它是为此而设计的。
因此,例如,您可能会发现 Scilab 最擅长计算 exp(-10)
,而 C++ 最擅长 exp(10)
,只是因为它们可以使用不同的实现。
总结:使用GMP,并寻找准确的算法。例如,如果您需要某些特定傅里叶求和的准确结果,或者需要计算其他先验项的级数,这可能有效,或者是唯一的解决方案。
但是,如果您只需要简单 sin
和 exp
的答案,您应该查找表格,仅此而已。
情况:我运行用两种不同的语言(C++和Scilab)进行相同的计算。使用 sin() 和 exp() 等超越函数时,结果会略有不同。我假设这个小差异是由于以下原因造成的:
The IEEE standard does not require transcendental functions to be exactly rounded because of the table maker's dilemma.
来源:What Every Computer Scientist Should Know About Floating-Point Arithmetic.
问题:有没有办法让我确定这些语言中哪一种(如果有的话)在我的具体计算中更准确,没有自己手动计算?
我正在考虑将计算简单地放入 Wolfram Alpha 中,然后看看两者中哪一个更准确。不幸的是,我正在等待 this 问题(关于 Wolfram Alpha 的准确性)得到解答。
注意:发布这个问题后我仍然会尝试上面提到的 Wolfram 方法,但是有没有更简单、更有效的方法来确定两种语言中哪一种输出的结果更准确?
如果您想要超越数学函数的一致准确性,我建议您自己编写。
sin
等功能的实现方法多种多样。有些使用 table 值(例如小型嵌入式系统平台)进行硬件计算。
先验数学函数的实现通常取决于语言实现者。
顺便说一句,一般实现是 space、速度和准确性之间的中间地带。高度准确的版本可能需要大量 space 或大量时间。
至少如果你有自己的实现,你可以控制准确性而不是猜测语言实现的准确性。
从技术上讲,对此有一个初步的讨论:精度不同于准确度。准确性是衡量您的计算与真实值的接近程度的度量,无论它是什么;精度是许多计算彼此之间接近程度的度量。如果您根据一组计算结果的概率分布来思考,您会更好地理解。因此,例如,您的精度可能很差但精度很高。您 post 的标题是关于准确性的,但在 body 中您提到了精度。 我猜你的意思是 accuracy.
就是说,没有通用的答案。 您可以使用多种方法,实际上无限算法可以满足您的需求。 您需要:
- 像 GMP 这样的库,正如已经建议的那样
- 用纸笔评估算法的准确性
这是为什么?您需要比要比较的两个结果更准确地评估 sin(x)
。超越函数的算法是级数。所以你必须估计算法错误——在某些情况下,仍然是表示错误——如何影响你的计算。届时,实施您选择的方法,并评估您的结果与其他两个结果之间的距离,确保影响您的结果的总误差小于某个可控常数。
例如,评估 exp(10)
可以使用通常的围绕零的指数泰勒展开并使用许多项来完成;但是如果你对 exp(-10)
使用相同的方法,你可能会失败,因为它的展开式有交替的符号项。这意味着您可能会产生累积的抵消效应。你不想要这个,否则你的计算可能是精确的,但有偏见,不准确。
通常使用GMP,因为它是为此而设计的。
因此,例如,您可能会发现 Scilab 最擅长计算 exp(-10)
,而 C++ 最擅长 exp(10)
,只是因为它们可以使用不同的实现。
总结:使用GMP,并寻找准确的算法。例如,如果您需要某些特定傅里叶求和的准确结果,或者需要计算其他先验项的级数,这可能有效,或者是唯一的解决方案。
但是,如果您只需要简单 sin
和 exp
的答案,您应该查找表格,仅此而已。