Создание собственной функции Sin() в Java
-
04-07-2019 - |
Вопрос
Мне нужно создать функцию sin с нуля на уроке Comp Sci, и я приближаюсь к решению.Однако у меня все еще есть несколько проблем.Если я введу значение .5PI или меньше, это сработает, но в противном случае я получу неправильный результат.Вот код, который у меня есть на данный момент:
double i=1;
double sinSoFar = 0;
int term = 1;
while(i >= .000001)
{
i = pow(-1, term + 1) * pow(sinOf, 2*term-1) / factorial(2*term-1);
sinSoFar=sinSoFar + i;
term++;
}
Решение
Как указал Федерико, проблема, вероятно, заключается в вашем факториале () или pow (). Я запустил тест, который работал нормально, заменив ваши функции функцией pow (), предоставленной в классе Math, и этим factorial ():
public static long factorial(long n) {
if (n < 0) throw new RuntimeException("Underflow error in factorial");
else if (n > 20) throw new RuntimeException("Overflow error in factorial");
else if (n == 0) return 1;
else return n * factorial(n-1);
}
Другие советы
Некоторые советы:
- Начните с термина = 0.Каноническое расширение Маклорена также делает
- вычислить степени и факториал пока ты ездишь на велосипеде (то есть обновляя их на каждом этапе).Возможно, проблема заключается в pow() или факториале().
РЕДАКТИРОВАТЬ.Предположение:вычислив k-й член, вы можете вычислить (k+1)-й следующим образом:
- Умножение на (-1)
- Умножение на sinOf^2
- Деление на (2k+2)(2k+3)
Таким образом, вы можете полностью избегать вычисление степеней и факториалов.
Что касается значений за пределами 0 - 1 / 2PI, все они могут быть вычислены из значений внутри диапазона.
// First, normalize argument angle (ang) to -PI to PI,
// by adding/subtracting 2*PI until it's within range
if ( ang > 1/2PI ) {
sin = sin ( PI - ang );
}
else if ( ang < 0 ) {
sin = -1 * sin( -1 * ang );
}
else {
// your original code
}