2

C# で BigDecimal クラスを作成しています。+、-、* 演算子の実装に成功しました。しかし、2 つの BigDecimals の除算を計算する方法がわかりません。これら 3 つの演算子を使用して除算を実装する最も簡単な方法は何ですか? または、それを行うより良い方法はありますか?(開発時間とアルゴリズム速度の両方を考慮)

目標 1:結果を固定精度 (変更可能) の別の BigDecimal にしたい

目標 2:おっしゃるとおり、BigDecimal の目的は固定精度ではありません。では、どうすれば無限の精度を達成できますか?

別の質問:BigRational任意精度演算に Microsoft BCL のクラスを使用してから、このスレッドで Christopher Currens の拡張メソッドを使用する方が (速度と柔軟性に関して) 優れていますか: C# に BigFloat クラスはありますか? 新しいクラスを書く代わりに 10 進表現を取得するには?

4

3 に答える 3

1
  • いくつかのアイデアについては、Java BigDecimal実装に目を向けることができます
  • a/b を計算するには、二分探索アルゴリズムを使用して b * c = a となるような c を見つけることができます (目的の精度に達するまでアルゴリズムを実行する必要があります)。
  • また、このBigFloatクラスを見ることができます。指数形式の興味深い実装があります
  • BigDecimal無限の精度を得るには、2 の有理分数として格納できますBigInteger

有理分数表現の代数:

(x1/x2) + (y1/y2) = (x1*y2+x2*y1)/(x2*y2)    
(x1/x2) - (y1/y2) = (x1*y2-x2*y1)/(x2*y2)    
(x1/x2) * (y1/y2) = (x1*y1)/(x2*y2)
(x1/x2) / (y1/y2) = (x1*y2)/(x2*y1)

double (固定精度) の実装例:

public double Divide(double a, double b, double eps)
{
    double l = 0, r = a;
    while (r - l > eps)
    {
        double m = (l + r) / 2;
        if (m * b < a)
            l = m;
        else
            r = m;
    }
    return (l + r) / 2;
}
于 2013-08-29T14:14:34.653 に答える