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のどこかで簡単に丸めることができますが、それはハックであり、解決策ではありません。私がこのように丸め始め、ユーザーが1e–20のようなものを入力すると、(丸めのために)ゼロが返されます。ユーザーが1/10を入力し、=キーを繰り返し押すと、同じことが起こります。丸めのしきい値に達すると、ゼロになります。

それでも、一部の計算機はsin(π)に対してプレーンゼロを返し、同時に(1e–20)/10などの式を快適に処理できます。トリックはどこにありますか?

4

4 に答える 4

6

デスクトップ電卓は、任意精度の数学ライブラリを使用します。それらは、2倍のはるかに高い精度を持つように構成できます。ハンドヘルド電卓(従来の専用および携帯電話)は、固定精度の数学ライブラリを使用します。

正確にゼロを印刷する場合は、幅指定子を使用します

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

いくつかの答えは、このCalculatorPrecisionページにあります。

ソリューションには次のものがあります。

  • 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 に答える