计算对数

时间:2011-04-14 20:18:55

标签: java math logarithm

我正在尝试编写一个方法,它将基本 k 和值 n 输入到2个小数位,然后计算n的日志基数k而不使用任何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;
}

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

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

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

5 个答案:

答案 0 :(得分:5)

您已经过了一次i金额。因此,您很快就会达到大于实际值的值,并且永远不会再次输入while循环。

从值中减去i一次,你就可以了:

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

答案 1 :(得分: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。但是代码中的任何一点都没有办法在另一个方向上纠正。您需要检查过冲和下冲情况。

答案 2 :(得分:1)

此循环

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

太过分了。它仅在超过正确值后停止。因此,当计算一个地方时,1是不够的,所以它变为2.0,并且所有后续测试表明它至少足够,所以它就是它结束的地方。

答案 3 :(得分:1)

手工计算日志,有趣!我建议在纸上完成,然后使用监视变量逐步执行代码或在每一步输出每个变量。然后检查此方法,看看它是否与你正在做的事情对齐:http://mathforum.org/library/drmath/view/55566.html

答案 4 :(得分:0)

你总是可以看:

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

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

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