Jump to content

C Programming/tgmath.h

From Wikibooks, open books for an open world

tgmath.h is a Standard C header that defines many type-generic macros that can be used for a variety of mathematical operations. This header also includes math.h and complex.h. For all of the functions in the math.h and complex.h headers that do not have an f (float) or l (long double) suffix, and whose corresponding type is double (with the exception of modf()), there is a corresponding macro.[1]

Type-generic macro

[edit | edit source]

A type generic macro is something which allows calling a function whose type is determined by the type of argument in the macro. This means, for example, x is declared as an int data type but has been called this way:

 tan((float)x)


then this expression will have a type float[2].
Also, if any one of the parameters or arguments of a type-generic macro is complex, it will call a complex function, otherwise a real function will be called. The type of function that is called, ultimately depends upon the final converted type of parameter.[3].

Dependency Graph

[edit | edit source]

The flowchart below shows the Dependency graph for tgmath.h.[4]

Dependency Graph

Functions from math.h

[edit | edit source]

The functions listed below handle real arguments and return real output only. If complex arguments are passed to these functions, NaN or other special numbers are returned[5].

Name Description
acos inverse cosine
asin inverse sine
atan one-parameter inverse tangent
atan2 two-parameter inverse tangent
ceil ceiling, the smallest integer not less than parameter
cos cosine
cosh hyperbolic cosine
exp exponential function
fabs absolute value of a floating-point number
floor floor, the largest integer not greater than parameter
fmod floating-point remainder
frexp decomposes a number into significand and a power of 2
ldexp scale floating-point number by exponent (see article)
log natural logarithm
log10 base-10 logarithm
modf(x,p) returns fractional part of x and stores integral part where pointer p points to
pow(x,y) raise x to the power of y, xy
sin sine
sinh hyperbolic sine
sqrt square root, returns non-negative square-root of the number
tan tangent
tanh hyperbolic tangent
isgreater If x > y, it returns 1, otherwise 0
isnan(x) returns 1, if x is NaN (Not A Number)
islessequal returns 1, if x is less than or equal to y, otherwise returns 0
isinf(x) represents whether x is infinite
signbit represents whether x is negative (returns 8 if x is less than 0, otherwise returns 0)

Functions from complex.h

[edit | edit source]

The functions defined below handle complex parameters, but do not return complex output[5].

Name Description
cacos inverse cosine
casin inverse sine
catan one-parameter inverse tangent
catan2 two-parameter inverse tangent
cceil ceiling, the smallest integer not less than parameter
ccos cosine
ccosh hyperbolic cosine
cexp exponential function
cabs absolute value of a complex floating-point number
cfloor floor, the largest integer not greater than parameter
cfmod floating-point remainder
cfrexp decomposes a number into significand and a power of 2
cldexp scale floating-point number by exponent (see article)
clog natural logarithm
clog10 base-10 logarithm
cmodf(x,p) returns fractional part of x and stores integral part where pointer p points to
cpow(x,y) raise x to the power of y, xy
csin sine
csinh hyperbolic sine
csqrt square root, returns non-negative square-root of the number
ctan tangent
ctanh hyperbolic tangent

Usage example

[edit | edit source]

The code below illustrates usage of ,atan function defined in tgmath.h, which computes the inverse of tangent of a number defined in the domain of tangent.

#include <stdio.h>
#include <tgmath.h>
int main()
{
        float ang, ans;
        scanf("%f", &ang);
        ans = atan(ang);
        printf("%0.3f\n", ans);
        return 0;
}

Notable differences

[edit | edit source]

The similar functions defined here have notable difference when it comes to return value of "tricky" numbers. For example, using sqrt to compute square root of -25 returns -NaN(Not a Number), whereas, csqrt returns 0.000000. Such differences may be noticed in other functions also.

Rationale

[edit | edit source]

This header file is mainly included while calculating mathematical functions.As it includes both math.h and complex.h, the problem arising due to inconsistent input is solved. Including any of the header files, individually, involves inconsistent outputs for some inputs.

References

[edit | edit source]
  1. http://www.opengroup.org/onlinepubs/009695399/basedefs/tgmath.h.html
  2. http://manpages.ubuntu.com/manpages/hardy/man7/tgmath.h.7posix.html
  3. http://www.qnx.com/developers/docs/6.4.1/dinkum_en/c99/tgmath.html
  4. http://www-zeuthen.desy.de/apewww/APE/software/nlibc/html/tgmath_8h.html
  5. a b http://pubs.opengroup.org/onlinepubs/009604599/basedefs/tgmath.h.html
[edit | edit source]