stubs.c revision 117397
110710Sddmitriev/* Stub definitions for libmath subpart of libstdc++. */
210710Sddmitriev
310710Sddmitriev/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
410710Sddmitriev
510710Sddmitriev   This file is part of the GNU ISO C++ Library.  This library is free
610710Sddmitriev   software; you can redistribute it and/or modify it under the
710710Sddmitriev   terms of the GNU General Public License as published by the
810710Sddmitriev   Free Software Foundation; either version 2, or (at your option)
910710Sddmitriev   any later version.
1010710Sddmitriev
1110710Sddmitriev   This library is distributed in the hope that it will be useful,
1210710Sddmitriev   but WITHOUT ANY WARRANTY; without even the implied warranty of
1310710Sddmitriev   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1410710Sddmitriev   GNU General Public License for more details.
1510710Sddmitriev
1610710Sddmitriev   You should have received a copy of the GNU General Public License along
1710710Sddmitriev   with this library; see the file COPYING.  If not, write to the Free
1810710Sddmitriev   Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1910710Sddmitriev   USA.
2010710Sddmitriev
2110710Sddmitriev   As a special exception, you may use this file as part of a free software
2210710Sddmitriev   library without restriction.  Specifically, if other files instantiate
2310710Sddmitriev   templates or use macros or inline functions from this file, or you compile
2410710Sddmitriev   this file and link it with other files to produce an executable, this
2510710Sddmitriev   file does not by itself cause the resulting executable to be covered by
2610710Sddmitriev   the GNU General Public License.  This exception does not however
2710710Sddmitriev   invalidate any other reasons why the executable file might be covered by
2810710Sddmitriev   the GNU General Public License.  */
2910710Sddmitriev
3010710Sddmitriev#include <math.h>
3110710Sddmitriev#include "config.h"
3210710Sddmitriev
3310710Sddmitriev/* For targets which do not have support for long double versions,
3410710Sddmitriev   we use the crude approximation.  We'll do better later.  */
3510710Sddmitriev
3610710Sddmitriev
3710710Sddmitriev#ifndef HAVE_ATAN2F
3810710Sddmitrievfloat
3910710Sddmitrievatan2f(float x, float y)
4010710Sddmitriev{
4110710Sddmitriev  return (float) atan2(x, y);
4210710Sddmitriev}
4310710Sddmitriev#endif
4410710Sddmitriev
4510710Sddmitriev#ifndef HAVE_ATAN2L
4610710Sddmitrievlong double
4710710Sddmitrievatan2l(long double x, long double y)
4810710Sddmitriev{
4910710Sddmitriev  return atan2((double) x, (double) y);
5010710Sddmitriev}
5110710Sddmitriev#endif
5210710Sddmitriev
5310710Sddmitriev
5410710Sddmitriev#ifndef HAVE_COSF
5510710Sddmitrievfloat
5610710Sddmitrievcosf(float x)
5710710Sddmitriev{
5810710Sddmitriev  return (float) cos(x);
5910710Sddmitriev}
6010710Sddmitriev#endif
6110710Sddmitriev
6210710Sddmitriev#ifndef HAVE_COSL
6310710Sddmitrievlong double
6410710Sddmitrievcosl(long double x)
6510710Sddmitriev{
6610710Sddmitriev  return cos((double) x);
6710710Sddmitriev}
6810710Sddmitriev#endif
6910710Sddmitriev
7010710Sddmitriev
7110710Sddmitriev#ifndef HAVE_COSHF
7210710Sddmitrievfloat
7310710Sddmitrievcoshf(float x)
7410710Sddmitriev{
7510710Sddmitriev  return (float) cosh(x);
7610710Sddmitriev}
7710710Sddmitriev#endif
7810710Sddmitriev
7910710Sddmitriev#ifndef HAVE_COSHL
8010710Sddmitrievlong double
8110710Sddmitrievcoshl(long double x)
8210710Sddmitriev{
8310710Sddmitriev  return cosh((double) x);
8410710Sddmitriev}
8510710Sddmitriev#endif
8610710Sddmitriev
8710710Sddmitriev
8810710Sddmitriev#ifndef HAVE_EXPF
8910710Sddmitrievfloat
9010710Sddmitrievexpf(float x)
9110710Sddmitriev{
9210710Sddmitriev  return (float) exp(x);
9310710Sddmitriev}
9410710Sddmitriev#endif
9510710Sddmitriev
9610710Sddmitriev#ifndef HAVE_EXPL
9710710Sddmitrievlong double
9810710Sddmitrievexpl(long double x)
9910710Sddmitriev{
10010710Sddmitriev  return exp((double) x);
10110710Sddmitriev}
10210710Sddmitriev#endif
10310710Sddmitriev
10410710Sddmitriev
10510710Sddmitriev/* Compute the hypothenuse of a right triangle with side x and y.  */
10610710Sddmitriev#ifndef HAVE_HYPOTF
10710710Sddmitrievfloat
10810710Sddmitrievhypotf(float x, float y)
10910710Sddmitriev{
11010710Sddmitriev  float s = fabsf(x) + fabsf(y);
11110710Sddmitriev  if (s == 0.0F)
11210710Sddmitriev    return s;
11310710Sddmitriev  x /= s; y /= s;
11410710Sddmitriev  return s * sqrtf(x * x + y * y);
11510710Sddmitriev}
11610710Sddmitriev#endif
11710710Sddmitriev
11810710Sddmitriev#ifndef HAVE_HYPOT
11910710Sddmitrievdouble
12010710Sddmitrievhypot(double x, double y)
12110710Sddmitriev{
12210710Sddmitriev  double s = fabs(x) + fabs(y);
12310710Sddmitriev  if (s == 0.0)
12410710Sddmitriev    return s;
12510710Sddmitriev  x /= s; y /= s;
12610710Sddmitriev  return s * sqrt(x * x + y * y);
12710710Sddmitriev}
12810710Sddmitriev#endif
12910710Sddmitriev
13010710Sddmitriev#ifndef HAVE_HYPOTL
13110710Sddmitrievlong double
13210710Sddmitrievhypotl(long double x, long double y)
13310710Sddmitriev{
13410710Sddmitriev  long double s = fabsl(x) + fabsl(y);
13510710Sddmitriev  if (s == 0.0L)
13610710Sddmitriev    return s;
13710710Sddmitriev  x /= s; y /= s;
13810710Sddmitriev  return s * sqrtl(x * x + y * y);
13910710Sddmitriev}
14010710Sddmitriev#endif
14110710Sddmitriev
14210710Sddmitriev
14310710Sddmitriev
14410710Sddmitriev#ifndef HAVE_LOGF
14510710Sddmitrievfloat
14610710Sddmitrievlogf(float x)
14710710Sddmitriev{
14810710Sddmitriev  return (float) log(x);
14910710Sddmitriev}
15010710Sddmitriev#endif
15110710Sddmitriev
15210710Sddmitriev#ifndef HAVE_LOGL
15310710Sddmitrievlong double
15410710Sddmitrievlogl(long double x)
15510710Sddmitriev{
15610710Sddmitriev  return log((double) x);
15710710Sddmitriev}
15810710Sddmitriev#endif
15910710Sddmitriev
16010710Sddmitriev
16110710Sddmitriev#ifndef HAVE_LOG10F
16210710Sddmitrievfloat
16310710Sddmitrievlog10f(float x)
16410710Sddmitriev{
16510710Sddmitriev  return (float) log10(x);
16610710Sddmitriev}
16710710Sddmitriev#endif
168
169#ifndef HAVE_LOG10L
170long double
171log10l(long double x)
172{
173  return log10((double) x);
174}
175#endif
176
177
178#ifndef HAVE_POWF
179float
180powf(float x, float y)
181{
182  return (float) pow(x, y);
183}
184#endif
185
186#ifndef HAVE_POWL
187long double
188powl(long double x, long double y)
189{
190  return pow((double) x, (double) y);
191}
192#endif
193
194
195#ifndef HAVE_SINF
196float
197sinf(float x)
198{
199  return (float) sin(x);
200}
201#endif
202
203#ifndef HAVE_SINL
204long double
205sinl(long double x)
206{
207  return sin((double) x);
208}
209#endif
210
211
212#ifndef HAVE_SINHF
213float
214sinhf(float x)
215{
216  return (float) sinh(x);
217}
218#endif
219
220#ifndef HAVE_SINHL
221long double
222sinhl(long double x)
223{
224  return sinh((double) x);
225}
226#endif
227
228
229#ifndef HAVE_SQRTF
230float
231sqrtf(float x)
232{
233  return (float) sqrt(x);
234}
235#endif
236
237#ifndef HAVE_SQRTL
238long double
239sqrtl(long double x)
240{
241  return  sqrt((double) x);
242}
243#endif
244
245
246#ifndef HAVE_TANF
247float
248tanf(float x)
249{
250  return (float) tan(x);
251}
252#endif
253
254#ifndef HAVE_TANL
255long double
256tanl(long double x)
257{
258  return tan((double) x);
259}
260#endif
261
262
263#ifndef HAVE_TANHF
264float
265tanhf(float x)
266{
267  return (float) tanh(x);
268}
269#endif
270
271#ifndef HAVE_TANHL
272long double
273tanhl(long double x)
274{
275  return tanh((double) x);
276}
277#endif
278