1 /*
2 * Copyright 2005, Andrew Bachmann, andrewbachmann@myrealbox.com
3 * Distributed under the terms of the MIT License.
4 */
5
6
7 #include <OS.h>
8 #include <image.h>
9 #include <cmath>
10 #include <cassert>
11 #include <cstdio>
12 #include <cstring>
13
14 static image_id
get_libroot_id()15 get_libroot_id()
16 {
17 image_info info;
18 int32 cookie = 0;
19 while (get_next_image_info(0, &cookie, &info) == B_OK) {
20 if (strcmp(info.name, "/boot/beos/system/lib/libroot.so") == 0) {
21 return info.id;
22 }
23 }
24 return B_BAD_VALUE;
25 }
26
27
28 static double (*be_sin)(double);
29 static double (*be_cos)(double);
30 static double (*be_copysign)(double, double);
31 static double (*be_drem)(double, double);
32
33
34 int
main(int argc,char ** argv)35 main(int argc, char **argv)
36 {
37 image_id libroot = get_libroot_id();
38 assert(get_image_symbol(libroot, "sin", B_SYMBOL_TYPE_TEXT, (void**)&be_sin) == B_OK);
39 assert(get_image_symbol(libroot, "cos", B_SYMBOL_TYPE_TEXT, (void**)&be_cos) == B_OK);
40 assert(get_image_symbol(libroot, "copysign", B_SYMBOL_TYPE_TEXT, (void**)&be_copysign) == B_OK);
41 assert(get_image_symbol(libroot, "drem", B_SYMBOL_TYPE_TEXT, (void**)&be_drem) == B_OK);
42
43 status_t result = B_OK;
44
45 // test cos2 + sin2 = 1
46 fprintf(stdout, "value\tsin2()+cos2()\n");
47 for (int i = -63 ; i <= 63 ; i++) {
48 double f = (double)i/7.0;
49 double x = sin(f);
50 double y = cos(f);
51 if (fabs(x*x + y*y - 1.0) > 0.000001) {
52 fprintf(stdout, "%0.3f\t%0.10f", f, x*x + y*y);
53 fprintf(stdout, " **");
54 fprintf(stdout, "\n");
55 result = B_ERROR;
56 }
57 }
58 fprintf(stdout, "\n");
59
60 // test sin
61 fprintf(stdout, "value\tsin(value)\tbe_sin(value)\n");
62 for (int i = -63 ; i <= 63 ; i++) {
63 double f = (double)i/7.0;
64 double x = sin(f);
65 double y = be_sin(f);
66 if (fabs(x - y) > 0.000001) {
67 fprintf(stdout, "%0.3f\t%0.10f\t%0.10f", f, x, y);
68 fprintf(stdout, " **");
69 fprintf(stdout, "\n");
70 result = B_ERROR;
71 }
72 }
73 fprintf(stdout, "\n");
74
75 fprintf(stdout, "value\tcos(value)\tbe_cos(value)\n");
76 // test cos
77 for (int i = -63 ; i <= 63 ; i++) {
78 double f = (double)i/7.0;
79 double x = cos(f);
80 double y = be_cos(f);
81 if (fabs(x - y) > 0.000001) {
82 fprintf(stdout, "%0.3f\t%0.10f\t%0.10f", f, x, y);
83 fprintf(stdout, " **");
84 fprintf(stdout, "\n");
85 result = B_ERROR;
86 }
87 }
88 fprintf(stdout, "\n");
89
90 fprintf(stdout, "arg1\targ2\tcopysign()\tbe_copysign()\n");
91 // test copysign
92 for (int i = -21 ; i <= 21 ; i++) {
93 for (int j = -36 ; j <= 36 ; j++) {
94 double f = (double)i/3.0;
95 double g = (double)j/4.0;
96 double x = copysign(f, g);
97 double y = be_copysign(f, g);
98 if ((x != y) && !(std::isnan(x) && std::isnan(y))) {
99 fprintf(stdout, "%0.1f\t%0.1f\t%0.6f\t%0.6f", f, g, x, y);
100 fprintf(stdout, " **");
101 fprintf(stdout, "\n");
102 result = B_ERROR;
103 }
104 }
105 }
106 fprintf(stdout, "\n");
107
108 fprintf(stdout, "arg1\targ2\tdrem(values)\tbe_drem(values)\n");
109 // test drem
110 for (int i = -21 ; i <= 21 ; i++) {
111 for (int j = -36 ; j <= 36 ; j++) {
112 double f = (double)i/3.0;
113 double g = (double)j/4.0;
114 double x = drem(f, g);
115 double y = be_drem(f, g);
116 if ((x != y) && !(std::isnan(x) && std::isnan(y))) {
117 fprintf(stdout, "%0.2f\t%0.2f\t%0.10f\t%0.10f", f, g, x, y);
118 fprintf(stdout, " **");
119 fprintf(stdout, "\n");
120 result = B_ERROR;
121 }
122 }
123 }
124 fprintf(stdout, "\n");
125
126 fprintf(stdout, "result = %s\n", (result == B_OK ? "OK" : "ERROR"));
127 return result;
128 }
129