6

浮動小数点数が与えられた場合、私はString小数に近い有理数の表現を取得しようとしています(与えられた許容範囲内でεは問題ありません)。私の現在のアプローチは次のとおりです。

String rationalize(double d)
{
    String s = Double.toString(d);
    s = s.substring(s.indexOf('.')+1, s.length());
    return s + " / " + ApintMath.pow(new Apint(10), s.length()).toString();
}

慣れていない場合はApintMath.pow、任意の長さの数値でも機能します。これは、小数点以下数千桁の小数を変換しようとしているためです。私のアルゴリズムのパフォーマンスはひどいです。

私はこれを2つのことに起因しますが、それ以上の可能性があります。

  1. 分数を取得するための私のアプローチはかなり素朴です。もっと良い方法があると確信しています。
  2. 分数は単純化されていないため、この分数を使用した後続の計算では、多くの時間が無駄になる可能性があります。

これをどのように行いますか?私が話していない他の分野で私を遅くしているものはありますか?

4

1 に答える 1

3

ここに示されているスターンブロコットツリーの実装がありますが、どちらが優れているかを確認するためにプロファイルを作成する必要があります。

補遺:org.jscience.mathematics.number.Rational線形システムで使用すると良い結果が得られました。org.apache.commons.math.fraction.BigFractionそのためのいくつかのコンストラクターdoubleが役立つ場合があります。すべてが未定義の値に対して適切な例外をスローします。

于 2012-04-02T17:09:29.137 に答える