This source file includes following definitions.
- cbrtl
- cbrtl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <config.h>
21
22
23 #include <math.h>
24
25 #if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
26
27 long double
28 cbrtl (long double x)
29 {
30 return cbrt (x);
31 }
32
33 #else
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
72
73 static const long double CBRT2 = 1.259921049894873164767210607278228350570251L;
74 static const long double CBRT4 = 1.587401051968199474751705639272308260391493L;
75 static const long double CBRT2I = 0.7937005259840997373758528196361541301957467L;
76 static const long double CBRT4I = 0.6299605249474365823836053036391141752851257L;
77
78 long double
79 cbrtl (long double x)
80 {
81 if (isfinite (x) && x != 0.0L)
82 {
83 int e, rem, sign;
84 long double z;
85
86 if (x > 0)
87 sign = 1;
88 else
89 {
90 sign = -1;
91 x = -x;
92 }
93
94 z = x;
95
96 x = frexpl (x, &e);
97
98
99
100 x = ((((1.3584464340920900529734e-1L * x
101 - 6.3986917220457538402318e-1L) * x
102 + 1.2875551670318751538055e0L) * x
103 - 1.4897083391357284957891e0L) * x
104 + 1.3304961236013647092521e0L) * x + 3.7568280825958912391243e-1L;
105
106
107 if (e >= 0)
108 {
109 rem = e;
110 e /= 3;
111 rem -= 3 * e;
112 if (rem == 1)
113 x *= CBRT2;
114 else if (rem == 2)
115 x *= CBRT4;
116 }
117 else
118 {
119 e = -e;
120 rem = e;
121 e /= 3;
122 rem -= 3 * e;
123 if (rem == 1)
124 x *= CBRT2I;
125 else if (rem == 2)
126 x *= CBRT4I;
127 e = -e;
128 }
129
130
131 x = ldexpl (x, e);
132
133
134 x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333L;
135 x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333L;
136 x -= (x - (z / (x * x))) * 0.3333333333333333333333333333333333333333L;
137
138 if (sign < 0)
139 x = -x;
140 return x;
141 }
142 else
143 {
144 # ifdef __sgi
145 return x;
146 # else
147 return x + x;
148 # endif
149 }
150 }
151
152 #endif