add math/modf benchmark
[libc-test] / src / math / modf.c
1 #include <stdio.h>
2 #include <math.h>
3 #include "test.h"
4
5 static struct {
6         double x;
7         double yf;
8         double yi;
9 } t[] = {
10         0.7, 0x1.6666666666666p-1, 0.0,
11         -0.7, -0x1.6666666666666p-1, -0.0,
12         1.7, 0x1.6666666666666p-1, 1.0,
13         -1.7, -0x1.6666666666666p-1, -1.0,
14         2.0, 0.0, 2.0,
15         -2.0, -0.0, -2.0,
16         -0x1p99, -0.0, -0x1p99,
17         -0.0, -0.0, -0.0,
18         INFINITY, 0.0, INFINITY,
19         -INFINITY, -0.0, -INFINITY,
20         NAN, NAN, NAN,
21 };
22
23 static struct {
24         float x;
25         float yf;
26         float yi;
27 } tf[] = {
28         0.7, 0x1.666666p-1, 0.0,
29         -0.7, -0x1.666666p-1, -0.0,
30         1.7, 0x1.666668p-1, 1.0,
31         -1.7, -0x1.666668p-1, -1.0,
32         2.0, 0.0, 2.0,
33         -2.0, -0.0, -2.0,
34         -0x1p99, -0.0, -0x1p99,
35         -0.0, -0.0, -0.0,
36         INFINITY, 0.0, INFINITY,
37         -INFINITY, -0.0, -INFINITY,
38         NAN, NAN, NAN,
39 };
40
41 static struct {
42         long double x;
43         long double yf;
44         long double yi;
45 } tl[] = {
46         0.7L, 0x1.6666666666666666p-1L, 0.0,
47         -0.7L, -0x1.6666666666666666p-1L, -0.0,
48         1.7L, 0x1.6666666666666668p-1L, 1.0,
49         -1.7L, -0x1.6666666666666668p-1L, -1.0,
50         2.0, 0, 2.0,
51         -2.0, -0.0, -2.0,
52         -0x1p99, -0.0, -0x1p99,
53         -0.0, -0.0, -0.0,
54         INFINITY, 0.0, INFINITY,
55         -INFINITY, -0.0, -INFINITY,
56         NAN, NAN, NAN,
57 };
58
59 #define eq(a, b) (isnan(a) && isnan(b) || ((a) == (b) && signbit(a) == signbit(b)))
60
61 void test_modf()
62 {
63         double yf, yi;
64         int i;
65         for (i = 0; i < sizeof t/sizeof *t; i++) {
66                 yf = modf(t[i].x, &yi);
67                 if (!eq(yf,t[i].yf) || !eq(yi,t[i].yi))
68                         error("modf(%a) want %a %a got %a %a\n", t[i].x, t[i].yf, t[i].yi, yf, yi);
69         }
70 }
71 void test_modff()
72 {
73         float yf, yi;
74         int i;
75         for (i = 0; i < sizeof tf/sizeof *tf; i++) {
76                 yf = modff(tf[i].x, &yi);
77                 if (!eq(yf,tf[i].yf) || !eq(yi,tf[i].yi))
78                         error("modff(%a) want %a %a got %a %a\n", tf[i].x, tf[i].yf, tf[i].yi, yf, yi);
79         }
80 }
81 void test_modfl()
82 {
83         long double yf, yi;
84         int i;
85         for (i = 0; i < sizeof tl/sizeof *tl; i++) {
86                 yf = modfl(tl[i].x, &yi);
87                 if (!eq(yf,tl[i].yf) || !eq(yi,tl[i].yi))
88                         error("modfl(%La) want %La %La got %La %La\n", tl[i].x, tl[i].yf, tl[i].yi, yf, yi);
89         }
90 }
91
92 void bench_modf_small(int N)
93 {
94         int i;
95         volatile double yf, yi;
96
97         for (i = 0; i < N; i++)
98                 yf = modf(1234.5678, &yi);
99 }
100
101 void bench_modf_large(int N)
102 {
103         int i;
104         volatile double yf, yi;
105
106         for (i = 0; i < N; i++)
107                 yf = modf(1.2345678e300, &yi);
108 }