Math.sin()
,Math.cos()
等功能有多广泛?
如果连续多次调用具有相同参数的方法,编译器是否会优化代码?如果没有,那么在这些方法的调用中你应该开始在变量中缓存结果吗?
答案 0 :(得分:1)
三角函数通常实现为泰勒展开。他们很快。你可以自己编写并进行比较。
public class Main{
private static double factorial(double n) {
if (n <= 1) // base case
return 1;
else
return n * factorial(n - 1);
}
private static double sin(int n) {
int PRECISION = 10;
double rad = n*1./180.*Math.PI;
double sum = rad;
for (int i = 1; i <= PRECISION; i++) {
if (i % 2 == 0)
sum += Math.pow(rad, 2*i+1) / factorial(2 * i + 1);
else
sum -= Math.pow(rad, 2*i+1) / factorial(2 * i + 1);
}
return sum;
}
public static void main(String []args){
System.out.println(sin(180));
System.out.println(Math.sin(Math.PI));
System.out.println(sin(90));
System.out.println(Math.sin(Math.PI/2));
System.out.println(sin(200));
System.out.println(Math.sin(200*2*Math.PI/360));
}
}
当然,您可以缓存值,但这些方法可能已经过优化。
答案 1 :(得分:1)
与所有性能问题一样,您应该编写基准测试并自行查找,因为答案取决于您的JVM,操作系统和硬件。可以肯定地说,Math.sin / cos在现代PC和服务器硬件上需要几百纳秒 - 而不是从主内存加载一些东西 - 所以最好的方法就是尽可能地缓存。但总是在做出改变之前和之后进行衡量。