generic.c 959 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. // generic.c -- defining generic macros
  2. #include <stdio.h>
  3. #include <math.h>
  4. #define RAD_TO_DEG (180/(4 * atanl(1)))
  5. // generic square root function
  6. #define SQRT(X) _Generic((X),\
  7. long double: sqrtl, \
  8. default: sqrt, \
  9. float: sqrtf)(X)
  10. // generic sine function, angle in degrees
  11. #define SIN(X) _Generic((X),\
  12. long double: sinl((X)/RAD_TO_DEG),\
  13. default: sin((X)/RAD_TO_DEG),\
  14. float: sinf((X)/RAD_TO_DEG)\
  15. )
  16. int main(void)
  17. {
  18. float x = 45.0f;
  19. double xx = 45.0;
  20. long double xxx =45.0L;
  21. long double y = SQRT(x);
  22. long double yy= SQRT(xx);
  23. long double yyy = SQRT(xxx);
  24. printf("%.17Lf\n", y); // matches float
  25. printf("%.17Lf\n", yy); // matches default
  26. printf("%.17Lf\n", yyy); // matches long double
  27. int i = 45;
  28. yy = SQRT(i); // matches default
  29. printf("%.17Lf\n", yy);
  30. yyy= SIN(xxx); // matches long double
  31. printf("%.17Lf\n", yyy);
  32. return 0;
  33. }