计算对数

3

我正在尝试编写一个方法,该方法接受一个基数k和一个保留2位小数的值n,然后计算以k为底n的对数,但不使用Java的任何Math.log方法。这是我的进展:

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;
}

问题出现在我尝试计算以4为底5.0625的对数时,结果返回2.0,但实际上应该是1.5。
我不知道为什么会出现这种情况。非常感谢您能提供帮助。
这不是作业,只是我为了乐趣而尝试解决的问题集的一部分。

如果您不允许使用Math.log,那么您如何允许使用Math.pow? - Paŭlo Ebermann
@Paulo 这是不同的方法。我说你不能使用 log,但我没有提到 pow。 - Jon Egeland
5个回答

5
您正在多次添加金额i。因此,您很快就会达到比实际价值更高的价值,而while循环将永远不会再次进入。
从该值中减去一次i,您就可以解决问题:
for(double i = 1; i > .001; i /= 10) {
    while(!(Math.pow(k, value) > n )) {
        value += i;
    }
    value -= i;
}

如果你总是在之后减去 i,那么你应该将 >= 更改为 > - DHall
非常感谢。我不知道为什么我没有尝试过那个方法,但它有效!我也意识到4 ^ 1.5是8,而不是5.0625。再次感谢。 - Jon Egeland

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。但是在代码中没有办法使其回到另一个方向。你需要检查过度和欠妥的情况。


1

此循环

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

这个程序走得太远了。它只会在正确的值被超越后才停止。所以当计算个位数时,1是不够的,所以它会到2.0,所有后续的测试都表明它至少是足够的,所以程序就在那里结束了。


1
手算对数,是不是很有趣呢!我建议你在纸上进行计算,然后使用监视变量或者在每个步骤输出每个变量的方式逐步检查代码。接着,看看这种方法是否与你的方法一致:链接

0

你可以随时查看:

https://dev59.com/3XRB5IYBdhLWcg3wCjjO#2073928

它提供了一种算法,可以计算任何基数下的任何数字的对数。这是对使用BigDecimal类型计算日志的问题的回答,但很容易适应任何浮点类型。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接