• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <math.h>
2 #include <stdio.h>
3 #include <inttypes.h>
4 
5 volatile long double in1 = -1.0L / 0.0L;
6 volatile long double in2 = 1.0L / 0.0L;
7 
8 volatile long double ld1 = 3.51L;
9 volatile double ld2 = 3.51;
10 volatile float ld3 = 3.51F;
11 
12 #define ARG1_FCT(NAME) \
13   do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1), \
14     (double) NAME (ld2), \
15     (double) NAME##f (ld3)); \
16 } while (0)
17 
18 #define ARG2_FCT(NAME,VAL) \
19   do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1, VAL##L), \
20     (double) NAME (ld2, VAL), \
21     (double) NAME##f (ld3, VAL##f)); \
22 } while (0)
23 
24 #define ARG3_FCT(NAME,VAL,VAL2) \
25   do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1, VAL##L, VAL2##L), \
26     (double) NAME (ld2, VAL, VAL2), \
27     (double) NAME##f (ld3, VAL##f, VAL2##f)); \
28 } while (0)
29 
30 #define ARG2_FCTINT(NAME) \
31   do {printf (#NAME ": %g %g %g\n", (double) NAME##l (ld1, 2), \
32     (double) NAME (ld2, 2), \
33     (double) NAME##f (ld3, 2)); \
34 } while (0)
35 
36 #define ARG2_FCTPINT(NAME) \
37   do { \
38    int i = 0; \
39    printf (#NAME ": %g", (double) NAME##l (ld1, &i)); \
40    printf ("=%d", i); \
41    printf (" %g", (double) NAME (ld2, &i)); \
42    printf ("=%d", i); \
43    printf (" %g", (double) NAME##f (ld3, &i)); \
44    printf ("=%d\n", i); \
45   } while(0)
46 
47 #ifdef __WIN64__
48 #define printfmt PRIu64
49 #else
50 #define printfmt PRIu32
51 #endif
52 
main()53 int main()
54 {
55   printf ("sizeof(float)=%"printfmt", sizeof(double)=%"printfmt", sizeof(long double)=%"printfmt"\n", sizeof (float), sizeof(double), sizeof(long double));
56   printf ("%g %g %g\n", (double) ld1, (double) ld2, (double) ld3);
57 
58   ARG1_FCT (sin);
59   ARG1_FCT (cos);
60   ARG1_FCT (tan);
61   ARG1_FCT (sinh);
62   ARG1_FCT (cosh);
63   ARG1_FCT (tanh);
64   ARG1_FCT (asin);
65   ARG1_FCT (acos);
66   ARG1_FCT (atan);
67   ARG2_FCT (atan2, 0.5);
68   ARG1_FCT (exp);
69   ARG1_FCT (exp2);
70   ARG2_FCT (pow, 2.0);
71   ARG1_FCT (sqrt);
72   ARG1_FCT (ceil);
73   ARG1_FCT (floor);
74   ARG1_FCT (fabs);
75   // double __cdecl ldexp(double _X,int _Y);
76   // double __cdecl frexp(double _X,int *_Y);
77   // double __cdecl modf(double _X,double *_Y);
78   ARG2_FCT(fmod, 2.5);
79   ARG1_FCT (log1p);
80   ARG1_FCT (log2);
81   ARG1_FCT (logb);
82   ARG1_FCT (tgamma);
83   ARG1_FCT (lgamma);
84   ARG1_FCT (erf);
85   ARG1_FCT (erfc);
86   ARG1_FCT (nearbyint);
87   ARG1_FCT (rint);
88   ARG1_FCT (lrint);
89   ARG1_FCT (llrint);
90   ARG1_FCT (lround);
91   ARG1_FCT (llround);
92 
93   ARG1_FCT (log);
94   ARG1_FCT (log10);
95   ARG1_FCT (round);
96   ARG1_FCT (trunc);
97   ARG2_FCT (remainder, 2.0);
98   ARG2_FCT (copysign, -1.0);
99   ARG2_FCT (nexttoward, 0.5);
100   ARG2_FCT (nexttoward, 0.5);
101   ARG2_FCT (fdim, 0.5);
102   ARG2_FCT (fmax, 0.5);
103   ARG2_FCT (fmin, 0.5);
104   ARG2_FCT (hypot, 1.5);
105   ARG1_FCT (cbrt);
106   ARG2_FCTPINT (frexp);
107   ARG2_FCTINT (ldexp);
108   ARG1_FCT (ilogb);
109   ARG2_FCTINT (scalbn);
110   ARG2_FCTINT (scalbln);
111   ARG3_FCT (fma, 2.0, 1.5);
112   printf ("%g is%s nan\n", (double) in1, isnan (in1) ? "" :" not");
113   printf ("%g is%s inf\n", (double) in1, isinf (in1) ? "" :" not");
114   __mingw_printf ("Ld:%Lg d:%g f:%g\n", ld1, ld2, (double) ld3);
115 
116   return 0;
117 }
118