Skip to content

Commit cb2282c

Browse files
committed
Add additional 'newlib' LibC math files from https://github.com/jiangzhengwenjz/agbcc/libc/math/
1 parent cd0ed12 commit cb2282c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+18188
-0
lines changed

libc/math/e_acos.c

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
2+
/* @(#)e_acos.c 5.1 93/09/24 */
3+
/*
4+
* ====================================================
5+
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6+
*
7+
* Developed at SunPro, a Sun Microsystems, Inc. business.
8+
* Permission to use, copy, modify, and distribute this
9+
* software is freely granted, provided that this notice
10+
* is preserved.
11+
* ====================================================
12+
*/
13+
14+
/* __ieee754_acos(x)
15+
* Method :
16+
* acos(x) = pi/2 - asin(x)
17+
* acos(-x) = pi/2 + asin(x)
18+
* For |x|<=0.5
19+
* acos(x) = pi/2 - (x + x*x^2*R(x^2)) (see asin.c)
20+
* For x>0.5
21+
* acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
22+
* = 2asin(sqrt((1-x)/2))
23+
* = 2s + 2s*z*R(z) ...z=(1-x)/2, s=sqrt(z)
24+
* = 2f + (2c + 2s*z*R(z))
25+
* where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
26+
* for f so that f+c ~ sqrt(z).
27+
* For x<-0.5
28+
* acos(x) = pi - 2asin(sqrt((1-|x|)/2))
29+
* = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
30+
*
31+
* Special cases:
32+
* if x is NaN, return x itself;
33+
* if |x|>1, return NaN with invalid signal.
34+
*
35+
* Function needed: sqrt
36+
*/
37+
38+
#include "fdlibm.h"
39+
40+
#ifndef _DOUBLE_IS_32BITS
41+
42+
#ifdef __STDC__
43+
static const double
44+
#else
45+
static double
46+
#endif
47+
one= 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
48+
pi = 3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
49+
pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
50+
pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
51+
pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
52+
pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
53+
pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
54+
pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
55+
pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
56+
pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
57+
qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
58+
qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
59+
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
60+
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
61+
62+
#ifdef __STDC__
63+
double __ieee754_acos(double x)
64+
#else
65+
double __ieee754_acos(x)
66+
double x;
67+
#endif
68+
{
69+
double z,p,q,r,w,s,c,df;
70+
__int32_t hx,ix;
71+
GET_HIGH_WORD(hx,x);
72+
ix = hx&0x7fffffff;
73+
if(ix>=0x3ff00000) { /* |x| >= 1 */
74+
__uint32_t lx;
75+
GET_LOW_WORD(lx,x);
76+
if(((ix-0x3ff00000)|lx)==0) { /* |x|==1 */
77+
if(hx>0) return 0.0; /* acos(1) = 0 */
78+
else return pi+2.0*pio2_lo; /* acos(-1)= pi */
79+
}
80+
return (x-x)/(x-x); /* acos(|x|>1) is NaN */
81+
}
82+
if(ix<0x3fe00000) { /* |x| < 0.5 */
83+
if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
84+
z = x*x;
85+
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
86+
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
87+
r = p/q;
88+
return pio2_hi - (x - (pio2_lo-x*r));
89+
} else if (hx<0) { /* x < -0.5 */
90+
z = (one+x)*0.5;
91+
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
92+
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
93+
s = __ieee754_sqrt(z);
94+
r = p/q;
95+
w = r*s-pio2_lo;
96+
return pi - 2.0*(s+w);
97+
} else { /* x > 0.5 */
98+
z = (one-x)*0.5;
99+
s = __ieee754_sqrt(z);
100+
df = s;
101+
SET_LOW_WORD(df,0);
102+
c = (z-df*df)/(s+df);
103+
p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
104+
q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
105+
r = p/q;
106+
w = r*s+c;
107+
return 2.0*(df+w);
108+
}
109+
}
110+
111+
#endif /* defined(_DOUBLE_IS_32BITS) */

libc/math/e_acosh.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
2+
/* @(#)e_acosh.c 5.1 93/09/24 */
3+
/*
4+
* ====================================================
5+
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6+
*
7+
* Developed at SunPro, a Sun Microsystems, Inc. business.
8+
* Permission to use, copy, modify, and distribute this
9+
* software is freely granted, provided that this notice
10+
* is preserved.
11+
* ====================================================
12+
*
13+
*/
14+
15+
/* __ieee754_acosh(x)
16+
* Method :
17+
* Based on
18+
* acosh(x) = log [ x + sqrt(x*x-1) ]
19+
* we have
20+
* acosh(x) := log(x)+ln2, if x is large; else
21+
* acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else
22+
* acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.
23+
*
24+
* Special cases:
25+
* acosh(x) is NaN with signal if x<1.
26+
* acosh(NaN) is NaN without signal.
27+
*/
28+
29+
#include "fdlibm.h"
30+
31+
#ifndef _DOUBLE_IS_32BITS
32+
33+
#ifdef __STDC__
34+
static const double
35+
#else
36+
static double
37+
#endif
38+
one = 1.0,
39+
ln2 = 6.93147180559945286227e-01; /* 0x3FE62E42, 0xFEFA39EF */
40+
41+
#ifdef __STDC__
42+
double __ieee754_acosh(double x)
43+
#else
44+
double __ieee754_acosh(x)
45+
double x;
46+
#endif
47+
{
48+
double t;
49+
__int32_t hx;
50+
__uint32_t lx;
51+
EXTRACT_WORDS(hx,lx,x);
52+
if(hx<0x3ff00000) { /* x < 1 */
53+
return (x-x)/(x-x);
54+
} else if(hx >=0x41b00000) { /* x > 2**28 */
55+
if(hx >=0x7ff00000) { /* x is inf of NaN */
56+
return x+x;
57+
} else
58+
return __ieee754_log(x)+ln2; /* acosh(huge)=log(2x) */
59+
} else if(((hx-0x3ff00000)|lx)==0) {
60+
return 0.0; /* acosh(1) = 0 */
61+
} else if (hx > 0x40000000) { /* 2**28 > x > 2 */
62+
t=x*x;
63+
return __ieee754_log(2.0*x-one/(x+__ieee754_sqrt(t-one)));
64+
} else { /* 1<x<2 */
65+
t = x-one;
66+
return log1p(t+__ieee754_sqrt(2.0*t+t*t));
67+
}
68+
}
69+
70+
#endif /* defined(_DOUBLE_IS_32BITS) */

