本篇文章为大家展示了java 中怎么实现对数和指数计算,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
public static void main(String[] args) throws InterruptedException{ int a = 10; int b = 1000000; System.out.println(getlog(b,a)); } static double getlog(int b,int a){ return Math.log(b)/Math.log(a); }
Math提供了一个自然底数的方法,Math.log(),自定义方法,但是运行结果精度会丢失。
运行结果为5.99999
public static void main(String[] args) throws InterruptedException{ BigDecimal a = new BigDecimal(10); BigDecimal b = new BigDecimal(1000000); System.out.println(getlog(b,a)); // } static double getlog(BigDecimal b, BigDecimal a){ return Math.log(b.doubleValue())/Math.log(a.doubleValue()); }
结果为6.0
精度出问题就找BigDecimal 就可以了。
指数的话,直接使用Math.pow(a,b)就可以了。
Java给我提供的数学计算的工具类Math计算对数的函数有两个:
/** * Returns the natural logarithm (base <i>e</i>) of a {@code double} * value. Special cases: * <ul><li>If the argument is NaN or less than zero, then the result * is NaN. * <li>If the argument is positive infinity, then the result is * positive infinity. * <li>If the argument is positive zero or negative zero, then the * result is negative infinity.</ul> * * <p>The computed result must be within 1 ulp of the exact result. * Results must be semi-monotonic. * * @param a a value * @return the value ln {@code a}, the natural logarithm of * {@code a}. */ public static double log(double a) { return StrictMath.log(a); // default impl. delegates to StrictMath } /** * Returns the base 10 logarithm of a {@code double} value. * Special cases: * * <ul><li>If the argument is NaN or less than zero, then the result * is NaN. * <li>If the argument is positive infinity, then the result is * positive infinity. * <li>If the argument is positive zero or negative zero, then the * result is negative infinity. * <li> If the argument is equal to 10<sup><i>n</i></sup> for * integer <i>n</i>, then the result is <i>n</i>. * </ul> * * <p>The computed result must be within 1 ulp of the exact result. * Results must be semi-monotonic. * * @param a a value * @return the base 10 logarithm of {@code a}. * @since 1.5 */ public static double log10(double a) { return StrictMath.log10(a); // default impl. delegates to StrictMath }
log(double a),log10(double a)从源码doc注释我们可以看到分别是计算自然对数和以10为底的对数。
double x = Math.log(10);
等价于:x = ln10 或 x = loge(10),即以e为底的自然对数。
问题来了,如果我们要计算非常规底数的对数怎么办呢?比如我们要计算以33为底27的对数(也就是33的多少次方运算结果为27)?
这个就需要使用数学的换底公式:logx(y)=ln(y)/ln(x);
代码实现以x为底y的对数计算工具类:
public class Logarithm { public static double log(double value, double base) { return Math.log(value) / Math.log(base); } }
这样我们计算以33为底27的对数:
public static void main(String[] args) { double log = log(27, 33); System.out.println(log); } private static double log(double value, double base) { return Logarithm.log(value) / Math.log(base); }
计算结果:0.9426082478202944
本demo使用log以及换底公式,也可以使用log10和换底公式计算,结果是一样的。
如:
public static double log(double value, double base) { return Math.log10(value) / Math.log10(base); }
普通底对数计算的关键点在于使用换底公式转换为工具类提供的特殊对数进行计算即可。
上述内容就是java 中怎么实现对数和指数计算,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。