Java 基于Maclaurin展开的Sin近似
我正在尝试编写自己的代码来计算rad角的近似值。到目前为止,我只对一个特定的数字范围进行了研究,但对于像500左右这样的大数字,我的研究是失败的。 附加子问题:哪个更有效-通过Math.pow()计算幂,还是当前的方法-仅使用乘法运算符Java 基于Maclaurin展开的Sin近似,java,performance,taylor-series,Java,Performance,Taylor Series,我正在尝试编写自己的代码来计算rad角的近似值。到目前为止,我只对一个特定的数字范围进行了研究,但对于像500左右这样的大数字,我的研究是失败的。 附加子问题:哪个更有效-通过Math.pow()计算幂,还是当前的方法-仅使用乘法运算符 private static double sin_range(double rad) { double sin_rad = rad; while (sin_rad > 2 * Math.PI) { sin_rad -=
private static double sin_range(double rad) {
double sin_rad = rad;
while (sin_rad > 2 * Math.PI) {
sin_rad -= 2 * Math.PI;
}
return sin_rad;
}
private static double approx(double rad, int err) {
double rad_in_range = sin_range(rad);
double sin = rad_in_range, r = rad_in_range;
int previous = 1, factorial = 1;
for (int i = 0; i < err; i++) {
factorial = (factorial * (previous + 1) * (previous + 2));
r *= rad * rad;
if ((i & 1) == 0) { //even
sin -= r / factorial;
} else { //odd
sin += r / factorial;
}
previous += 2;
}
return sin;
}
public static void main(String[] args) {
double approximated = approx(15, 5);
System.out.println(approximated + " = " + Math.sin(15));
}
专用静态双正弦范围(双rad){
双正弦弧度=弧度;
而(sin_rad>2*Math.PI){
sin_rad-=2*Math.PI;
}
返回sin_rad;
}
专用静态双精度近似值(双精度,整数误差){
双rad_in_范围=sin_范围(rad);
双正弦=半径在半径范围内,r=半径在半径范围内;
int-previous=1,阶乘=1;
for(int i=0;i
您是否尝试过使用BigDecimal
,因为它们可以更好地处理十进制值。对于第二个问题,最好使用Math.pow()
,本机方法总是经过优化(和更新)。我认为您的系列术语不正确。500! 确实是一个很大的数字。我想说,您应该限制术语的数量,以匹配IEEE双精度浮点数的精度。这些仅允许18位有效数字。正弦级数二次收敛。为什么要求500个条件?@duffymo我的意思是大约(500,5),而不是大约(5500)。我认为这个方法的问题只是纯粹的数学问题,sin图看起来像什么,问题是糟糕的编码。以下是正弦图的外观: