既存のテスト済みの安定したコードライブラリを使用するという精神で、Apache-Commons-MathライブラリとそのBigFraction
クラスを使用して、RationalCalcと呼ばれるAndroidアプリの合理的な計算を実行し始めました。
それは、1つの厄介な問題を除いて、私がそれに投げかけたすべてのタスクに最適です。特定のBigFraction
値を除算すると、間違った結果が得られます。
除数の逆数を使用してを作成し、BigFraction
代わりに乗算すると、同じ間違った答えが得られますが、おそらくそれがライブラリが内部で行っていることです。
誰かが私が間違っていることを知っていますか?
除算BigFraction
は2.5のaで正しく機能しますが、2.51、2.49などでは機能しません。
[アップデート]
これは確かにapache-commons-math2.0ライブラリのバグでした。バグはv.2.1で修正されています。
これで、バグトラッカーの[修正された問題]セクションに一覧表示されます。
2つのBigFractionオブジェクトに、java-primitive intに収まるよりも大きい分子を掛けると、BigFraction.ZEROの結果が誤って返されます。。
問題の再現を試み、正しい軌道に乗せてくれた@BartKに感謝します。
[/アップデート]
// *** incorrect! ***
BigFraction one = new BigFraction(1.524);
//one: 1715871458028159 / 1125899906842624
BigFraction two = new BigFraction(2.51);
//two: 1413004383087493 / 562949953421312
BigFraction three = one.divide(two);
//three: 0
Log.i("solve", three.toString());
//should be 0.607171315 ??
//returns 0
// *** correct! ****
BigFraction four = new BigFraction(1.524);
//four: 1715871458028159 / 1125899906842624
BigFraction five = new BigFraction(2.5);
//five: 5 / 2
BigFraction six = four.divide(five);
//six: 1715871458028159 / 2814749767106560
Log.i("solve", six.toString());
//should be 0.6096 ??
//returns 0.6096