微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算对数

如何解决计算对数

| 我正在尝试编写一种方法,该方法将基数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)时出现问题。 我不知道为什么这不起作用。任何帮助表示赞赏。 不,这不是功课,它是我要解决的一系列问题的一部分。     

解决方法

您一次要加上adding1。这样,您很快就会达到一个比实际值大的值,并且while循环将不再被输入。 从值中减去
i
,就可以了:
for(double i = 1; i > .001; i /= 10) {
    while(!(Math.pow(k,value) > n )) {
        value += i;
    }
    value -= i;
}
    ,在纸上逐步完成代码:
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。但是,在代码中的任何时候,您都没有办法向另一个方向进行修正。您需要检查超调和欠调情况。     ,这个循环
    while(!(Math.pow(k,value) >= n )) {
        value += i;
    }
太过分了。仅在超过正确值后才停止。因此,在计算该位置时,1不够,所以升至2.0,随后的所有测试均表明,该位置至少足够,因此该位置结束。     ,手工计算日志,真有趣!我建议在纸上做,然后逐步使用监视变量遍历代码,或在每个步骤输出每个变量。然后检查该方法,看看它是否与您的工作相符:http://mathforum.org/library/drmath/view/55566.html     ,您可以随时查看: https://stackoverflow.com/a/2073928/251767 它提供了一种算法,可以计算任何基数的任意数量的对数。这是对有关计算具有6个类型的日志的问题的答复,但可以很容易地将其适应于任何浮点类型。 因为它使用平方和除以2,而不是使用多次调用
Math.pow()
,所以它应该收敛很快并且使用较少的CPU资源。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。