Re: FreeBSD 4.6 imminent
[p5sagit/p5-mst-13.2.git] / lib / Math / BigInt / t / inf_nan.t
CommitLineData
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 6use Test;
7use strict;
8
9BEGIN
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
17use Math::BigInt;
13a12e00 18use Math::BigFloat;
b3abae2a 19
20my (@args,$x,$y,$z);
21
22# +
23foreach (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# -
85foreach (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# *
147foreach (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# /
210foreach (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