8

我想知道计算器如何精确地工作。例如,当以精度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;
}

现在我当然想在用户输入 sin(π) 时打印零。我可以轻松地在 1e-15 上的某个地方四舍五入,以使这个特定案例工作,但这是一个 hack,而不是解决方案。当我开始像这样四舍五入并且用户输入类似 1e-20 的内容时,他们得到一个零(因为四舍五入)。当用户输入 1/10 并=反复敲击键时,也会发生同样的事情——当他达到舍入阈值时,他得到零。

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

4

4 回答 4

6

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

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

printf (%12.4d, number);
于 2010-04-26T13:20:40.463 回答
4

可以在此计算器精度页面上找到一些答案。

解决方案包括:

  • 在 BCD 中工作
  • 使用查找表
  • 使用隐藏数字,使显示的数字准确
于 2010-04-26T13:23:08.167 回答
3

如前所述,诀窍可能是计算器将使用任意精度的数学库或查找表

我还要补充一点,由于使用浮点算术,您的代码片段以这种方式工作,您可能知道这不是真正的数学,因为它不精确 - 1.0 + 0.1 != 1.1(实际上是 1.1000000000000001):)

于 2010-04-26T13:45:41.143 回答
2

他们可能正在使用查找表来加速他们的三角公式。在那种情况下,效果很好的特殊数字可能就在表中。

于 2010-04-26T13:17:33.503 回答