不使用Java数学类的数学运算
我一直在用Java制作我自己的类库,我遇到了一个小麻烦。图书馆以数学为中心。我开始的目的是不使用Java数学类。不幸的是,我缺乏技能,再加上无法在网上找到解决这个问题的资源,这导致我又回到了Java数学课上有没有一种不用Math.log计算对数的方法?你应该使用Math.log 试试这个,用简单的数学来计算不使用Java数学类的数学运算,java,math,Java,Math,我一直在用Java制作我自己的类库,我遇到了一个小麻烦。图书馆以数学为中心。我开始的目的是不使用Java数学类。不幸的是,我缺乏技能,再加上无法在网上找到解决这个问题的资源,这导致我又回到了Java数学课上有没有一种不用Math.log计算对数的方法?你应该使用Math.log 试试这个,用简单的数学来计算 public static int toLog2N(int num){ return num>1 ? 1 + toLog2N(num/2) : 0; } 这只是一个例子,您应该使用M
public static int toLog2N(int num){
return num>1 ? 1 + toLog2N(num/2) : 0;
}
这只是一个例子,您应该使用Math类,因为它提供了不同的方法,如log(double a)、log10(double a)、log1p(double a)。它将使您的代码更可读、更容易理解
希望有帮助 我们可以尝试使用下列幂级数: 例如:
@Test
public void printMathCalculation() {
double libValue = Math.log(100);
double myValue = getLn(100);
System.out.println("Actual: \t" + libValue);
System.out.println("Approximate: \t" + myValue);
}
//Take double to an integer power
private double pow(double num, int power) {
double result = 1;
for(int i = 0; i < power; i++) {
result *= num;
}
return result;
}
//Get natural log
private double getLn(double num) {
int accuracy = 1000;
double sum = 0;
for(int n = 0; n < accuracy; n++) {
double num1 = (1.0/(2*n+1));
double num2 = (num-1)/(num+1);
sum += num1*pow(num2,2*n+1);
}
return 2 * sum;
}
有或没有?为什么不想使用
Math
?嗯,您可以随时复制Math.log的源代码,并将其复制到totalynotmath.log类/方法中。问题当然是这样做的意义何在。你为什么要这样做?软件开发第一课:不要再发明轮子。@JohnathanDavidow阅读/调试数学源代码是一个很好的学习方法,如果这是目的的话。它确实有帮助。非常感谢。奥普说他不想用数学。在您的代码中,有一个变量n
不知从何而来。您的代码返回int
,这意味着例如toLog2N(4)=toLog2N(5)=toLog2N(6)=toLog2N(7)
,这是falseMath.log(x)
是log base e,而不是log base 2是的,他应该只使用Math.log
,但他显然是那种永不满足的好奇类型,除非他学会了“怎么做”并且自己动手……@KevinAnderson Yep。这就是我。Math
/StrictMath
是唯一不使用JNI/JNA/JNR/JNHW来利用浮点协处理器指令进行数学运算的方法。否则,你必须做手工泰勒级数或其他近似,这是缓慢的。这就是为什么您的袖珍计算器在sqrt/log/sin/时比原始操作慢得多。
Actual: 4.605170185988092
Approximate: 4.605170185988078