| #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; |
| } |