6
可能な限り高い精度を維持しながら、2つのC#BigIntegerの商を変換する最適な方法は何ですか?私の現在の解決策は:2つのBigIntegerの商を二重にする
Math.Exp(BigInteger.Log(dividend) - BigInteger.Log(divisor));
私はこれが最適ではないと推測しています。
可能な限り高い精度を維持しながら、2つのC#BigIntegerの商を変換する最適な方法は何ですか?私の現在の解決策は:2つのBigIntegerの商を二重にする
Math.Exp(BigInteger.Log(dividend) - BigInteger.Log(divisor));
私はこれが最適ではないと推測しています。
最初に読み取ったthis article。それはあなたがしたいことを含んでいます。
次に、被除数/除数の継続的な小数点の拡張を行い、必要な精度に達すると停止します。あなたは完全な高価な除算演算を必要としません(私はそれがO(n log^2 n)かそうであると思います)、整数除算/剰余しか必要としません。
しかし、BigInteger.Logは倍精度を返すため、exp(log a/log b)はうまくいくでしょうし、継続的な小数点の拡張よりも速いかもしれないと思います。 2倍にするには2回の変換が必要です(高速である可能性があります)。また、ログの除数とログ配分が非常に近い場合でも、精度は維持されます。
そうは思わない!あなたが最後に倍をしたい場合は、それが最善の方法だと思う。任意の精度の浮動小数点数が必要な場合は、私の答えをお読みください。これはBigInteger.Logがdoubleを生成するように提供されています。 –
おそらくF#bignum型を使うことができます。彼らは直接部門をサポートします。 – Jules