3

我正在尝试编写一个方法,该方法采用基数k和值n到小数点后 2 位,然后在不使用任何 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;
}

当我尝试计算 5.0625 的日志基数 4 时出现问题,它返回 2.0,但应该返回 1.5。

我不知道为什么这不起作用。任何帮助表示赞赏。

不,这不是家庭作业,它是我试图解决的问题集的一部分。

4

5 回答 5

5

i太频繁地添加金额。因此,您很快就会达到一个大于实际值的值,并且永远不会再次进入 while 循环。

从值中减去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是不够的,所以就到了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类型计算日志的问题的回答,但它可以很容易地适应任何浮点类型。

由于它使用平方和除以二,而不是多次调用Math.pow(),它应该很快收敛并使用更少的 CPU 资源。

于 2012-01-10T17:20:16.590 回答