-4

私は TDD を学んでおり、開始するために Calculator クラスを作成することにしました。最初に基本を行い、今は平方根関数を使用しています。

私はこの方法を使用してルートhttp://www.math.com/school/subject1/lessons/S1U1L9DP.htmlを取得し ています。少数の数値でテストしたところ、常に正確な答えが得られました。は非常に理解しやすいです。

今、私は奇妙な問題を抱えています。なぜなら、いくつかの数字では正しい答えが得られ、いくつかの数字では正しくないからです。

コードをデバッグしたところ、減算を使用すると正しい答えが得られないことがわかりました。

最も正確な結果を得るために小数を使用しています。

私がする時:

18 / 4.25

私は現在取得しています:4.2352941176470588235294117647

あるべきとき: 4.2352941176470588235294117647059(Windows電卓を使用)

道の終わりに、これは私がのルートに最も近いです18

4.2426406871192851464050688705 ^ 2 = 18.000000000000000000000022892

私の質問は:

これよりも正確に取得できますか?

4

2 に答える 2

6

4.235294117647058823529411764729桁です。

decimal28 ~ 29 桁の有効数字を持つように定義されています。より正確な数値を に格納することはできませんdecimal

全体的な計算の精度にとって 30 桁目以降が重要な工学または科学のどの分野で働いていますか?

(また、実際のコードをいくつか示した場合にも役立つ可能性があります。表示した唯一のコードは18 / 4.25、コード内の実際の式にすることはできません。これは、2 番目の数値がdoubleリテラルであるためです。この式の結果をdecimalキャストなしで aに代入しないでください)。


任意の精度が必要な場合、標準の「BigRational」型はありませんが、BigInteger. 必要に応じて、それを使用して型を構築できますBigRational(分子と分母を2つの別々の整数として格納します)。標準型がまだ存在しない理由の 1 つの推測は、たとえばそのような有理数をいつ正規化するかに関する決定が、パフォーマンスまたは等価性の比較に影響を与える可能性があるということです。

于 2012-09-29T15:31:32.423 に答える
3

浮動小数点の計算は正確ではありません。10 進数は 128 ビット長であるため精度が向上しますが、それでも浮動小数点数です。

2 つの浮動小数点数の比較は では行われませんが、次のようになり==ます。

static bool SameDecimal(decimal a, decimal b)
{
    return Math.Abs(a-b) < 1e-10;
}

このメソッドを使用すると、2 つの小数を比較できます (1e-10 は十分に小さい差であると想定しています。日常的に使用する必要があります)。

于 2012-09-29T15:19:02.433 に答える