计算器如何精确工作?

时间:2010-04-26 13:12:48

标签: floating-point precision calculator

我想知道计算器如何精确地工作。例如,sin(M_PI)double精度计算时,#include <math.h> #include <stdio.h> int main() { double x = sin(M_PI); printf("%.20f\n", x); // 0.00000000000000012246 return 0; } 的值不完全为零:

{{1}}

现在我肯定想在用户输入sin(π)时打印零。我可以轻松地在1e-15的某个地方绕过来使这个特殊情况起作用,但这是一个黑客,而不是解决方案。当我开始像这样循环并且用户输入类似1e-20的东西时,他们得到零回归(因为四舍五入)。当用户输入1/10并重复点击 = 键时会发生同样的事情 - 当他达到舍入阈值时,他会变为零。

然而有些计算器会为sin(π)返回纯零,同时它们可以舒适地处理诸如(1e-20)/ 10之类的表达式。诀窍在哪里?

4 个答案:

答案 0 :(得分:6)

桌面计算器使用任意精度数学库。这些可以配置为具有更高的精度,加倍。手持式计算器(传统专用和移动电话)使用固定精度数学库。

如果要准确打印零,请使用宽度说明符

printf (%12.4d, number);

答案 1 :(得分:3)

可在此Calculator Precision页面上找到一些答案。

解决方案包括:

  • 在BCD工作
  • 使用查找表
  • 使用隐藏数字,以便显示的数字准确

答案 2 :(得分:2)

他们可能正在使用查找表来加速他们的trig公式。在这种情况下,很好地处理的特殊数字可能就在表格中。

答案 3 :(得分:2)

如前所述,诀窍可能是计算器将使用arbitrary precision数学库或lookup tables

我还要补充说,由于使用了floating point算术,你的代码片段就是这样的,你可能知道它不是 true 数学,因为它不精确 - {{ 1}}(实际上是1.1000000000000001):)