197403Sobrien/* Stub definitions for libmath subpart of libstdc++. */
297403Sobrien
3117397Skan/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
497403Sobrien
597403Sobrien   This file is part of the GNU ISO C++ Library.  This library is free
697403Sobrien   software; you can redistribute it and/or modify it under the
797403Sobrien   terms of the GNU General Public License as published by the
897403Sobrien   Free Software Foundation; either version 2, or (at your option)
997403Sobrien   any later version.
1097403Sobrien
1197403Sobrien   This library is distributed in the hope that it will be useful,
1297403Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1397403Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1497403Sobrien   GNU General Public License for more details.
1597403Sobrien
1697403Sobrien   You should have received a copy of the GNU General Public License along
1797403Sobrien   with this library; see the file COPYING.  If not, write to the Free
18169691Skan   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1997403Sobrien   USA.
2097403Sobrien
2197403Sobrien   As a special exception, you may use this file as part of a free software
2297403Sobrien   library without restriction.  Specifically, if other files instantiate
2397403Sobrien   templates or use macros or inline functions from this file, or you compile
2497403Sobrien   this file and link it with other files to produce an executable, this
2597403Sobrien   file does not by itself cause the resulting executable to be covered by
2697403Sobrien   the GNU General Public License.  This exception does not however
2797403Sobrien   invalidate any other reasons why the executable file might be covered by
2897403Sobrien   the GNU General Public License.  */
2997403Sobrien
3097403Sobrien#include <math.h>
3197403Sobrien#include "config.h"
3297403Sobrien
3397403Sobrien/* For targets which do not have support for long double versions,
3497403Sobrien   we use the crude approximation.  We'll do better later.  */
3597403Sobrien
3697403Sobrien
37169691Skan#ifndef HAVE_FABSF
38169691Skanfloat
39169691Skanfabsf(float x)
40169691Skan{
41169691Skan  return (float) fabs(x);
42169691Skan}
43169691Skan#endif
44169691Skan
45169691Skan#ifndef HAVE_FABSL
46169691Skanlong double
47169691Skanfabsl(long double x)
48169691Skan{
49169691Skan  return fabs((double) x);
50169691Skan}
51169691Skan#endif
52169691Skan
53169691Skan
54132720Skan#ifndef HAVE_ACOSF
55132720Skanfloat
56132720Skanacosf(float x)
57132720Skan{
58132720Skan  return (float) acos(x);
59132720Skan}
60132720Skan#endif
61132720Skan
62132720Skan#ifndef HAVE_ACOSL
63132720Skanlong double
64132720Skanacosl(long double x)
65132720Skan{
66132720Skan  return acos((double) x);
67132720Skan}
68132720Skan#endif
69132720Skan
70132720Skan
71132720Skan#ifndef HAVE_ASINF
72132720Skanfloat
73132720Skanasinf(float x)
74132720Skan{
75132720Skan  return (float) asin(x);
76132720Skan}
77132720Skan#endif
78132720Skan
79132720Skan#ifndef HAVE_ASINL
80132720Skanlong double
81132720Skanasinl(long double x)
82132720Skan{
83132720Skan  return asin((double) x);
84132720Skan}
85132720Skan#endif
86132720Skan
87132720Skan
88132720Skan#ifndef HAVE_ATANF
89132720Skanfloat
90132720Skanatanf(float x)
91132720Skan{
92132720Skan  return (float) atan(x);
93132720Skan}
94132720Skan#endif
95132720Skan
96132720Skan#ifndef HAVE_ATANL
97132720Skanlong double
98132720Skanatanl(long double x)
99132720Skan{
100132720Skan  return atan ((double) x);
101132720Skan}
102132720Skan#endif
103132720Skan
104132720Skan
10597403Sobrien#ifndef HAVE_ATAN2F
10697403Sobrienfloat
10797403Sobrienatan2f(float x, float y)
10897403Sobrien{
10997403Sobrien  return (float) atan2(x, y);
11097403Sobrien}
11197403Sobrien#endif
11297403Sobrien
11397403Sobrien#ifndef HAVE_ATAN2L
11497403Sobrienlong double
11597403Sobrienatan2l(long double x, long double y)
11697403Sobrien{
11797403Sobrien  return atan2((double) x, (double) y);
11897403Sobrien}
11997403Sobrien#endif
12097403Sobrien
12197403Sobrien
122132720Skan#ifndef HAVE_CEILF
123132720Skanfloat
124132720Skanceilf(float x)
125132720Skan{
126132720Skan  return (float) ceil(x);
127132720Skan}
128132720Skan#endif
129132720Skan
130132720Skan#ifndef HAVE_CEILL
131132720Skanlong double
132132720Skanceill(long double x)
133132720Skan{
134132720Skan  return ceil((double) x);
135132720Skan}
136132720Skan#endif
137132720Skan
138132720Skan
13997403Sobrien#ifndef HAVE_COSF
14097403Sobrienfloat
14197403Sobriencosf(float x)
14297403Sobrien{
14397403Sobrien  return (float) cos(x);
14497403Sobrien}
14597403Sobrien#endif
14697403Sobrien
14797403Sobrien#ifndef HAVE_COSL
14897403Sobrienlong double
14997403Sobriencosl(long double x)
15097403Sobrien{
15197403Sobrien  return cos((double) x);
15297403Sobrien}
15397403Sobrien#endif
15497403Sobrien
15597403Sobrien
15697403Sobrien#ifndef HAVE_COSHF
15797403Sobrienfloat
15897403Sobriencoshf(float x)
15997403Sobrien{
16097403Sobrien  return (float) cosh(x);
16197403Sobrien}
16297403Sobrien#endif
16397403Sobrien
16497403Sobrien#ifndef HAVE_COSHL
16597403Sobrienlong double
16697403Sobriencoshl(long double x)
16797403Sobrien{
16897403Sobrien  return cosh((double) x);
16997403Sobrien}
17097403Sobrien#endif
17197403Sobrien
17297403Sobrien
17397403Sobrien#ifndef HAVE_EXPF
17497403Sobrienfloat
17597403Sobrienexpf(float x)
17697403Sobrien{
17797403Sobrien  return (float) exp(x);
17897403Sobrien}
17997403Sobrien#endif
18097403Sobrien
18197403Sobrien#ifndef HAVE_EXPL
18297403Sobrienlong double
18397403Sobrienexpl(long double x)
18497403Sobrien{
18597403Sobrien  return exp((double) x);
18697403Sobrien}
18797403Sobrien#endif
18897403Sobrien
18997403Sobrien
190132720Skan#ifndef HAVE_FLOORF
191132720Skanfloat
192132720Skanfloorf(float x)
193132720Skan{
194132720Skan  return (float) floor(x);
195132720Skan}
196132720Skan#endif
197132720Skan
198132720Skan#ifndef HAVE_FLOORL
199132720Skanlong double
200132720Skanfloorl(long double x)
201132720Skan{
202132720Skan  return floor((double) x);
203132720Skan}
204132720Skan#endif
205132720Skan
206132720Skan
207132720Skan#ifndef HAVE_FMODF
208132720Skanfloat
209132720Skanfmodf(float x, float y)
210132720Skan{
211132720Skan  return (float) fmod(x, y);
212132720Skan}
213132720Skan#endif
214132720Skan
215132720Skan#ifndef HAVE_FMODL
216132720Skanlong double
217132720Skanfmodl(long double x, long double y)
218132720Skan{
219132720Skan  return fmod((double) x, (double) y);
220132720Skan}
221132720Skan#endif
222132720Skan
223132720Skan
224132720Skan#ifndef HAVE_FREXPF
225132720Skanfloat
226132720Skanfrexpf(float x, int *exp)
227132720Skan{
228132720Skan  return (float) frexp(x, exp);
229132720Skan}
230132720Skan#endif
231132720Skan
232132720Skan#ifndef HAVE_FREXPL
233132720Skanlong double
234132720Skanfrexpl(long double x, int *exp)
235132720Skan{
236132720Skan  return frexp((double) x, exp);
237132720Skan}
238132720Skan#endif
239132720Skan
240132720Skan
241132720Skan#ifndef HAVE_SQRTF
242132720Skanfloat
243132720Skansqrtf(float x)
244132720Skan{
245132720Skan  return (float) sqrt(x);
246132720Skan}
247132720Skan#endif
248132720Skan
249132720Skan#ifndef HAVE_SQRTL
250132720Skanlong double
251132720Skansqrtl(long double x)
252132720Skan{
253132720Skan  return  sqrt((double) x);
254132720Skan}
255132720Skan#endif
256132720Skan
257132720Skan
25897403Sobrien/* Compute the hypothenuse of a right triangle with side x and y.  */
25997403Sobrien#ifndef HAVE_HYPOTF
26097403Sobrienfloat
26197403Sobrienhypotf(float x, float y)
26297403Sobrien{
26397403Sobrien  float s = fabsf(x) + fabsf(y);
264117397Skan  if (s == 0.0F)
265117397Skan    return s;
26697403Sobrien  x /= s; y /= s;
26797403Sobrien  return s * sqrtf(x * x + y * y);
26897403Sobrien}
26997403Sobrien#endif
27097403Sobrien
27197403Sobrien#ifndef HAVE_HYPOT
27297403Sobriendouble
27397403Sobrienhypot(double x, double y)
27497403Sobrien{
27597403Sobrien  double s = fabs(x) + fabs(y);
276117397Skan  if (s == 0.0)
277117397Skan    return s;
27897403Sobrien  x /= s; y /= s;
27997403Sobrien  return s * sqrt(x * x + y * y);
28097403Sobrien}
28197403Sobrien#endif
28297403Sobrien
28397403Sobrien#ifndef HAVE_HYPOTL
28497403Sobrienlong double
28597403Sobrienhypotl(long double x, long double y)
28697403Sobrien{
28797403Sobrien  long double s = fabsl(x) + fabsl(y);
288117397Skan  if (s == 0.0L)
289117397Skan    return s;
29097403Sobrien  x /= s; y /= s;
29197403Sobrien  return s * sqrtl(x * x + y * y);
29297403Sobrien}
29397403Sobrien#endif
29497403Sobrien
29597403Sobrien
29697403Sobrien
297132720Skan#ifndef HAVE_LDEXPF
298132720Skanfloat
299132720Skanldexpf(float x, int exp)
300132720Skan{
301132720Skan  return (float) ldexp(x, exp);
302132720Skan}
303132720Skan#endif
304132720Skan
305132720Skan#ifndef HAVE_LDEXPL
306132720Skanlong double
307132720Skanldexpl(long double x, int exp)
308132720Skan{
309132720Skan  return ldexp((double) x, exp);
310132720Skan}
311132720Skan#endif
312132720Skan
313132720Skan
31497403Sobrien#ifndef HAVE_LOGF
31597403Sobrienfloat
31697403Sobrienlogf(float x)
31797403Sobrien{
31897403Sobrien  return (float) log(x);
31997403Sobrien}
32097403Sobrien#endif
32197403Sobrien
32297403Sobrien#ifndef HAVE_LOGL
32397403Sobrienlong double
32497403Sobrienlogl(long double x)
32597403Sobrien{
32697403Sobrien  return log((double) x);
32797403Sobrien}
32897403Sobrien#endif
32997403Sobrien
33097403Sobrien
33197403Sobrien#ifndef HAVE_LOG10F
33297403Sobrienfloat
33397403Sobrienlog10f(float x)
33497403Sobrien{
33597403Sobrien  return (float) log10(x);
33697403Sobrien}
33797403Sobrien#endif
33897403Sobrien
33997403Sobrien#ifndef HAVE_LOG10L
34097403Sobrienlong double
34197403Sobrienlog10l(long double x)
34297403Sobrien{
34397403Sobrien  return log10((double) x);
34497403Sobrien}
34597403Sobrien#endif
34697403Sobrien
34797403Sobrien
348132720Skan#ifndef HAVE_MODFF
349132720Skanfloat
350132720Skanmodff(float x, float *iptr)
351132720Skan{
352132720Skan  double result, temp;
353132720Skan
354132720Skan  result = modf(x, &temp);
355132720Skan  *iptr = (float) temp;
356132720Skan  return (float) result;
357132720Skan}
358132720Skan#endif
359132720Skan
360132720Skan#ifndef HAVE_MODFL
361132720Skanlong double
362132720Skanmodfl(long double x, long double *iptr)
363132720Skan{
364132720Skan  double result, temp;
365132720Skan
366132720Skan  result = modf((double) x, &temp);
367132720Skan  *iptr = temp;
368132720Skan  return result;
369132720Skan}
370132720Skan#endif
371132720Skan
372132720Skan
37397403Sobrien#ifndef HAVE_POWF
37497403Sobrienfloat
37597403Sobrienpowf(float x, float y)
37697403Sobrien{
37797403Sobrien  return (float) pow(x, y);
37897403Sobrien}
37997403Sobrien#endif
38097403Sobrien
38197403Sobrien#ifndef HAVE_POWL
38297403Sobrienlong double
38397403Sobrienpowl(long double x, long double y)
38497403Sobrien{
38597403Sobrien  return pow((double) x, (double) y);
38697403Sobrien}
38797403Sobrien#endif
38897403Sobrien
38997403Sobrien
39097403Sobrien#ifndef HAVE_SINF
39197403Sobrienfloat
39297403Sobriensinf(float x)
39397403Sobrien{
39497403Sobrien  return (float) sin(x);
39597403Sobrien}
39697403Sobrien#endif
39797403Sobrien
39897403Sobrien#ifndef HAVE_SINL
39997403Sobrienlong double
40097403Sobriensinl(long double x)
40197403Sobrien{
40297403Sobrien  return sin((double) x);
40397403Sobrien}
40497403Sobrien#endif
40597403Sobrien
40697403Sobrien
40797403Sobrien#ifndef HAVE_SINHF
40897403Sobrienfloat
40997403Sobriensinhf(float x)
41097403Sobrien{
41197403Sobrien  return (float) sinh(x);
41297403Sobrien}
41397403Sobrien#endif
41497403Sobrien
41597403Sobrien#ifndef HAVE_SINHL
41697403Sobrienlong double
41797403Sobriensinhl(long double x)
41897403Sobrien{
41997403Sobrien  return sinh((double) x);
42097403Sobrien}
42197403Sobrien#endif
42297403Sobrien
42397403Sobrien
42497403Sobrien#ifndef HAVE_TANF
42597403Sobrienfloat
42697403Sobrientanf(float x)
42797403Sobrien{
42897403Sobrien  return (float) tan(x);
42997403Sobrien}
43097403Sobrien#endif
43197403Sobrien
43297403Sobrien#ifndef HAVE_TANL
43397403Sobrienlong double
43497403Sobrientanl(long double x)
43597403Sobrien{
43697403Sobrien  return tan((double) x);
43797403Sobrien}
43897403Sobrien#endif
43997403Sobrien
44097403Sobrien
44197403Sobrien#ifndef HAVE_TANHF
44297403Sobrienfloat
44397403Sobrientanhf(float x)
44497403Sobrien{
44597403Sobrien  return (float) tanh(x);
44697403Sobrien}
44797403Sobrien#endif
44897403Sobrien
44997403Sobrien#ifndef HAVE_TANHL
45097403Sobrienlong double
45197403Sobrientanhl(long double x)
45297403Sobrien{
45397403Sobrien  return tanh((double) x);
45497403Sobrien}
45597403Sobrien#endif
456