有没有办法确定两种语言中的哪一种更准确地计算?

时间:2016-06-17 19:28:53

标签: c++ precision scilab wolframalpha

情况:我用两种不同的语言(C ++和Scilab)运行相同的计算。当使用像sin()和exp()这样的超越函数时,结果会略有不同。我假设这个小差异是由于以下原因:

  

由于桌面制造商的困境,IEEE标准不要求超越功能完全舍入

来源:What Every Computer Scientist Should Know About Floating-Point Arithmetic

问题:我有没有办法确定哪些(如果有)这些语言在我的具体计算中更准确, 没有 自己手动执行计算?

我在考虑简单地将计算结果放入Wolfram Alpha中,看看两者中哪一个准确地保持更长时间。不幸的是,我正在等待this问题(关于Wolfram Alpha的准确性)的回答。

注意:在发布此问题之后,我仍然会尝试上面提到的Wolfram方式,但有没有更简单,更有效的方法来确定哪两种语言输出更准确的结果?< / em>的

2 个答案:

答案 0 :(得分:3)

从技术上讲,对此进行了初步讨论:精度与精度不同。准确度衡量您的计算与真实价值的接近程度,无论它是多少;精度是衡量许多计算彼此之间的接近程度的指标。如果您根据一组计算结果的概率分布来思考,您会更好地理解。因此,例如,您可能具有较高的精度和较高的精度。你的帖子的标题是关于准确性,但在身体中你提到精确度。 我想你的意思是准确度

那就是说,没有一般的答案。 您可以使用许多方法,实际上无限的算法可以满足您的需求。 你需要:

  • 像GMP这样的图书馆,已经建议
  • 纸和笔来评估算法的准确度

为什么这样?您需要以比您想要比较的两个结果更高的准确度来评估sin(x)。超越函数的算法是系列。因此,您必须估计算法错误 - 在某些情况下仍然是表示错误 - 如何影响您的计算。此时,实现您选择的方法,并评估结果与其他两个方法之间的距离,确保影响结果的总误差小于某个可控常数。

作为一个例子,评估exp(10)可以使用零周围的通常指数泰勒展开,并使用许多项;但是如果对exp(-10)使用相同的方法,则可能会失败,因为其扩展具有交替的符号术语。这意味着您可能会有可能累积的取消效果。你不需要这个,否则你可能是精确的,但有偏见,计算不准确。 通常使用GMP是因为它是为此而设计的。

因此,例如,您可能会发现Scilab最适合计算exp(-10)exp(10)中的C ++,只是因为它们可以使用不同的实现。

总结:使用GMP,寻找准确的算法。例如,如果您需要某些特定傅里叶求和的精确结果,或者必须评估其他超越项的系列,这可能是有效的,或者是唯一的解决方案。 但是,如果您只需要简单的sinexp的答案,那么您应该查找表格,以及表格。

答案 1 :(得分:1)

如果你想要超越数学函数的一致准确性,我建议你自己编写。

有各种方法可以实现sin等功能。一些人使用价值表(例如小型嵌入式系统平台)进行硬件计算。

超越数学函数的实现通常取决于语言实现者。

BTW,一般实施是空间,速度和准确性之间的中间立场。高度准确的版本可能需要大量空间或大量时间。

至少如果你有自己的实现,你可以控制准确性而不是猜测语言实现的准确性。