2011-04-14 57 views
3

我想写发生在基地ķ和值ň到小数点后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。

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

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

+0

如果您不允许使用Math.log,您如何允许使用Math.pow? – 2011-04-15 00:57:37

+0

@Paulo他们是不同的方法。我说你不能使用日志,我没有说关于战俘的任何事情。 – Jon 2011-04-22 20:27:18

回答

5

您正在添加金额i一次。因此,您很快会达到比实际值更大的值,并且while循环将永远不会再次输入。从价值

减去i一次,你会被罚款:

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

如果你之后总是要减去'i',你应该改变'> ='为'>' – DHall 2011-04-14 20:28:05

+0

@DHall你是对的。调整后的答案。 – Howard 2011-04-14 20:28:36

+0

非常感谢。我不知道为什么我没有尝试,但它的工作原理!我也意识到4^1.5是8,而不是5.0625。再次感谢。 – Jon 2011-04-14 21:36:24

1

这个循环

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

走得太远。只有在正确的数值超过后才会停止。所以在计算这些地方时,1是不够的,所以它到2.0,所有后续测试表明它至少足够了,所以这就是它的结束。

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。但是代码中的任何一点都没有办法在另一个方向上进行修正。您需要检查过冲和下冲情况。

0

你总是可以看到:

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

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

由于它使用平方和二分之一,而不是使用多个调用Math.pow(),它应该很快收敛并使用较少的CPU资源。