1 /*
2 * this file contains misc bug reports from WinBond.
3 */
4 #include <stdio.h>
5 #include <math.h>
6
7 #if unix
8 #define pass(x) printf("PASS: %s\n", x);
9 #define fail(x) printf("FAIL: %s\n", x);
10 #endif
11
12 /*
13 The compare operation is error. Because the constant value 1.0 is
14 not correct. It seems compare with 0 in this statement.
15
16 HP-UX native:
17 dist is 0.301
18 PASS: float compare
19 *cp = be9a1cac, *cp1 = be9a1cac
20 PASS: float multiple 1
21 PASS: float multiple 2
22 32760 / (-2) = -16380
23 PASS: float divide 1
24 32760 / (-1) = -32760
25 PASS: float divide 1
26 These test only pass if the output matches:
27 Correct output is
28 1.0 = 1.000000E+00, 0.3010 = 3.000000E-01, -1.0 = -1.000000E+0
29 1.0 = 1.000000E+00, 0.3010 = 3.010000E-01, -1.0 = -1.000000E+00
30 These test only pass if the outut matches:
31 Correct output is
32 ans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00
33 ans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00
34
35
36 Test run on Oki:
37
38 dist is 0
39 PASS: float compare
40 *cp = be9a1cac, *cp1 = be9a1cac
41 PASS: float multiple 1
42 PASS: float multiple 2
43 32760 / (-2) = -2147467268
44 PASS: float divide 1
45 32760 / (-1) = 32760
46 PASS: float divide 1
47 These test only pass if the output matches:
48 Correct output is
49 1.0 = 1.000000E+00, 0.3010 = 3.000000E-01, -1.0 = -1.000000E+0
50 1.0 = 1.586860E-318, 0.3010 = -1.009091E-303, -1.0 = 5.290504E-315
51 These test only pass if the outut matches:
52 Correct output is
53 ans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00
54 ans = 4.940656E-324, ans1 = -5.299809E-315, ans2 = 5.290504E-315
55
56 */
57
main()58 main()
59 {
60 float dist = 0.3010;
61
62 printf ("dist is %G\n", dist);
63 if ( dist < 1.0 ) {
64 pass ("float compare");
65 } else {
66 fail ("float compare");
67 }
68
69 test_1();
70 test_2();
71 test_3();
72 test_4();
73
74 fflush (stdout);
75 }
76
77 /*
78 * *cp = be9a1cac, *cp1 = 00000000
79 */
test_1()80 test_1()
81 {
82 float i, ans, ans1;
83 unsigned int *cp=&ans, *cp1=&ans1;
84
85 i = 0.3010;
86 ans = (-1.0) * 0.3010 * 1.0; /* OK */
87 ans1 = (-1.0) * i * 1.0; /* Disaster */
88 printf ("*cp = %08x, *cp1 = %08x\n", *cp, *cp1);
89
90 if (*cp != 0xbe9a1cac) {
91 fail ("float multiple 1");
92 } else {
93 pass ("float multiple 1");
94 }
95
96 if (*cp1 != 0xbe9a1cac) {
97 fail ("float multiple 2");
98 } else {
99 pass ("float multiple 2");
100 }
101 }
102
103 /*
104 Positive integer divide Negative integer may get interesting result.
105 For examples:
106 EX1: 32760 / (-2) = -2147467268
107 */
test_2()108 test_2()
109 {
110 int value, i, j;
111
112 i = 32760;
113 j = -2;
114 value = i / (j);
115 printf ("%d / (%d) = %d\n", i, j, value);
116
117 if (value != -16380) {
118 fail ("float divide 1");
119 } else {
120 pass ("float divide 1");
121 }
122 }
123
124 /*
125 EX2: 32760 / (-1) = 32760
126 */
test_3()127 test_3()
128 {
129 int value, i, j;
130
131 i = 32760;
132 j = -1;
133 value = i / (j);
134 printf ("%d / (%d) = %d\n", i, j, value);
135
136 if (value != -32760) {
137 fail ("float divide 1");
138 } else {
139 pass ("float divide 1");
140 }
141 }
142
143 /*
144 The data output format %e, %E, %g, %G in printf() can not work.
145 Please test the following example:
146
147 1.0 = 1.000000E+00, 0.3010 = 3.009999E-01, -1.0 = -1.000000E+00
148 ans = 4.940656E-324, ans1 = -5.299809E-315, ans2 = 5.290504E-315
149 */
test_4()150 test_4()
151 {
152 float ans, ans1, ans2;
153
154 ans = 1.0;
155 ans1 = 0.3010;
156 ans2 = -1.0;
157
158 printf ("These test only pass if the output matches:\nCorrect output is\n1.0 = 1.000000E+00, 0.3010 = 3.000000E-01, -1.0 = -1.000000E+0\n");
159 printf ("1.0 = %E, 0.3010 = %E, -1.0 = %E\n", 1.0, 0.3010, -1.0);
160 printf ("These test only pass if the outut matches:\nCorrect output is\nans = 1.000000E+00, ans1 = 3.010000E-01, ans2 = -1.000000E+00\n");
161 printf ("ans = %E, ans1 = %E, ans2 = %E\n", ans, ans1, ans2);
162 }
163
164
165
166
167
168