libc/math/e_asin.c

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
2+
/* @(#)e_asin.c 5.1 93/09/24 */
3+
/*
4+
* ====================================================
5+
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
6+
*
7+
* Developed at SunPro, a Sun Microsystems, Inc. business.
8+
* Permission to use, copy, modify, and distribute this
9+
* software is freely granted, provided that this notice
10+
* is preserved.
11+
* ====================================================
12+
*/
13+
14+
/* __ieee754_asin(x)
15+
* Method :
16+
* Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
17+
* we approximate asin(x) on [0,0.5] by
18+
* asin(x) = x + x*x^2*R(x^2)
19+
* where
20+
* R(x^2) is a rational approximation of (asin(x)-x)/x^3
21+
* and its remez error is bounded by
22+
* |(asin(x)-x)/x^3 - R(x^2)| < 2^(-58.75)
23+
*
24+
* For x in [0.5,1]
25+
* asin(x) = pi/2-2*asin(sqrt((1-x)/2))
26+
* Let y = (1-x), z = y/2, s := sqrt(z), and pio2_hi+pio2_lo=pi/2;
27+
* then for x>0.98
28+
* asin(x) = pi/2 - 2*(s+s*z*R(z))
29+
* = pio2_hi - (2*(s+s*z*R(z)) - pio2_lo)
30+
* For x<=0.98, let pio4_hi = pio2_hi/2, then
31+
* f = hi part of s;
32+
* c = sqrt(z) - f = (z-f*f)/(s+f) ...f+c=sqrt(z)
33+
* and
34+
* asin(x) = pi/2 - 2*(s+s*z*R(z))
35+
* = pio4_hi+(pio4-2s)-(2s*z*R(z)-pio2_lo)
36+
* = pio4_hi+(pio4-2f)-(2s*z*R(z)-(pio2_lo+2c))
37+
*
38+
* Special cases:
39+
* if x is NaN, return x itself;
40+
* if |x|>1, return NaN with invalid signal.
41+
*
42+
*/
43+
44+
45+
#include "fdlibm.h"
46+
47+
#ifndef _DOUBLE_IS_32BITS
48+
49+
#ifdef __STDC__
50+
static const double
51+
#else
52+
static double
53+
#endif
54+
one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
55+
huge = 1.000e+300,
56+
pio2_hi = 1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
57+
pio2_lo = 6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
58+
pio4_hi = 7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
59+
/* coefficient for R(x^2) */
60+
pS0 = 1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
61+
pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
62+
pS2 = 2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
63+
pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
64+
pS4 = 7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
65+
pS5 = 3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
66+
qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
67+
qS2 = 2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
68+
qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
69+
qS4 = 7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
70+
71+
#ifdef __STDC__
72+
double __ieee754_asin(double x)
73+
#else
74+
double __ieee754_asin(x)
75+
double x;
76+
#endif
77+
{
78+
double t,w,p,q,c,r,s;
79+
__int32_t hx,ix;
80+
GET_HIGH_WORD(hx,x);
81+
ix = hx&0x7fffffff;
82+
if(ix>= 0x3ff00000) { /* |x|>= 1 */
83+
__uint32_t lx;
84+
GET_LOW_WORD(lx,x);
85+
if(((ix-0x3ff00000)|lx)==0)
86+
/* asin(1)=+-pi/2 with inexact */
87+
return x*pio2_hi+x*pio2_lo;
88+
return (x-x)/(x-x); /* asin(|x|>1) is NaN */
89+
} else if (ix<0x3fe00000) { /* |x|<0.5 */
90+
if(ix<0x3e400000) { /* if |x| < 2**-27 */
91+
if(huge+x>one) return x;/* return x with inexact if x!=0*/
92+
} else
93+
t = x*x;
94+
p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
95+
q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
96+
w = p/q;
97+
return x+x*w;
98+
}
99+
/* 1> |x|>= 0.5 */
100+
w = one-fabs(x);
101+
t = w*0.5;
102+
p = t*(pS0+t*(pS1+t*(pS2+t*(pS3+t*(pS4+t*pS5)))));
103+
q = one+t*(qS1+t*(qS2+t*(qS3+t*qS4)));
104+
s = __ieee754_sqrt(t);
105+
if(ix>=0x3FEF3333) { /* if |x| > 0.975 */
106+
w = p/q;
107+
t = pio2_hi-(2.0*(s+s*w)-pio2_lo);
108+
} else {
109+
w = s;
110+
SET_LOW_WORD(w,0);
111+
c = (t-w*w)/(s+w);
112+
r = p/q;
113+
p = 2.0*s*r-(pio2_lo-2.0*c);
114+
q = pio4_hi-2.0*w;
115+
t = pio4_hi-(p-q);
116+
}
117+
if(hx>0) return t; else return -t;
118+
}
119+
120+
#endif /* defined(_DOUBLE_IS_32BITS) */

0 commit comments

Comments
 (0)