情况:我用两种不同的语言(C ++和Scilab)运行相同的计算。当使用像sin()和exp()这样的超越函数时,结果会略有不同。我假设这个小差异是由于以下原因:
由于桌面制造商的困境,IEEE标准不要求超越功能完全舍入。
来源:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
问题:我有没有办法确定哪些(如果有)这些语言在我的具体计算中更准确, 没有 自己手动执行计算?
我在考虑简单地将计算结果放入Wolfram Alpha中,看看两者中哪一个准确地保持更长时间。不幸的是,我正在等待this问题(关于Wolfram Alpha的准确性)的回答。
注意:在发布此问题之后,我仍然会尝试上面提到的Wolfram方式,但有没有更简单,更有效的方法来确定哪两种语言输出更准确的结果?< / em>的
答案 0 :(得分:3)
从技术上讲,对此进行了初步讨论:精度与精度不同。准确度衡量您的计算与真实价值的接近程度,无论它是多少;精度是衡量许多计算彼此之间的接近程度的指标。如果您根据一组计算结果的概率分布来思考,您会更好地理解。因此,例如,您可能具有较高的精度和较高的精度。你的帖子的标题是关于准确性,但在身体中你提到精确度。 我想你的意思是准确度。
那就是说,没有一般的答案。 您可以使用许多方法,实际上无限的算法可以满足您的需求。 你需要:
为什么这样?您需要以比您想要比较的两个结果更高的准确度来评估sin(x)
。超越函数的算法是系列。因此,您必须估计算法错误 - 在某些情况下仍然是表示错误 - 如何影响您的计算。此时,实现您选择的方法,并评估结果与其他两个方法之间的距离,确保影响结果的总误差小于某个可控常数。
作为一个例子,评估exp(10)
可以使用零周围的通常指数泰勒展开,并使用许多项;但是如果对exp(-10)
使用相同的方法,则可能会失败,因为其扩展具有交替的符号术语。这意味着您可能会有可能累积的取消效果。你不需要这个,否则你可能是精确的,但有偏见,计算不准确。
通常使用GMP是因为它是为此而设计的。
因此,例如,您可能会发现Scilab最适合计算exp(-10)
和exp(10)
中的C ++,只是因为它们可以使用不同的实现。
总结:使用GMP,寻找准确的算法。例如,如果您需要某些特定傅里叶求和的精确结果,或者必须评估其他超越项的系列,这可能是有效的,或者是唯一的解决方案。
但是,如果您只需要简单的sin
和exp
的答案,那么您应该查找表格,以及表格。
答案 1 :(得分:1)
如果你想要超越数学函数的一致准确性,我建议你自己编写。
有各种方法可以实现sin
等功能。一些人使用价值表(例如小型嵌入式系统平台)进行硬件计算。
超越数学函数的实现通常取决于语言实现者。
BTW,一般实施是空间,速度和准确性之间的中间立场。高度准确的版本可能需要大量空间或大量时间。至少如果你有自己的实现,你可以控制准确性而不是猜测语言实现的准确性。