代码之家  ›  专栏  ›  技术社区  ›  zoul

计算器如何精确工作?

  •  6
  • zoul  · 技术社区  · 16 年前

    我想知道计算器是如何精确工作的。例如,值 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上的某个地方进行搜索,以使这个特定的案例能够工作,但这是一个黑客攻击,而不是解决方案。当我开始这样四舍五入时,用户输入类似于“1”的“20”,他们会得到一个零(因为四舍五入)。当用户输入1/10并点击 = 当他达到四舍五入的临界值时,他会得到零。

    然而,有些计算器为sin(_)返回纯零,同时它们可以轻松地使用(1e__20)/10等表达式。技巧在哪里?

    4 回复  |  直到 12 年前
        1
  •  5
  •   Michaelangel007 Edric    14 年前

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

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

    printf (%12.4d, number);
    
        2
  •  3
  •   mouviciel    12 年前

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

    解决方案包括:

    • 在BCD中工作
    • 使用查阅表格
    • 使用隐藏数字,以便显示的数字准确
        3
  •  2
  •   tloach    16 年前

    他们可能正在使用一个查找表来加速他们的三角函数公式。在这种情况下,计算得很好的特殊数字可能就在表中。

        4
  •  2
  •   Luke404    16 年前

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

    我还想补充一点,由于使用 floating point 你可能知道,算术不是 数学在某种意义上是不精确的- 1.0 + 0.1 != 1.1 (实际上是1.1000000000000001):)