1

問題が自然対数スケールを持つプログラムに取り組んでいます。

unsigned int log2(uint64_t)これまでのところ、ベース 2 を使用しており、 (C/C++ で)の優れた実装がここにあります

しかし、底 2 は私の問題には大きすぎることがわかりました。分数の底、たとえば 3/2 を使用する必要があります。

この種の操作の実装を知っている人はいますか?

私の現在の解決策はround(log(x)/log(base))、ラウンドが整数を返す場所ですが、少なくとも、ログの 2 つの評価を避けるためにホップしていました。

4

1 に答える 1

2

log(base)は定数なので、一度評価してその逆数を取ります (コストのかかる除算ではなく乗算に変換します)。

const float k = 1.0f / log(base); // init constant once

y = round(log(x) * k); // each evaluation only requires one log,
                       // one multiply and one round
于 2013-04-05T13:08:58.280 に答える