1fd51ce66SStefan Farfeleder.\" Copyright (c) 2004 Stefan Farfeleder 2fd51ce66SStefan Farfeleder.\" All rights reserved. 3fd51ce66SStefan Farfeleder.\" 4fd51ce66SStefan Farfeleder.\" Redistribution and use in source and binary forms, with or without 5fd51ce66SStefan Farfeleder.\" modification, are permitted provided that the following conditions 6fd51ce66SStefan Farfeleder.\" are met: 7fd51ce66SStefan Farfeleder.\" 1. Redistributions of source code must retain the above copyright 8fd51ce66SStefan Farfeleder.\" notice, this list of conditions and the following disclaimer. 9fd51ce66SStefan Farfeleder.\" 2. Redistributions in binary form must reproduce the above copyright 10fd51ce66SStefan Farfeleder.\" notice, this list of conditions and the following disclaimer in the 11fd51ce66SStefan Farfeleder.\" documentation and/or other materials provided with the distribution. 12fd51ce66SStefan Farfeleder.\" 13fd51ce66SStefan Farfeleder.\" THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14fd51ce66SStefan Farfeleder.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15fd51ce66SStefan Farfeleder.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16fd51ce66SStefan Farfeleder.\" ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 17fd51ce66SStefan Farfeleder.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18fd51ce66SStefan Farfeleder.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19fd51ce66SStefan Farfeleder.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20fd51ce66SStefan Farfeleder.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21fd51ce66SStefan Farfeleder.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22fd51ce66SStefan Farfeleder.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23fd51ce66SStefan Farfeleder.\" SUCH DAMAGE. 24fd51ce66SStefan Farfeleder.\" 25fd51ce66SStefan Farfeleder.\" $FreeBSD$ 26fd51ce66SStefan Farfeleder.\" 27069a4317SEd Schouten.Dd January 4, 2012 28fd51ce66SStefan Farfeleder.Dt TGMATH 3 29aa12cea2SUlrich Spörlein.Os 30fd51ce66SStefan Farfeleder.Sh NAME 31fd51ce66SStefan Farfeleder.Nm tgmath 32e93572deSRuslan Ermilov.Nd "type-generic macros" 33fd51ce66SStefan Farfeleder.Sh SYNOPSIS 34fd51ce66SStefan Farfeleder.In tgmath.h 35fd51ce66SStefan Farfeleder.Sh DESCRIPTION 36fd51ce66SStefan FarfelederThe header 37fd51ce66SStefan Farfeleder.In tgmath.h 38fd51ce66SStefan Farfelederprovides type-generic macros 39fd51ce66SStefan Farfelederfor 40fd51ce66SStefan Farfeleder.In math.h 41fd51ce66SStefan Farfelederand 42fd51ce66SStefan Farfeleder.In complex.h 43fd51ce66SStefan Farfelederfunctions that have 44fd51ce66SStefan Farfeleder.Vt float 45fd51ce66SStefan Farfeleder(suffixed with 46e93572deSRuslan Ermilov.Sy f ) , 47fd51ce66SStefan Farfeleder.Vt double 48fd51ce66SStefan Farfelederand 49e93572deSRuslan Ermilov.Vt "long double" 50fd51ce66SStefan Farfeleder(suffixed with 51fd51ce66SStefan Farfeleder.Sy l ) 52fd51ce66SStefan Farfelederversions. 53fd51ce66SStefan FarfelederThe arguments that vary across the three functions and have type 54e93572deSRuslan Ermilov.Vt float , double 55fd51ce66SStefan Farfelederand 56fd51ce66SStefan Farfeleder.Vt "long double" , 57fd51ce66SStefan Farfelederrespectively, are called 58e93572deSRuslan Ermilov.Em "generic arguments" . 59fd51ce66SStefan Farfeleder.Pp 60fd51ce66SStefan FarfelederThe following rules describe which function is actually called if a 61e93572deSRuslan Ermilovtype-generic macro is invoked. 62e93572deSRuslan ErmilovIf any generic argument has type 63fd51ce66SStefan Farfeleder.Vt "long double" 64fd51ce66SStefan Farfelederor 65fd51ce66SStefan Farfeleder.Vt "long double complex" , 66fd51ce66SStefan Farfelederthe 67fd51ce66SStefan Farfeleder.Vt "long double" 68e93572deSRuslan Ermilovfunction is called. 69e93572deSRuslan ErmilovElse, if any generic argument has type 70e93572deSRuslan Ermilov.Vt double , "double complex" 71fd51ce66SStefan Farfelederor an integer type, the 72fd51ce66SStefan Farfeleder.Vt double 73e93572deSRuslan Ermilovversion is invoked. 74e93572deSRuslan ErmilovOtherwise, the macro expands to the 75fd51ce66SStefan Farfeleder.Vt float 76fd51ce66SStefan Farfelederimplementation. 77fd51ce66SStefan Farfeleder.Pp 78fd51ce66SStefan FarfelederFor the macros in the following table, both real and complex functions 79fd51ce66SStefan Farfelederexist. 80fd51ce66SStefan FarfelederThe real functions are prototyped in 81fd51ce66SStefan Farfeleder.In math.h 82fd51ce66SStefan Farfelederand the complex equivalents in 83fd51ce66SStefan Farfeleder.In complex.h . 84fd51ce66SStefan FarfelederThe complex function is called if any of the generic arguments is a 85fd51ce66SStefan Farfeledercomplex value. 86e93572deSRuslan ErmilovOtherwise, the real equivalent is called. 87e93572deSRuslan Ermilov.Bl -column -offset indent ".Fn acosh" "Sy real function" ".Sy complex function" 88fd51ce66SStefan Farfeleder.It Sy Macro Ta Sy real function Ta Sy complex function 89e93572deSRuslan Ermilov.It Fn acos Ta Fn acos Ta Fn cacos 90e93572deSRuslan Ermilov.It Fn asin Ta Fn asin Ta Fn casin 91e93572deSRuslan Ermilov.It Fn atan Ta Fn atan Ta Fn catan 92e93572deSRuslan Ermilov.It Fn acosh Ta Fn acosh Ta Fn cacosh 93e93572deSRuslan Ermilov.It Fn asinh Ta Fn asinh Ta Fn casinh 94e93572deSRuslan Ermilov.It Fn atanh Ta Fn atanh Ta Fn catanh 95e93572deSRuslan Ermilov.It Fn cos Ta Fn cos Ta Fn ccos 96e93572deSRuslan Ermilov.It Fn sin Ta Fn sin Ta Fn csin 97e93572deSRuslan Ermilov.It Fn tan Ta Fn tan Ta Fn ctan 98e93572deSRuslan Ermilov.It Fn cosh Ta Fn cosh Ta Fn ccosh 99e93572deSRuslan Ermilov.It Fn sinh Ta Fn sinh Ta Fn csinh 100e93572deSRuslan Ermilov.It Fn tanh Ta Fn tanh Ta Fn ctanh 101e93572deSRuslan Ermilov.It Fn exp Ta Fn exp Ta Fn cexp 102e93572deSRuslan Ermilov.It Fn log Ta Fn log Ta Fn clog 103e93572deSRuslan Ermilov.It Fn pow Ta Fn pow Ta Fn cpow 1043eb5f519SDavid Schultz.It Fn sqrt Ta Fn sqrt Ta Fn csqrt 105e93572deSRuslan Ermilov.It Fn fabs Ta Fn fabs Ta Fn cabs 106fd51ce66SStefan Farfeleder.El 107fd51ce66SStefan Farfeleder.Pp 108fd51ce66SStefan FarfelederNo complex functions exist for the following macros, so passing a 109fd51ce66SStefan Farfeledercomplex value to a generic argument invokes undefined behaviour: 110e93572deSRuslan Ermilov.Bl -column -offset indent ".Fn nexttoward" ".Fn nexttoward" ".Fn nexttoward" ".Fn nexttoward" 111e93572deSRuslan Ermilov.It Fn atan2 Ta Fn fma Ta Fn llround Ta Fn remainder 112e93572deSRuslan Ermilov.It Fn cbrt Ta Fn fmax Ta Fn log10 Ta Fn remquo 113e93572deSRuslan Ermilov.It Fn ceil Ta Fn fmin Ta Fn log1p Ta Fn rint 114e93572deSRuslan Ermilov.It Fn copysign Ta Fn fmod Ta Fn log2 Ta Fn round 115e93572deSRuslan Ermilov.It Fn erf Ta Fn frexp Ta Fn logb Ta Fn scalbn 116e93572deSRuslan Ermilov.It Fn erfc Ta Fn hypot Ta Fn lrint Ta Fn scalbln 117e93572deSRuslan Ermilov.It Fn exp2 Ta Fn ilogb Ta Fn lround Ta Fn tgamma 118*e4c7bde8SSteve Kargl.It Fn expm1 Ta Fn ldexp Ta Fn nearbyint Ta Fn trunc 119748611c9SJoel Dahl.It Fn fdim Ta Fn lgamma Ta Fn nextafter Ta \& 120748611c9SJoel Dahl.It Fn floor Ta Fn llrint Ta Fn nexttoward Ta \& 121fd51ce66SStefan Farfeleder.El 122fd51ce66SStefan Farfeleder.Pp 123fd51ce66SStefan FarfelederThe following macros always expand to a complex function: 124e93572deSRuslan Ermilov.Bl -column -offset indent ".Fn cimag" ".Fn cimag" ".Fn cimag" ".Fn cimag" ".Fn cimag" 125e93572deSRuslan Ermilov.It Fn carg Ta Fn cimag Ta Fn conj Ta Fn cproj Ta Fn creal 126fd51ce66SStefan Farfeleder.El 127fd51ce66SStefan Farfeleder.Pp 128fd51ce66SStefan FarfelederThis header includes 129fd51ce66SStefan Farfeleder.In complex.h 130fd51ce66SStefan Farfelederand 131fd51ce66SStefan Farfeleder.In math.h . 132fd51ce66SStefan Farfeleder.Sh STANDARDS 133e93572deSRuslan ErmilovThe header 134fd51ce66SStefan Farfeleder.In tgmath.h 135fd51ce66SStefan Farfelederconforms to 136fd51ce66SStefan Farfeleder.St -isoC-99 . 137fd51ce66SStefan Farfeleder.Sh HISTORY 138fd51ce66SStefan FarfelederThe header 139fd51ce66SStefan Farfeleder.In tgmath.h 140fd51ce66SStefan Farfelederfirst appeared in 141fd51ce66SStefan Farfeleder.Fx 5.3 . 142069a4317SEd Schouten.Sh COMPILER SUPPORT 143069a4317SEd SchoutenBefore 144cabdddaeSUlrich Spörlein.St -isoC-2011 , 145069a4317SEd Schoutenthe header 146fd51ce66SStefan Farfeleder.In tgmath.h 147069a4317SEd Schoutencould not be implemented with strictly conforming C code and needed 148e93572deSRuslan Ermilovspecial compiler support. 149069a4317SEd SchoutenAs of 150cabdddaeSUlrich Spörlein.St -isoC-2011 , 151069a4317SEd Schoutenthis header file can be implemented using the 152069a4317SEd Schouten.Fn _Generic 153069a4317SEd Schoutenlanguage keyword. 154069a4317SEd SchoutenIn addition to compilers that support this keyword, this header file 155069a4317SEd Schoutenworks with GCC. 156069a4317SEd Schouten.Sh BUGS 157fd51ce66SStefan FarfelederMany of the functions mentioned here are not prototyped in 158fd51ce66SStefan Farfeleder.In math.h 159fd51ce66SStefan Farfelederor 160fd51ce66SStefan Farfeleder.In complex.h 161fd51ce66SStefan Farfelederas they are not yet implemented. 162069a4317SEd SchoutenThis prevents the corresponding type-generic macro from working at all. 163