2011-01-13 5 views
6

可能な限り高い精度を維持しながら、2つのC#BigIntegerの商を変換する最適な方法は何ですか?私の現在の解決策は:2つのBigIntegerの商を二重にする

Math.Exp(BigInteger.Log(dividend) - BigInteger.Log(divisor)); 

私はこれが最適ではないと推測しています。

+0

そうは思わない!あなたが最後に倍をしたい場合は、それが最善の方法だと思う。任意の精度の浮動小数点数が必要な場合は、私の答えをお読みください。これはBigInteger.Logがdoubleを生成するように提供されています。 –

+0

おそらくF#bignum型を使うことができます。彼らは直接部門をサポートします。 – Jules

答えて

3

最初に読み取ったthis article。それはあなたがしたいことを含んでいます。

次に、被除数/除数の継続的な小数点の拡張を行い、必要な精度に達すると停止します。あなたは完全な高価な除算演算を必要としません(私はそれがO(n log^2 n)かそうであると思います)、整数除算/剰余しか必要としません。

しかし、BigInteger.Logは倍精度を返すため、exp(log a/log b)はうまくいくでしょうし、継続的な小数点の拡張よりも速いかもしれないと思います。 2倍にするには2回の変換が必要です(高速である可能性があります)。また、ログの除数とログ配分が非常に近い場合でも、精度は維持されます。

関連する問題