@@ -12,11 +12,17 @@ TMath::DOUBLE TMath::sin(DOUBLE x)
1212}
1313TMath::DOUBLE TMath::asin (DOUBLE x)
1414{
15- x = mod (x + 1 , 2 ) - 1 ;
1615 DOUBLE r = 0 ;
17- for (LONG n = 0 ; n <= 8L ; n++)
16+ DOUBLE delta = 1 ;
17+ for (LONG n = 1 ; delta > 1e-6 ; n++)
1818 {
19- r += fac (2 * n) / (pow (DOUBLE (2 ), 2 * n) * pow (fac (n), 2 ) * (2 * n + 1 )) * pow (x, 2 * n + 1 );
19+ LONG odd = 2 * n - 1 ;
20+ DOUBLE oddf = oddfacd (odd - 2 );
21+ DOUBLE f = facd (odd);
22+ DOUBLE p = pow (x, odd);
23+ DOUBLE d = p / f * oddf * oddf;
24+ delta = abs (d);
25+ r += p / f * oddf * oddf;
2026 }
2127 return r;
2228}
@@ -50,9 +56,13 @@ TMath::DOUBLE TMath::tan(DOUBLE x)
5056TMath::DOUBLE TMath::atan (DOUBLE x)
5157{
5258 DOUBLE r = 0 ;
53- for (LONG n = 0 ; n <= 8 ; n++)
59+ DOUBLE delta = 1 ;
60+ for (LONG n = 0 ; delta > 1e-4 ; n++)
5461 {
55- r += pow (DOUBLE (-1 ), n) * pow (x, 2 * n + 1 ) / (2 * n + 1 );
62+ LONG odd = 2 * n + 1 ;
63+ DOUBLE d = DOUBLE (pow (-1LL , n)) * pow (x, odd) / DOUBLE (odd);
64+ delta = abs (d);
65+ r += d;
5666 }
5767 return r;
5868}
@@ -87,7 +97,7 @@ TMath::DOUBLE TMath::sech(DOUBLE x)
8797 return 1 / cosh (x);
8898}
8999/* ================================ COSECANT ======================================== */
90- TMath::DOUBLE TMath::cosec (DOUBLE x)
100+ TMath::DOUBLE TMath::csc (DOUBLE x)
91101{
92102 return 1 / sin (x);
93103}
@@ -133,7 +143,7 @@ TMath::DOUBLE TMath::exp(DOUBLE x)
133143 DOUBLE r = 0 ;
134144 for (LONG n = 0 ; n <= 15L ; n++)
135145 {
136- r += pow (x, n) / fac (n);
146+ r += pow (x, n) / facd (n);
137147 }
138148 return r;
139149}
@@ -208,6 +218,31 @@ TMath::LONG TMath::fac(LONG n) {
208218 }
209219 return r;
210220}
221+ TMath::DOUBLE TMath::facd (LONG n) {
222+ DOUBLE r = 1 ;
223+ for (LONG i = 2 ; i <= n; i++) {
224+ r *= DOUBLE (i);
225+ }
226+ return r;
227+ }
228+ TMath::LONG TMath::oddfac (LONG n) {
229+ LONG r = 1 ;
230+ for (LONG i = 3 ; i <= n; i += 2 ) {
231+ r *= i;
232+ }
233+ return r;
234+ }
235+ TMath::DOUBLE TMath::oddfacd (LONG n) {
236+ DOUBLE r = 1 ;
237+ for (LONG i = 3 ; i <= n; i += 2 ) {
238+ r *= DOUBLE (i);
239+ }
240+ return r;
241+ }
242+ TMath::DOUBLE TMath::abs (DOUBLE x) {
243+ if (x < 0 ) return -x;
244+ else return x;
245+ }
211246/* ========================================== DEGREE / RADIANT CONVERSION ================================*/
212247TMath::DOUBLE TMath::rad (DOUBLE deg)
213248{
0 commit comments