Commit | Line | Data |
b3abae2a |
1 | #!/usr/bin/perl -w |
2 | |
13a12e00 |
3 | # test inf/NaN handling all in one place |
4 | # Thanx to Jarkko for the excellent explanations and the tables |
5 | |
b3abae2a |
6 | use Test; |
7 | use strict; |
8 | |
9 | BEGIN |
10 | { |
13a12e00 |
11 | $| = 1; # 7 values 6 groups 4 oprators 2 classes |
12 | plan tests => 7 * 6 * 4 * 2; |
b3abae2a |
13 | chdir 't' if -d 't'; |
14 | unshift @INC, '../lib'; |
15 | } |
16 | |
17 | use Math::BigInt; |
13a12e00 |
18 | use Math::BigFloat; |
b3abae2a |
19 | |
20 | my (@args,$x,$y,$z); |
21 | |
22 | # + |
23 | foreach (qw/ |
24 | -inf:-inf:-inf |
25 | -1:-inf:-inf |
26 | -0:-inf:-inf |
27 | 0:-inf:-inf |
28 | 1:-inf:-inf |
29 | inf:-inf:NaN |
30 | NaN:-inf:NaN |
31 | |
32 | -inf:-1:-inf |
33 | -1:-1:-2 |
34 | -0:-1:-1 |
35 | 0:-1:-1 |
36 | 1:-1:0 |
37 | inf:-1:inf |
38 | NaN:-1:NaN |
39 | |
40 | -inf:0:-inf |
41 | -1:0:-1 |
42 | -0:0:0 |
43 | 0:0:0 |
44 | 1:0:1 |
45 | inf:0:inf |
46 | NaN:0:NaN |
47 | |
48 | -inf:1:-inf |
49 | -1:1:0 |
50 | -0:1:1 |
51 | 0:1:1 |
52 | 1:1:2 |
53 | inf:1:inf |
54 | NaN:1:NaN |
55 | |
56 | -inf:inf:NaN |
57 | -1:inf:inf |
58 | -0:inf:inf |
59 | 0:inf:inf |
60 | 1:inf:inf |
61 | inf:inf:inf |
62 | NaN:inf:NaN |
63 | |
64 | -inf:NaN:NaN |
65 | -1:NaN:NaN |
66 | -0:NaN:NaN |
67 | 0:NaN:NaN |
68 | 1:NaN:NaN |
69 | inf:NaN:NaN |
70 | NaN:NaN:NaN |
71 | /) |
72 | { |
73 | @args = split /:/,$_; |
13a12e00 |
74 | for my $class (qw/Math::BigInt Math::BigFloat/) |
75 | { |
76 | $x = $class->new($args[0]); |
77 | $y = $class->new($args[1]); |
78 | $args[2] = '0' if $args[2] eq '-0'; # BigInt/Float hasn't got -0 |
79 | print "# $class $args[0] + $args[1] should be $args[2] but is $x\n", |
80 | if !ok ($x->badd($y)->bstr(),$args[2]); |
81 | } |
b3abae2a |
82 | } |
83 | |
84 | # - |
85 | foreach (qw/ |
86 | -inf:-inf:NaN |
87 | -1:-inf:inf |
88 | -0:-inf:inf |
89 | 0:-inf:inf |
90 | 1:-inf:inf |
91 | inf:-inf:inf |
92 | NaN:-inf:NaN |
93 | |
94 | -inf:-1:-inf |
95 | -1:-1:0 |
96 | -0:-1:1 |
97 | 0:-1:1 |
98 | 1:-1:2 |
99 | inf:-1:inf |
100 | NaN:-1:NaN |
101 | |
102 | -inf:0:-inf |
103 | -1:0:-1 |
104 | -0:0:-0 |
105 | 0:0:0 |
106 | 1:0:1 |
107 | inf:0:inf |
108 | NaN:0:NaN |
109 | |
110 | -inf:1:-inf |
111 | -1:1:-2 |
112 | -0:1:-1 |
113 | 0:1:-1 |
114 | 1:1:0 |
115 | inf:1:inf |
116 | NaN:1:NaN |
117 | |
118 | -inf:inf:-inf |
119 | -1:inf:-inf |
120 | -0:inf:-inf |
121 | 0:inf:-inf |
122 | 1:inf:-inf |
123 | inf:inf:NaN |
124 | NaN:inf:NaN |
125 | |
126 | -inf:NaN:NaN |
127 | -1:NaN:NaN |
128 | -0:NaN:NaN |
129 | 0:NaN:NaN |
130 | 1:NaN:NaN |
131 | inf:NaN:NaN |
132 | NaN:NaN:NaN |
133 | /) |
134 | { |
135 | @args = split /:/,$_; |
13a12e00 |
136 | for my $class (qw/Math::BigInt Math::BigFloat/) |
137 | { |
138 | $x = $class->new($args[0]); |
139 | $y = $class->new($args[1]); |
140 | $args[2] = '0' if $args[2] eq '-0'; # BigInt/Float hasn't got -0 |
141 | print "# $class $args[0] - $args[1] should be $args[2] but is $x\n" |
142 | if !ok ($x->bsub($y)->bstr(),$args[2]); |
143 | } |
b3abae2a |
144 | } |
145 | |
146 | # * |
147 | foreach (qw/ |
148 | -inf:-inf:inf |
149 | -1:-inf:inf |
150 | -0:-inf:NaN |
151 | 0:-inf:NaN |
152 | 1:-inf:-inf |
153 | inf:-inf:-inf |
154 | NaN:-inf:NaN |
155 | |
156 | -inf:-1:inf |
157 | -1:-1:1 |
158 | -0:-1:0 |
159 | 0:-1:-0 |
160 | 1:-1:-1 |
161 | inf:-1:-inf |
162 | NaN:-1:NaN |
163 | |
164 | -inf:0:NaN |
165 | -1:0:-0 |
166 | -0:0:-0 |
167 | 0:0:0 |
168 | 1:0:0 |
169 | inf:0:NaN |
170 | NaN:0:NaN |
171 | |
172 | -inf:1:-inf |
173 | -1:1:-1 |
174 | -0:1:-0 |
175 | 0:1:0 |
176 | 1:1:1 |
177 | inf:1:inf |
178 | NaN:1:NaN |
179 | |
180 | -inf:inf:-inf |
181 | -1:inf:-inf |
182 | -0:inf:NaN |
183 | 0:inf:NaN |
184 | 1:inf:inf |
185 | inf:inf:inf |
186 | NaN:inf:NaN |
187 | |
188 | -inf:NaN:NaN |
189 | -1:NaN:NaN |
190 | -0:NaN:NaN |
191 | 0:NaN:NaN |
192 | 1:NaN:NaN |
193 | inf:NaN:NaN |
194 | NaN:NaN:NaN |
195 | /) |
196 | { |
197 | @args = split /:/,$_; |
13a12e00 |
198 | for my $class (qw/Math::BigInt Math::BigFloat/) |
199 | { |
200 | $x = $class->new($args[0]); |
201 | $y = $class->new($args[1]); |
202 | $args[2] = '0' if $args[2] eq '-0'; # BigInt/Float hasn't got -0 |
203 | $args[2] = '0' if $args[2] eq '-0'; # BigInt hasn't got -0 |
204 | print "# $class $args[0] * $args[1] should be $args[2] but is $x\n" |
205 | if !ok ($x->bmul($y)->bstr(),$args[2]); |
206 | } |
b3abae2a |
207 | } |
208 | |
209 | # / |
210 | foreach (qw/ |
211 | -inf:-inf:NaN |
212 | -1:-inf:0 |
213 | -0:-inf:0 |
214 | 0:-inf:-0 |
215 | 1:-inf:-0 |
216 | inf:-inf:NaN |
217 | NaN:-inf:NaN |
218 | |
219 | -inf:-1:inf |
220 | -1:-1:1 |
221 | -0:-1:0 |
222 | 0:-1:-0 |
223 | 1:-1:-1 |
224 | inf:-1:-inf |
225 | NaN:-1:NaN |
226 | |
227 | -inf:0:-inf |
228 | -1:0:-inf |
229 | -0:0:NaN |
230 | 0:0:NaN |
231 | 1:0:inf |
232 | inf:0:inf |
233 | NaN:0:NaN |
234 | |
235 | -inf:1:-inf |
236 | -1:1:-1 |
237 | -0:1:-0 |
238 | 0:1:0 |
239 | 1:1:1 |
240 | inf:1:inf |
241 | NaN:1:NaN |
242 | |
243 | -inf:inf:NaN |
244 | -1:inf:-0 |
245 | -0:inf:-0 |
246 | 0:inf:0 |
247 | 1:inf:0 |
248 | inf:inf:NaN |
249 | NaN:inf:NaN |
250 | |
251 | -inf:NaN:NaN |
252 | -1:NaN:NaN |
253 | -0:NaN:NaN |
254 | 0:NaN:NaN |
255 | 1:NaN:NaN |
256 | inf:NaN:NaN |
257 | NaN:NaN:NaN |
258 | /) |
259 | { |
260 | @args = split /:/,$_; |
13a12e00 |
261 | for my $class (qw/Math::BigInt Math::BigFloat/) |
262 | { |
263 | $x = $class->new($args[0]); |
264 | $y = $class->new($args[1]); |
265 | $args[2] = '0' if $args[2] eq '-0'; # BigInt/Float hasn't got -0 |
266 | print "# $class $args[0] / $args[1] should be $args[2] but is $x\n" |
267 | if !ok ($x->bdiv($y)->bstr(),$args[2]); |
268 | } |
b3abae2a |
269 | } |
270 | |