整数の対数の上に丸められた値n
を整数の基底b
にしたいと思います。コード内:整数の整数の整数への対数
result = int(ceil(log(n, b)))
問題は、値が浮動小数点で正確に表現できず、結果を過大評価することがあります。例:
log(125, 5) == int(ceil(3.0000000000000004)) == 4
これについてはどうすればよいですか?小さなイプシロンを引くことはそれを他の場所で過小評価することになる。 base 2を使用するときのように、浮動小数点計算を完全に一歩進める方法がありますか?
私は対数を見つけるためにループを使うことができましたが、一定の時間内にこれを行うことが可能かどうかは疑問でした。
まあは、繰り返し乗算塩基は、任意の精度の整数のために既に一定時間であり、逆にほとんどすべての操作がです最悪の場合、少なくとも線形時間。私はトリッキーなビットが近似を検証していると思います。おそらく、指数ビット表現からの高速出力関数の逆数は、Nを追い越してから途中で収まる力を引き戻して乗算するまで、Bを再帰的に二乗する有用な二分探索に変わるかもしれない。 – doynax
あなたはどの言語を使用していますか? –
@SimonByrneその例はPythonで書かれていますが、問題は浮動小数点ハードウェアに関連していると考えられます(つまり、言語には依存しません)。 –