forked from levelp/java_01
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCalc.java
71 lines (63 loc) · 2.27 KB
/
Calc.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import static java.lang.Math.pow;
/**
* Вычисления
*/
public class Calc {
/**
* Точность вычислений
*/
public static final double EPS = 1e-10;
public static double fact(int num) {
double res = (num == 0) ? 1 : num * fact(num - 1);
if (Double.isNaN(res) || Double.isInfinite(res))
throw new ArithmeticException("Переполнение: " + num);
return res;
}
/**
* Вычисление арксинуса через разложение в ряд
*
* @param x аргумент
* @param kol количество членов ряда
* @return результат - значение арксинуса
*/
public static double riad(double x, int kol) {
double fan = 0;
double arg1;
double arg2;
double arg3;
for (int n = 0; n <= kol; n++) {
arg1 = fact(2 * n);
arg2 = pow(4, n) * pow(fact(n), 2) * (2 * n + 1);
arg3 = pow(x, 2 * n + 1);
fan += (arg1 / arg2) * arg3;
}
return fan;
}
/**
* Вычисление арксинуса через разложение в ряд
* Оптимизированная по точности версия
*
* @param x аргумент
* @return результат - значение арксинуса
*/
public static double arcSin(double x) {
double t = x; // Очередной член ряда (основная часть)
double add = t; // Член ряда целиком
double sum = add; // Результат (сумма ряда)
// Если слишком маленькие изменения => выходим
for (long n = 1; add >= EPS; n++) {
double arg1 = (2 * n - 1) * (2 * n); // Факториал
double arg2 = 4.0 * pow(n, 2);
double arg3 = pow(x, 2);
// Получаем новый член ряда из предыдущего
t *= (arg1 * arg3) / arg2;
// Добавляем к ряду
add = t / (2 * n + 1);
sum += add;
}
return sum;
}
public static double riad(double x) {
return riad(x, 80);
}
}