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