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.\" 25069a4317SEd Schouten.Dd January 4, 2012 26fd51ce66SStefan Farfeleder.Dt TGMATH 3 27aa12cea2SUlrich Spörlein.Os 28fd51ce66SStefan Farfeleder.Sh NAME 29fd51ce66SStefan Farfeleder.Nm tgmath 30e93572deSRuslan Ermilov.Nd "type-generic macros" 31fd51ce66SStefan Farfeleder.Sh SYNOPSIS 32fd51ce66SStefan Farfeleder.In tgmath.h 33fd51ce66SStefan Farfeleder.Sh DESCRIPTION 34fd51ce66SStefan FarfelederThe header 35fd51ce66SStefan Farfeleder.In tgmath.h 36fd51ce66SStefan Farfelederprovides type-generic macros 37fd51ce66SStefan Farfelederfor 38fd51ce66SStefan Farfeleder.In math.h 39fd51ce66SStefan Farfelederand 40fd51ce66SStefan Farfeleder.In complex.h 41fd51ce66SStefan Farfelederfunctions that have 42fd51ce66SStefan Farfeleder.Vt float 43fd51ce66SStefan Farfeleder(suffixed with 44e93572deSRuslan Ermilov.Sy f ) , 45fd51ce66SStefan Farfeleder.Vt double 46fd51ce66SStefan Farfelederand 47e93572deSRuslan Ermilov.Vt "long double" 48fd51ce66SStefan Farfeleder(suffixed with 49fd51ce66SStefan Farfeleder.Sy l ) 50fd51ce66SStefan Farfelederversions. 51fd51ce66SStefan FarfelederThe arguments that vary across the three functions and have type 52e93572deSRuslan Ermilov.Vt float , double 53fd51ce66SStefan Farfelederand 54fd51ce66SStefan Farfeleder.Vt "long double" , 55fd51ce66SStefan Farfelederrespectively, are called 56e93572deSRuslan Ermilov.Em "generic arguments" . 57fd51ce66SStefan Farfeleder.Pp 58fd51ce66SStefan FarfelederThe following rules describe which function is actually called if a 59e93572deSRuslan Ermilovtype-generic macro is invoked. 60e93572deSRuslan ErmilovIf any generic argument has type 61fd51ce66SStefan Farfeleder.Vt "long double" 62fd51ce66SStefan Farfelederor 63fd51ce66SStefan Farfeleder.Vt "long double complex" , 64fd51ce66SStefan Farfelederthe 65fd51ce66SStefan Farfeleder.Vt "long double" 66e93572deSRuslan Ermilovfunction is called. 67e93572deSRuslan ErmilovElse, if any generic argument has type 68e93572deSRuslan Ermilov.Vt double , "double complex" 69fd51ce66SStefan Farfelederor an integer type, the 70fd51ce66SStefan Farfeleder.Vt double 71e93572deSRuslan Ermilovversion is invoked. 72e93572deSRuslan ErmilovOtherwise, the macro expands to the 73fd51ce66SStefan Farfeleder.Vt float 74fd51ce66SStefan Farfelederimplementation. 75fd51ce66SStefan Farfeleder.Pp 76fd51ce66SStefan FarfelederFor the macros in the following table, both real and complex functions 77fd51ce66SStefan Farfelederexist. 78fd51ce66SStefan FarfelederThe real functions are prototyped in 79fd51ce66SStefan Farfeleder.In math.h 80fd51ce66SStefan Farfelederand the complex equivalents in 81fd51ce66SStefan Farfeleder.In complex.h . 82fd51ce66SStefan FarfelederThe complex function is called if any of the generic arguments is a 83fd51ce66SStefan Farfeledercomplex value. 84e93572deSRuslan ErmilovOtherwise, the real equivalent is called. 85e93572deSRuslan Ermilov.Bl -column -offset indent ".Fn acosh" "Sy real function" ".Sy complex function" 86fd51ce66SStefan Farfeleder.It Sy Macro Ta Sy real function Ta Sy complex function 87e93572deSRuslan Ermilov.It Fn acos Ta Fn acos Ta Fn cacos 88e93572deSRuslan Ermilov.It Fn asin Ta Fn asin Ta Fn casin 89e93572deSRuslan Ermilov.It Fn atan Ta Fn atan Ta Fn catan 90e93572deSRuslan Ermilov.It Fn acosh Ta Fn acosh Ta Fn cacosh 91e93572deSRuslan Ermilov.It Fn asinh Ta Fn asinh Ta Fn casinh 92e93572deSRuslan Ermilov.It Fn atanh Ta Fn atanh Ta Fn catanh 93e93572deSRuslan Ermilov.It Fn cos Ta Fn cos Ta Fn ccos 94e93572deSRuslan Ermilov.It Fn sin Ta Fn sin Ta Fn csin 95e93572deSRuslan Ermilov.It Fn tan Ta Fn tan Ta Fn ctan 96e93572deSRuslan Ermilov.It Fn cosh Ta Fn cosh Ta Fn ccosh 97e93572deSRuslan Ermilov.It Fn sinh Ta Fn sinh Ta Fn csinh 98e93572deSRuslan Ermilov.It Fn tanh Ta Fn tanh Ta Fn ctanh 99e93572deSRuslan Ermilov.It Fn exp Ta Fn exp Ta Fn cexp 100e93572deSRuslan Ermilov.It Fn log Ta Fn log Ta Fn clog 101e93572deSRuslan Ermilov.It Fn pow Ta Fn pow Ta Fn cpow 1023eb5f519SDavid Schultz.It Fn sqrt Ta Fn sqrt Ta Fn csqrt 103e93572deSRuslan Ermilov.It Fn fabs Ta Fn fabs Ta Fn cabs 104fd51ce66SStefan Farfeleder.El 105fd51ce66SStefan Farfeleder.Pp 106fd51ce66SStefan FarfelederNo complex functions exist for the following macros, so passing a 107fd51ce66SStefan Farfeledercomplex value to a generic argument invokes undefined behaviour: 108e93572deSRuslan Ermilov.Bl -column -offset indent ".Fn nexttoward" ".Fn nexttoward" ".Fn nexttoward" ".Fn nexttoward" 109e93572deSRuslan Ermilov.It Fn atan2 Ta Fn fma Ta Fn llround Ta Fn remainder 110e93572deSRuslan Ermilov.It Fn cbrt Ta Fn fmax Ta Fn log10 Ta Fn remquo 111e93572deSRuslan Ermilov.It Fn ceil Ta Fn fmin Ta Fn log1p Ta Fn rint 112e93572deSRuslan Ermilov.It Fn copysign Ta Fn fmod Ta Fn log2 Ta Fn round 113e93572deSRuslan Ermilov.It Fn erf Ta Fn frexp Ta Fn logb Ta Fn scalbn 114e93572deSRuslan Ermilov.It Fn erfc Ta Fn hypot Ta Fn lrint Ta Fn scalbln 115e93572deSRuslan Ermilov.It Fn exp2 Ta Fn ilogb Ta Fn lround Ta Fn tgamma 116*e4c7bde8SSteve Kargl.It Fn expm1 Ta Fn ldexp Ta Fn nearbyint Ta Fn trunc 117748611c9SJoel Dahl.It Fn fdim Ta Fn lgamma Ta Fn nextafter Ta \& 118748611c9SJoel Dahl.It Fn floor Ta Fn llrint Ta Fn nexttoward Ta \& 119fd51ce66SStefan Farfeleder.El 120fd51ce66SStefan Farfeleder.Pp 121fd51ce66SStefan FarfelederThe following macros always expand to a complex function: 122e93572deSRuslan Ermilov.Bl -column -offset indent ".Fn cimag" ".Fn cimag" ".Fn cimag" ".Fn cimag" ".Fn cimag" 123e93572deSRuslan Ermilov.It Fn carg Ta Fn cimag Ta Fn conj Ta Fn cproj Ta Fn creal 124fd51ce66SStefan Farfeleder.El 125fd51ce66SStefan Farfeleder.Pp 126fd51ce66SStefan FarfelederThis header includes 127fd51ce66SStefan Farfeleder.In complex.h 128fd51ce66SStefan Farfelederand 129fd51ce66SStefan Farfeleder.In math.h . 130fd51ce66SStefan Farfeleder.Sh STANDARDS 131e93572deSRuslan ErmilovThe header 132fd51ce66SStefan Farfeleder.In tgmath.h 133fd51ce66SStefan Farfelederconforms to 134fd51ce66SStefan Farfeleder.St -isoC-99 . 135fd51ce66SStefan Farfeleder.Sh HISTORY 136fd51ce66SStefan FarfelederThe header 137fd51ce66SStefan Farfeleder.In tgmath.h 138fd51ce66SStefan Farfelederfirst appeared in 139fd51ce66SStefan Farfeleder.Fx 5.3 . 140069a4317SEd Schouten.Sh COMPILER SUPPORT 141069a4317SEd SchoutenBefore 142cabdddaeSUlrich Spörlein.St -isoC-2011 , 143069a4317SEd Schoutenthe header 144fd51ce66SStefan Farfeleder.In tgmath.h 145069a4317SEd Schoutencould not be implemented with strictly conforming C code and needed 146e93572deSRuslan Ermilovspecial compiler support. 147069a4317SEd SchoutenAs of 148cabdddaeSUlrich Spörlein.St -isoC-2011 , 149069a4317SEd Schoutenthis header file can be implemented using the 150069a4317SEd Schouten.Fn _Generic 151069a4317SEd Schoutenlanguage keyword. 152069a4317SEd SchoutenIn addition to compilers that support this keyword, this header file 153069a4317SEd Schoutenworks with GCC. 154069a4317SEd Schouten.Sh BUGS 155fd51ce66SStefan FarfelederMany of the functions mentioned here are not prototyped in 156fd51ce66SStefan Farfeleder.In math.h 157fd51ce66SStefan Farfelederor 158fd51ce66SStefan Farfeleder.In complex.h 159fd51ce66SStefan Farfelederas they are not yet implemented. 160069a4317SEd SchoutenThis prevents the corresponding type-generic macro from working at all. 161