Грех (х) может быть представлен как ряд Тейлора :
Грех (х) = (х / 1!) - (х 3 / 3!) + (Х 5 / 5!) - (х 7 / 7!) +…
Так что вы можете написать свой код так:
public static double getSine(double x) {
double result = 0;
for (int i = 0, j = 1, k = 1; i < 100; i++, j = j + 2, k = k * -1) {
result = result + ((Math.pow(x, j) / factorial (j)) * k);
}
return result;
}
Здесь мы запустили наш цикл только 100 раз. Если вы хотите выполнить больше, вам нужно изменить базовое уравнение (в противном случае произойдет значение бесконечности).
Я узнал очень хороший трюк из книги Р.Г.Дромея «Как решить ее с помощью компьютера». Он объясняет это так:
(x 3 / 3!) = (X X x X x) / (3 X 2 X 1) = (x 2 / (3 X 2)) X (x 1 / 1!) i = 3
(x 5 / 5!) = (x X x X x X x X x) / (5 X 4 X 3 X 2 X 1) = (x 2 / (5 X 4)) X (x 3 / 3!) I = 5
(х 7 / 7!) = (х х х х х х х х х х х х х) / (7 Х 6 Х 5 Х 4 Х 3 Х 2 Х 1) = (х 2 / (7 X 6)) X (x 5 / 5!) I = 7
Таким образом, термины (х 2 / (3 х 2)), (х 2 / (5 х 4)), (х 2 / (7 X 6)) можно выразить как
x 2 / (i X (i - 1)) для i = 3,5,7,…
Поэтому для генерации последовательных членов ряда синусов мы можем написать:
ток i th term = (x 2 / (i X (i - 1))) X (предыдущий термин)
Код следующий:
public static double getSine(double x) {
double result = 0;
double term = x;
result = x;
for (int i = 3, j = -1; i < 100000000; i = i + 2, j = j * -1) {
term = x * x * term / (i * (i - 1));
result = result + term * j;
}
return result;
}
Обратите внимание, что переменная j
используется для чередования знака термина.