3

基数kと小数点以下2桁までの値nを取り、JavaのMath.logメソッドを使用せずにnの対数基数kを計算するメソッドを作成しようとしています。これが私がこれまでに持っているものです:

public static double log(double k, double n) {
    double value = 0.0;

    for(double i = 1; i > .001; i /= 10) {
        while(!(Math.pow(k, value) >= n )) {
            value += i;
        }
    }

    return value;
}

この問題は、2.0を返す5.0625のログベース4を計算しようとすると発生しますが、1.5を返すはずです。

なぜこれが機能しないのかわかりません。どんな助けでも大歓迎です。

いいえ、これは宿題ではありません。楽しみのために解決しようとしている問題セットの一部です。

4

5 に答える 5

5

あなたはiあまりにも頻繁に量を追加しています。したがって、すぐに実際の値よりも大きい値に到達し、whileループに再び入ることはありません。

値から1回引くiと、問題ありません。

for(double i = 1; i > .001; i /= 10) {
    while(!(Math.pow(k, value) > n )) {
        value += i;
    }
    value -= i;
}
于 2011-04-14T20:27:04.647 に答える
4

紙のコードをステップスルーします。

Iteration: i=1 value = 0.0, calculated power = 1
Iteration: i=1 value = 1.0, calculated power = 4
Iteration: i=1 value = 2.0, calculated power = 16

この時点で、値は2.0です。しかし、コードのどの時点でも、他の方向に修正する方法はありません。オーバーシュートとアンダーシュートの両方のケースをチェックする必要があります。

于 2011-04-14T20:27:01.743 に答える
1

このループ

    while(!(Math.pow(k, value) >= n )) {
        value += i;
    }

行き過ぎです。正しい値を超えた後にのみ停止します。したがって、1の位を計算する場合、1では不十分であるため、2.0になります。以降のすべてのテストでは、少なくとも十分であることが示されているため、ここで終了します。

于 2011-04-14T20:26:18.437 に答える
1

手作業でログを計算するのは、なんて楽しいことでしょう。紙の上でそれを実行してから、監視変数を使用してコードをステップ実行するか、各ステップで各変数を出力することをお勧めします。次に、このメソッドをチェックして、実行していることと一致するかどうかを確認します:http: //mathforum.org/library/drmath/view/55566.html

于 2011-04-14T20:27:40.230 に答える
0

あなたはいつも見ることができます:

https://stackoverflow.com/a/2073928/251767

これは、任意の基数の任意の数の対数を計算するアルゴリズムを提供します。これは、型を使用したログの計算に関する質問への回答ですBigDecimalが、任意の浮動小数点型に非常に簡単に適合させることができます。

への複数の呼び出しを使用する代わりに、2乗と2で除算を使用するためMath.pow()、非常に迅速に収束し、使用するCPUリソースが少なくなります。

于 2012-01-10T17:20:16.590 に答える