123456789101112131415161718192021222324252627282930313233343536373839 |
- // generic.c -- defining generic macros
- #include <stdio.h>
- #include <math.h>
- #define RAD_TO_DEG (180/(4 * atanl(1)))
- // generic square root function
- #define SQRT(X) _Generic((X),\
- long double: sqrtl, \
- default: sqrt, \
- float: sqrtf)(X)
- // generic sine function, angle in degrees
- #define SIN(X) _Generic((X),\
- long double: sinl((X)/RAD_TO_DEG),\
- default: sin((X)/RAD_TO_DEG),\
- float: sinf((X)/RAD_TO_DEG)\
- )
- int main(void)
- {
- float x = 45.0f;
- double xx = 45.0;
- long double xxx =45.0L;
-
- long double y = SQRT(x);
- long double yy= SQRT(xx);
- long double yyy = SQRT(xxx);
- printf("%.17Lf\n", y); // matches float
- printf("%.17Lf\n", yy); // matches default
- printf("%.17Lf\n", yyy); // matches long double
- int i = 45;
- yy = SQRT(i); // matches default
- printf("%.17Lf\n", yy);
- yyy= SIN(xxx); // matches long double
- printf("%.17Lf\n", yyy);
-
- return 0;
- }
|