| #include <math.h> | |
| #include <stdio.h> | |
| #include <inttypes.h> | |
| volatile long double in1 = -1.0L / 0.0L; | |
| volatile long double in2 = 1.0L / 0.0L; | |
| volatile long double ld1 = 3.51L; | |
| volatile double ld2 = 3.51; | |
| volatile float ld3 = 3.51F; | |
| #define ARG1_FCT(NAME) \ | |
| do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1), \ | |
| (double) NAME (ld2), \ | |
| (double) NAME##f (ld3)); \ | |
| } while (0) | |
| #define ARG2_FCT(NAME,VAL) \ | |
| do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1, VAL##L), \ | |
| (double) NAME (ld2, VAL), \ | |
| (double) NAME##f (ld3, VAL##f)); \ | |
| } while (0) | |
| #define ARG3_FCT(NAME,VAL,VAL2) \ | |
| do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1, VAL##L, VAL2##L), \ | |
| (double) NAME (ld2, VAL, VAL2), \ | |
| (double) NAME##f (ld3, VAL##f, VAL2##f)); \ | |
| } while (0) | |
| #define ARG2_FCTINT(NAME) \ | |
| do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1, 2), \ | |
| (double) NAME (ld2, 2), \ | |
| (double) NAME##f (ld3, 2)); \ | |
| } while (0) | |
| #define ARG2_FCTPINT(NAME) \ | |
| do { \ | |
| int i = 0; \ | |
| printf (#NAME ": %g", (double) NAME##l (ld1, &i)); \ | |
| printf ("=%d", i); \ | |
| printf (" %g", (double) NAME (ld2, &i)); \ | |
| printf ("=%d", i); \ | |
| printf (" %g", (double) NAME##f (ld3, &i)); \ | |
| printf ("=%d\n", i); \ | |
| } while(0) | |
| #ifdef __WIN64__ | |
| #define printfmt PRIu64 | |
| #else | |
| #define printfmt PRIu32 | |
| #endif | |
| int main() | |
| { | |
| printf ("sizeof(float)=%"printfmt", sizeof(double)=%"printfmt", sizeof(long double)=%"printfmt"\n", sizeof (float), sizeof(double), sizeof(long double)); | |
| printf ("%g %g %g\n", (double) ld1, (double) ld2, (double) ld3); | |
| ARG1_FCT (sin); | |
| ARG1_FCT (cos); | |
| ARG1_FCT (tan); | |
| ARG1_FCT (sinh); | |
| ARG1_FCT (cosh); | |
| ARG1_FCT (tanh); | |
| ARG1_FCT (asin); | |
| ARG1_FCT (acos); | |
| ARG1_FCT (atan); | |
| ARG2_FCT (atan2, 0.5); | |
| ARG1_FCT (exp); | |
| ARG1_FCT (exp2); | |
| ARG2_FCT (pow, 2.0); | |
| ARG1_FCT (sqrt); | |
| ARG1_FCT (ceil); | |
| ARG1_FCT (floor); | |
| ARG1_FCT (fabs); | |
| // double __cdecl ldexp(double _X,int _Y); | |
| // double __cdecl frexp(double _X,int *_Y); | |
| // double __cdecl modf(double _X,double *_Y); | |
| ARG2_FCT(fmod, 2.5); | |
| ARG1_FCT (log1p); | |
| ARG1_FCT (log2); | |
| ARG1_FCT (logb); | |
| ARG1_FCT (tgamma); | |
| ARG1_FCT (lgamma); | |
| ARG1_FCT (erf); | |
| ARG1_FCT (erfc); | |
| ARG1_FCT (nearbyint); | |
| ARG1_FCT (rint); | |
| ARG1_FCT (lrint); | |
| ARG1_FCT (llrint); | |
| ARG1_FCT (lround); | |
| ARG1_FCT (llround); | |
| ARG1_FCT (log); | |
| ARG1_FCT (log10); | |
| ARG1_FCT (round); | |
| ARG1_FCT (trunc); | |
| ARG2_FCT (remainder, 2.0); | |
| ARG2_FCT (copysign, -1.0); | |
| ARG2_FCT (nexttoward, 0.5); | |
| ARG2_FCT (nexttoward, 0.5); | |
| ARG2_FCT (fdim, 0.5); | |
| ARG2_FCT (fmax, 0.5); | |
| ARG2_FCT (fmin, 0.5); | |
| ARG2_FCT (hypot, 1.5); | |
| ARG1_FCT (cbrt); | |
| ARG2_FCTPINT (frexp); | |
| ARG2_FCTINT (ldexp); | |
| ARG1_FCT (ilogb); | |
| ARG2_FCTINT (scalbn); | |
| ARG2_FCTINT (scalbln); | |
| ARG3_FCT (fma, 2.0, 1.5); | |
| printf ("%g is%s nan\n", (double) in1, isnan (in1) ? "" :" not"); | |
| printf ("%g is%s inf\n", (double) in1, isinf (in1) ? "" :" not"); | |
| __mingw_printf ("Ld:%Lg d:%g f:%g\n", ld1, ld2, (double) ld3); | |
| return 0; | |
| } |