Upgrade to Math::BigInt 1.60.
[p5sagit/p5-mst-13.2.git] / lib / Math / BigInt / t / bigfltpm.inc
1 #include this file into another test for subclass testing...
2
3 ok ($class->config()->{lib},$CL);
4
5 while (<DATA>)
6   {
7   chomp;
8   $_ =~ s/#.*$//;       # remove comments
9   $_ =~ s/\s+$//;       # trailing spaces
10   next if /^$/;         # skip empty lines & comments
11   if (s/^&//)
12     {
13     $f = $_;
14     }
15   elsif (/^\$/)
16     {
17     $setup = $_; $setup =~ s/\$/\$${class}::/g; # round_mode, div_scale
18     #print "\$setup== $setup\n";
19     }
20   else
21     {
22     if (m|^(.*?):(/.+)$|)
23       {
24       $ans = $2;
25       @args = split(/:/,$1,99);
26       }
27     else
28       {
29       @args = split(/:/,$_,99); $ans = pop(@args);
30       }
31     $try = "\$x = new $class \"$args[0]\";";
32     if ($f eq "fnorm")
33       {
34         $try .= "\$x;";
35       } elsif ($f eq "finf") {
36         $try .= "\$x->finf('$args[1]');";
37       } elsif ($f eq "is_inf") {
38         $try .= "\$x->is_inf('$args[1]');"; 
39       } elsif ($f eq "fone") {
40         $try .= "\$x->bone('$args[1]');";
41       } elsif ($f eq "fstr") {
42         $try .= "\$x->accuracy($args[1]); \$x->precision($args[2]);";
43         $try .= '$x->fstr();';
44       } elsif ($f eq "parts") {
45         # ->bstr() to see if an object is returned
46         $try .= '($a,$b) = $x->parts(); $a = $a->bstr(); $b = $b->bstr();';
47         $try .= '"$a $b";';
48       } elsif ($f eq "exponent") {
49         # ->bstr() to see if an object is returned
50         $try .= '$x->exponent()->bstr();';
51       } elsif ($f eq "mantissa") {
52         # ->bstr() to see if an object is returned
53         $try .= '$x->mantissa()->bstr();';
54       } elsif ($f eq "numify") {
55         $try .= "\$x->numify();";
56       } elsif ($f eq "length") {
57         $try .= "\$x->length();";
58       # some unary ops (test the fxxx form, since that is done by AUTOLOAD)
59       } elsif ($f =~ /^f(nan|sstr|neg|floor|ceil|abs)$/) {
60         $try .= "\$x->f$1();";
61       # some is_xxx test function       
62       } elsif ($f =~ /^is_(zero|one|negative|positive|odd|even|nan|int)$/) {
63         $try .= "\$x->$f();";
64       } elsif ($f eq "as_number") {
65         $try .= '$x->as_number();';
66       } elsif ($f eq "finc") {
67         $try .= '++$x;';
68       } elsif ($f eq "fdec") {
69         $try .= '--$x;';
70       }elsif ($f eq "fround") {
71         $try .= "$setup; \$x->fround($args[1]);";
72       } elsif ($f eq "ffround") {
73         $try .= "$setup; \$x->ffround($args[1]);";
74       } elsif ($f eq "fsqrt") {
75         $try .= "$setup; \$x->fsqrt();";
76       } elsif ($f eq "flog") {
77         $try .= "$setup; \$x->flog();";
78       } elsif ($f eq "ffac") {
79         $try .= "$setup; \$x->ffac();";
80       }
81     else
82       {
83       $try .= "\$y = new $class \"$args[1]\";";
84       if ($f eq "fcmp") {
85         $try .= '$x <=> $y;';
86       } elsif ($f eq "facmp") {
87         $try .= '$x->facmp($y);';
88       } elsif ($f eq "fpow") {
89         $try .= '$x ** $y;';
90       } elsif ($f eq "fadd") {
91         $try .= '$x + $y;';
92       } elsif ($f eq "fsub") {
93         $try .= '$x - $y;';
94       } elsif ($f eq "fmul") {
95         $try .= '$x * $y;';
96       } elsif ($f eq "fdiv") {
97         $try .= "$setup; \$x / \$y;";
98       } elsif ($f eq "fdiv-list") {
99         $try .= "$setup; join(',',\$x->fdiv(\$y));";
100       } elsif ($f eq "frsft") {
101         $try .= '$x >> $y;';
102       } elsif ($f eq "flsft") {
103         $try .= '$x << $y;';
104       } elsif ($f eq "fmod") {
105         $try .= '$x % $y;';
106       } else { warn "Unknown op '$f'"; }
107     }
108     # print "# Trying: '$try'\n";
109     $ans1 = eval $try;
110     if ($ans =~ m|^/(.*)$|)
111       {
112       my $pat = $1;
113       if ($ans1 =~ /$pat/)
114         {
115         ok (1,1);
116         }
117       else
118         {
119         print "# '$try' expected: /$pat/ got: '$ans1'\n" if !ok(1,0);
120         }
121       }
122     else
123       {
124       if ($ans eq "")
125         {
126         ok_undef ($ans1);
127         }
128       else
129         {
130         print "# Tried: '$try'\n" if !ok ($ans1, $ans);
131         if (ref($ans1) eq "$class")
132           {
133           # float numbers are normalized (for now), so mantissa shouldn't have
134           # trailing zeros
135           #print $ans1->_trailing_zeros(),"\n";
136           print "# Has trailing zeros after '$try'\n"
137            if !ok ($ans1->{_m}->_trailing_zeros(), 0);
138           }
139         }
140       } # end pattern or string
141     }
142   } # end while
143
144 # check whether $class->new( Math::BigInt->new()) destroys it 
145 # ($y == 12 in this case)
146 $x = Math::BigInt->new(1200); $y = $class->new($x);
147 ok ($y,1200); ok ($x,1200);
148
149 ###############################################################################
150 # Really huge, big, ultra-mega-biggy-monster exponents
151 # Technically, the exponents should not be limited (they are BigInts), but
152 # practically there are a few places were they are limited to a Perl scalar.
153 # This is sometimes for speed, sometimes because otherwise the number wouldn't
154 # fit into your memory (just think of 1e123456789012345678901234567890 + 1!)
155 # anyway. We don't test everything here, but let's make sure it just basically
156 # works.
157
158 my $monster = '1e1234567890123456789012345678901234567890';
159
160 # new
161 ok ($class->new($monster)->bsstr(),
162                 '1e+1234567890123456789012345678901234567890');
163 # cmp
164 ok ($class->new($monster) > 0,1);
165
166 # sub/mul 
167 ok ($class->new($monster)->bsub( $monster),0);
168 ok ($class->new($monster)->bmul(2)->bsstr(),
169                 '2e+1234567890123456789012345678901234567890');
170
171 ###############################################################################
172 # zero,inf,one,nan
173
174 $x = $class->new(2); $x->fzero(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
175 $x = $class->new(2); $x->finf();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
176 $x = $class->new(2); $x->fone();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
177 $x = $class->new(2); $x->fnan();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
178
179 ###############################################################################
180 # bone/binf etc as plain calls (Lite failed them)
181
182 ok ($class->fzero(),0);
183 ok ($class->fone(),1);
184 ok ($class->fone('+'),1);
185 ok ($class->fone('-'),-1);
186 ok ($class->fnan(),'NaN');
187 ok ($class->finf(),'inf');
188 ok ($class->finf('+'),'inf');
189 ok ($class->finf('-'),'-inf');
190 ok ($class->finf('-inf'),'-inf');
191         
192 ###############################################################################
193 # fsqrt() with set global A/P or A/P enabled on $x, also a test whether fsqrt()
194 # correctly modifies $x
195
196 $class->accuracy(undef); $class->precision(undef);      # reset
197
198 $x = $class->new(12); $class->precision(-2); $x->fsqrt(); ok ($x,'3.46');
199
200 $class->precision(undef);
201 $x = $class->new(12); $class->precision(0); $x->fsqrt(); ok ($x,'3');
202
203 $class->precision(-3); $x = $class->new(12); $x->fsqrt(); ok ($x,'3.464');
204
205 # A and P set => NaN
206 ${${class}.'::accuracy'} = 4; $x = $class->new(12); $x->fsqrt(3); ok ($x,'NaN');
207 # supplied arg overrides set global
208 $class->precision(undef); $x = $class->new(12); $x->fsqrt(3); ok ($x,'3.46');
209
210 $class->accuracy(undef); $class->precision(undef); # reset for further tests
211
212 ###############################################################################
213 # can we call objectify (broken until v1.52)
214
215 $try = '@args' . " = $class" . "::objectify(2,$class,4,5);".'join(" ",@args);';
216 $ans = eval $try;
217 ok ($ans,"$class 4 5");
218
219 ###############################################################################
220 # test whether an opp calls objectify properly or not (or at least does what
221 # it should do given non-objects, w/ or w/o objectify())
222
223 ok ($class->new(123)->badd(123),246);
224 ok ($class->badd(123,321),444);
225 ok ($class->badd(123,$class->new(321)),444);
226
227 ok ($class->new(123)->bsub(122),1);
228 ok ($class->bsub(321,123),198);
229 ok ($class->bsub(321,$class->new(123)),198);
230
231 ok ($class->new(123)->bmul(123),15129);
232 ok ($class->bmul(123,123),15129);
233 ok ($class->bmul(123,$class->new(123)),15129);
234
235 ok ($class->new(15129)->bdiv(123),123);
236 ok ($class->bdiv(15129,123),123);
237 ok ($class->bdiv(15129,$class->new(123)),123);
238
239 ok ($class->new(15131)->bmod(123),2);
240 ok ($class->bmod(15131,123),2);
241 ok ($class->bmod(15131,$class->new(123)),2);
242
243 ok ($class->new(2)->bpow(16),65536);
244 ok ($class->bpow(2,16),65536);
245 ok ($class->bpow(2,$class->new(16)),65536);
246
247 ok ($class->new(2**15)->brsft(1),2**14);
248 ok ($class->brsft(2**15,1),2**14);
249 ok ($class->brsft(2**15,$class->new(1)),2**14);
250
251 ok ($class->new(2**13)->blsft(1),2**14);
252 ok ($class->blsft(2**13,1),2**14);
253 ok ($class->blsft(2**13,$class->new(1)),2**14);
254
255 1; # all done
256
257 ###############################################################################
258 # Perl 5.005 does not like ok ($x,undef)
259
260 sub ok_undef
261   {
262   my $x = shift;
263
264   ok (1,1) and return if !defined $x;
265   ok ($x,'undef');
266   }
267
268 __DATA__
269 $div_scale = 40;
270 &flog
271 0:NaN
272 -1:NaN
273 -2:NaN
274 1:0
275 # this is too slow for the testsuite
276 #2:0.6931471805599453094172321214581765680755
277 #2.718281828:0.9999999998311266953289851340574956564911
278 #$div_scale = 20;
279 #2.718281828:0.99999999983112669533
280 # too slow, too (or hangs?)
281 #123:4.8112184355
282 $div_scale = 14;
283 #10:0:2.302585092994
284 #1000:0:6.90775527898214
285 #100:0:4.60517018598809
286 2:0:0.69314718055995
287 #3.1415:0:1.14470039286086
288 #12345:0:9.42100640177928
289 #0.001:0:-6.90775527898214
290 # reset for further tests
291 $div_scale = 40;
292 1:0
293 &frsft
294 NaNfrsft:2:NaN
295 0:2:0
296 1:1:0.5
297 2:1:1
298 4:1:2
299 123:1:61.5
300 32:3:4
301 &flsft
302 NaNflsft:0:NaN
303 2:1:4
304 4:3:32
305 5:3:40
306 1:2:4
307 0:5:0
308 &fnorm
309 1:1
310 -0:0
311 fnormNaN:NaN
312 +inf:inf
313 -inf:-inf
314 123:123
315 -123.4567:-123.4567
316 # invalid inputs
317 1__2:NaN
318 1E1__2:NaN
319 11__2E2:NaN
320 #1.E3:NaN
321 .2E-3.:NaN
322 #1e3e4:NaN
323 .2E2:20
324 &as_number
325 0:0
326 1:1
327 1.2:1
328 2.345:2
329 -2:-2
330 -123.456:-123
331 -200:-200
332 &finf
333 1:+:inf
334 2:-:-inf
335 3:abc:inf
336 &numify
337 0:0e+1
338 +1:1e+0
339 1234:1234e+0
340 NaN:NaN
341 +inf:inf
342 -inf:-inf
343 &fnan
344 abc:NaN
345 2:NaN
346 -2:NaN
347 0:NaN
348 &fone
349 2:+:1
350 -2:-:-1
351 -2:+:1
352 2:-:-1
353 0::1
354 -2::1
355 abc::1
356 2:abc:1
357 &fsstr
358 +inf:inf
359 -inf:-inf
360 abcfsstr:NaN
361 1234.567:1234567e-3
362 &fstr
363 +inf:::inf
364 -inf:::-inf
365 abcfstr:::NaN
366 1234.567:9::1234.56700
367 1234.567::-6:1234.567000
368 12345:5::12345
369 0.001234:6::0.00123400
370 0.001234::-8:0.00123400
371 0:4::0
372 0::-4:0.0000
373 &fnorm
374 inf:inf
375 +inf:inf
376 -inf:-inf
377 +infinity:NaN
378 +-inf:NaN
379 abc:NaN
380    1 a:NaN
381 1bcd2:NaN
382 11111b:NaN
383 +1z:NaN
384 -1z:NaN
385 0:0
386 +0:0
387 +00:0
388 +0_0_0:0
389 000000_0000000_00000:0
390 -0:0
391 -0000:0
392 +1:1
393 +01:1
394 +001:1
395 +00000100000:100000
396 123456789:123456789
397 -1:-1
398 -01:-1
399 -001:-1
400 -123456789:-123456789
401 -00000100000:-100000
402 123.456a:NaN
403 123.456:123.456
404 0.01:0.01
405 .002:0.002
406 +.2:0.2
407 -0.0003:-0.0003
408 -.0000000004:-0.0000000004
409 123456E2:12345600
410 123456E-2:1234.56
411 -123456E2:-12345600
412 -123456E-2:-1234.56
413 1e1:10
414 2e-11:0.00000000002
415 # excercise _split
416   .02e-1:0.002
417    000001:1
418    -00001:-1
419    -1:-1
420   000.01:0.01
421    -000.0023:-0.0023
422   1.1e1:11
423 -3e111:-3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
424 -4e-1111:-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
425 &fpow
426 2:2:4
427 1:2:1
428 1:3:1
429 -1:2:1
430 -1:3:-1
431 123.456:2:15241.383936
432 2:-2:0.25
433 2:-3:0.125
434 128:-2:0.00006103515625
435 abc:123.456:NaN
436 123.456:abc:NaN
437 +inf:123.45:inf
438 -inf:123.45:-inf
439 +inf:-123.45:inf
440 -inf:-123.45:-inf
441 # 2 ** 0.5 == sqrt(2)
442 #     1.41..7 and not 1.4170 since fallback (bsqrt(9) is '3', not 3.0...0)
443 2:0.5:1.41421356237309504880168872420969807857
444 #2:0.2:1.148698354997035006798626946777927589444
445 #6:1.5:14.6969384566990685891837044482353483518
446 $div_scale = 20;
447 #62.5:12.5:26447206647554886213592.3959144
448 $div_scale = 40;
449 &fneg
450 fnegNaN:NaN
451 +inf:-inf
452 -inf:inf
453 +0:0
454 +1:-1
455 -1:1
456 +123456789:-123456789
457 -123456789:123456789
458 +123.456789:-123.456789
459 -123456.789:123456.789
460 &fabs
461 fabsNaN:NaN
462 +inf:inf
463 -inf:inf
464 +0:0
465 +1:1
466 -1:1
467 +123456789:123456789
468 -123456789:123456789
469 +123.456789:123.456789
470 -123456.789:123456.789
471 &fround
472 $round_mode = "trunc"
473 +inf:5:inf
474 -inf:5:-inf
475 0:5:0
476 NaNfround:5:NaN
477 +10123456789:5:10123000000
478 -10123456789:5:-10123000000
479 +10123456789.123:5:10123000000
480 -10123456789.123:5:-10123000000
481 +10123456789:9:10123456700
482 -10123456789:9:-10123456700
483 +101234500:6:101234000
484 -101234500:6:-101234000
485 $round_mode = "zero"
486 +20123456789:5:20123000000
487 -20123456789:5:-20123000000
488 +20123456789.123:5:20123000000
489 -20123456789.123:5:-20123000000
490 +20123456789:9:20123456800
491 -20123456789:9:-20123456800
492 +201234500:6:201234000
493 -201234500:6:-201234000
494 $round_mode = "+inf"
495 +30123456789:5:30123000000
496 -30123456789:5:-30123000000
497 +30123456789.123:5:30123000000
498 -30123456789.123:5:-30123000000
499 +30123456789:9:30123456800
500 -30123456789:9:-30123456800
501 +301234500:6:301235000
502 -301234500:6:-301234000
503 $round_mode = "-inf"
504 +40123456789:5:40123000000
505 -40123456789:5:-40123000000
506 +40123456789.123:5:40123000000
507 -40123456789.123:5:-40123000000
508 +40123456789:9:40123456800
509 -40123456789:9:-40123456800
510 +401234500:6:401234000
511 -401234500:6:-401235000
512 $round_mode = "odd"
513 +50123456789:5:50123000000
514 -50123456789:5:-50123000000
515 +50123456789.123:5:50123000000
516 -50123456789.123:5:-50123000000
517 +50123456789:9:50123456800
518 -50123456789:9:-50123456800
519 +501234500:6:501235000
520 -501234500:6:-501235000
521 $round_mode = "even"
522 +60123456789:5:60123000000
523 -60123456789:5:-60123000000
524 +60123456789:9:60123456800
525 -60123456789:9:-60123456800
526 +601234500:6:601234000
527 -601234500:6:-601234000
528 +60123456789.0123:5:60123000000
529 -60123456789.0123:5:-60123000000
530 &ffround
531 $round_mode = "trunc"
532 +inf:5:inf
533 -inf:5:-inf
534 0:5:0
535 NaNffround:5:NaN
536 +1.23:-1:1.2
537 +1.234:-1:1.2
538 +1.2345:-1:1.2
539 +1.23:-2:1.23
540 +1.234:-2:1.23
541 +1.2345:-2:1.23
542 +1.23:-3:1.230
543 +1.234:-3:1.234
544 +1.2345:-3:1.234
545 -1.23:-1:-1.2
546 +1.27:-1:1.2
547 -1.27:-1:-1.2
548 +1.25:-1:1.2
549 -1.25:-1:-1.2
550 +1.35:-1:1.3
551 -1.35:-1:-1.3
552 -0.0061234567890:-1:0.0
553 -0.0061:-1:0.0
554 -0.00612:-1:0.0
555 -0.00612:-2:0.00
556 -0.006:-1:0.0
557 -0.006:-2:0.00
558 -0.0006:-2:0.00
559 -0.0006:-3:0.000
560 -0.0065:-3:/-0\.006|-6e-03
561 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
562 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
563 0.05:0:0
564 0.5:0:0
565 0.51:0:0
566 0.41:0:0
567 $round_mode = "zero"
568 +2.23:-1:/2.2(?:0{5}\d+)?
569 -2.23:-1:/-2.2(?:0{5}\d+)?
570 +2.27:-1:/2.(?:3|29{5}\d+)
571 -2.27:-1:/-2.(?:3|29{5}\d+)
572 +2.25:-1:/2.2(?:0{5}\d+)?
573 -2.25:-1:/-2.2(?:0{5}\d+)?
574 +2.35:-1:/2.(?:3|29{5}\d+)
575 -2.35:-1:/-2.(?:3|29{5}\d+)
576 -0.0065:-1:0.0
577 -0.0065:-2:/-0\.01|-1e-02
578 -0.0065:-3:/-0\.006|-6e-03
579 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
580 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
581 0.05:0:0
582 0.5:0:0
583 0.51:0:1
584 0.41:0:0
585 $round_mode = "+inf"
586 +3.23:-1:/3.2(?:0{5}\d+)?
587 -3.23:-1:/-3.2(?:0{5}\d+)?
588 +3.27:-1:/3.(?:3|29{5}\d+)
589 -3.27:-1:/-3.(?:3|29{5}\d+)
590 +3.25:-1:/3.(?:3|29{5}\d+)
591 -3.25:-1:/-3.2(?:0{5}\d+)?
592 +3.35:-1:/3.(?:4|39{5}\d+)
593 -3.35:-1:/-3.(?:3|29{5}\d+)
594 -0.0065:-1:0.0
595 -0.0065:-2:/-0\.01|-1e-02
596 -0.0065:-3:/-0\.006|-6e-03
597 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
598 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
599 0.05:0:0
600 0.5:0:1
601 0.51:0:1
602 0.41:0:0
603 $round_mode = "-inf"
604 +4.23:-1:/4.2(?:0{5}\d+)?
605 -4.23:-1:/-4.2(?:0{5}\d+)?
606 +4.27:-1:/4.(?:3|29{5}\d+)
607 -4.27:-1:/-4.(?:3|29{5}\d+)
608 +4.25:-1:/4.2(?:0{5}\d+)?
609 -4.25:-1:/-4.(?:3|29{5}\d+)
610 +4.35:-1:/4.(?:3|29{5}\d+)
611 -4.35:-1:/-4.(?:4|39{5}\d+)
612 -0.0065:-1:0.0
613 -0.0065:-2:/-0\.01|-1e-02
614 -0.0065:-3:/-0\.007|-7e-03
615 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
616 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
617 0.05:0:0
618 0.5:0:0
619 0.51:0:1
620 0.41:0:0
621 $round_mode = "odd"
622 +5.23:-1:/5.2(?:0{5}\d+)?
623 -5.23:-1:/-5.2(?:0{5}\d+)?
624 +5.27:-1:/5.(?:3|29{5}\d+)
625 -5.27:-1:/-5.(?:3|29{5}\d+)
626 +5.25:-1:/5.(?:3|29{5}\d+)
627 -5.25:-1:/-5.(?:3|29{5}\d+)
628 +5.35:-1:/5.(?:3|29{5}\d+)
629 -5.35:-1:/-5.(?:3|29{5}\d+)
630 -0.0065:-1:0.0
631 -0.0065:-2:/-0\.01|-1e-02
632 -0.0065:-3:/-0\.007|-7e-03
633 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
634 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
635 0.05:0:0
636 0.5:0:1
637 0.51:0:1
638 0.41:0:0
639 $round_mode = "even"
640 +6.23:-1:/6.2(?:0{5}\d+)?
641 -6.23:-1:/-6.2(?:0{5}\d+)?
642 +6.27:-1:/6.(?:3|29{5}\d+)
643 -6.27:-1:/-6.(?:3|29{5}\d+)
644 +6.25:-1:/6.(?:2(?:0{5}\d+)?|29{5}\d+)
645 -6.25:-1:/-6.(?:2(?:0{5}\d+)?|29{5}\d+)
646 +6.35:-1:/6.(?:4|39{5}\d+|29{8}\d+)
647 -6.35:-1:/-6.(?:4|39{5}\d+|29{8}\d+)
648 -0.0065:-1:0.0
649 -0.0065:-2:/-0\.01|-1e-02
650 -0.0065:-3:/-0\.006|-7e-03
651 -0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
652 -0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
653 0.05:0:0
654 0.5:0:0
655 0.51:0:1
656 0.41:0:0
657 0.01234567:-3:0.012
658 0.01234567:-4:0.0123
659 0.01234567:-5:0.01235
660 0.01234567:-6:0.012346
661 0.01234567:-7:0.0123457
662 0.01234567:-8:0.01234567
663 0.01234567:-9:0.012345670
664 0.01234567:-12:0.012345670000
665 &fcmp
666 fcmpNaN:fcmpNaN:
667 fcmpNaN:+0:
668 +0:fcmpNaN:
669 +0:+0:0
670 -1:+0:-1
671 +0:-1:1
672 +1:+0:1
673 +0:+1:-1
674 -1:+1:-1
675 +1:-1:1
676 -1:-1:0
677 +1:+1:0
678 -1.1:0:-1
679 +0:-1.1:1
680 +1.1:+0:1
681 +0:+1.1:-1
682 +123:+123:0
683 +123:+12:1
684 +12:+123:-1
685 -123:-123:0
686 -123:-12:-1
687 -12:-123:1
688 +123:+124:-1
689 +124:+123:1
690 -123:-124:1
691 -124:-123:-1
692 0:0.01:-1
693 0:0.0001:-1
694 0:-0.0001:1
695 0:-0.1:1
696 0.1:0:1
697 0.00001:0:1
698 -0.0001:0:-1
699 -0.1:0:-1
700 0:0.0001234:-1
701 0:-0.0001234:1
702 0.0001234:0:1
703 -0.0001234:0:-1
704 0.0001:0.0005:-1
705 0.0005:0.0001:1
706 0.005:0.0001:1
707 0.001:0.0005:1
708 0.000001:0.0005:-1
709 0.00000123:0.0005:-1
710 0.00512:0.0001:1
711 0.005:0.000112:1
712 0.00123:0.0005:1
713 1.5:2:-1
714 2:1.5:1
715 1.54321:234:-1
716 234:1.54321:1
717 # infinity
718 -inf:5432112345:-1
719 +inf:5432112345:1
720 -inf:-5432112345:-1
721 +inf:-5432112345:1
722 -inf:54321.12345:-1
723 +inf:54321.12345:1
724 -inf:-54321.12345:-1
725 +inf:-54321.12345:1
726 +inf:+inf:0
727 -inf:-inf:0
728 +inf:-inf:1
729 -inf:+inf:-1
730 # return undef
731 +inf:NaN:
732 NaN:inf:
733 -inf:NaN:
734 NaN:-inf:
735 &facmp
736 fcmpNaN:fcmpNaN:
737 fcmpNaN:+0:
738 +0:fcmpNaN:
739 +0:+0:0
740 -1:+0:1
741 +0:-1:-1
742 +1:+0:1
743 +0:+1:-1
744 -1:+1:0
745 +1:-1:0
746 -1:-1:0
747 +1:+1:0
748 -1.1:0:1
749 +0:-1.1:-1
750 +1.1:+0:1
751 +0:+1.1:-1
752 +123:+123:0
753 +123:+12:1
754 +12:+123:-1
755 -123:-123:0
756 -123:-12:1
757 -12:-123:-1
758 +123:+124:-1
759 +124:+123:1
760 -123:-124:-1
761 -124:-123:1
762 0:0.01:-1
763 0:0.0001:-1
764 0:-0.0001:-1
765 0:-0.1:-1
766 0.1:0:1
767 0.00001:0:1
768 -0.0001:0:1
769 -0.1:0:1
770 0:0.0001234:-1
771 0:-0.0001234:-1
772 0.0001234:0:1
773 -0.0001234:0:1
774 0.0001:0.0005:-1
775 0.0005:0.0001:1
776 0.005:0.0001:1
777 0.001:0.0005:1
778 0.000001:0.0005:-1
779 0.00000123:0.0005:-1
780 0.00512:0.0001:1
781 0.005:0.000112:1
782 0.00123:0.0005:1
783 1.5:2:-1
784 2:1.5:1
785 1.54321:234:-1
786 234:1.54321:1
787 # infinity
788 -inf:5432112345:1
789 +inf:5432112345:1
790 -inf:-5432112345:1
791 +inf:-5432112345:1
792 -inf:54321.12345:1
793 +inf:54321.12345:1
794 -inf:-54321.12345:1
795 +inf:-54321.12345:1
796 +inf:+inf:0
797 -inf:-inf:0
798 +inf:-inf:0
799 -inf:+inf:0
800 5:inf:-1
801 -1:inf:-1
802 5:-inf:-1
803 -1:-inf:-1
804 # return undef
805 +inf:facmpNaN:
806 facmpNaN:inf:
807 -inf:facmpNaN:
808 facmpNaN:-inf:
809 &fdec
810 fdecNaN:NaN
811 +inf:inf
812 -inf:-inf
813 +0:-1
814 +1:0
815 -1:-2
816 1.23:0.23
817 -1.23:-2.23
818 100:99
819 101:100
820 -100:-101
821 -99:-100
822 -98:-99
823 99:98
824 &finc
825 fincNaN:NaN
826 +inf:inf
827 -inf:-inf
828 +0:1
829 +1:2
830 -1:0
831 1.23:2.23
832 -1.23:-0.23
833 100:101
834 -100:-99
835 -99:-98
836 -101:-100
837 99:100
838 &fadd
839 abc:abc:NaN
840 abc:+0:NaN
841 +0:abc:NaN
842 +inf:-inf:NaN
843 -inf:+inf:NaN
844 +inf:+inf:inf
845 -inf:-inf:-inf
846 baddNaN:+inf:NaN
847 baddNaN:+inf:NaN
848 +inf:baddNaN:NaN
849 -inf:baddNaN:NaN
850 +0:+0:0
851 +1:+0:1
852 +0:+1:1
853 +1:+1:2
854 -1:+0:-1
855 +0:-1:-1
856 -1:-1:-2
857 -1:+1:0
858 +1:-1:0
859 +9:+1:10
860 +99:+1:100
861 +999:+1:1000
862 +9999:+1:10000
863 +99999:+1:100000
864 +999999:+1:1000000
865 +9999999:+1:10000000
866 +99999999:+1:100000000
867 +999999999:+1:1000000000
868 +9999999999:+1:10000000000
869 +99999999999:+1:100000000000
870 +10:-1:9
871 +100:-1:99
872 +1000:-1:999
873 +10000:-1:9999
874 +100000:-1:99999
875 +1000000:-1:999999
876 +10000000:-1:9999999
877 +100000000:-1:99999999
878 +1000000000:-1:999999999
879 +10000000000:-1:9999999999
880 +123456789:+987654321:1111111110
881 -123456789:+987654321:864197532
882 -123456789:-987654321:-1111111110
883 +123456789:-987654321:-864197532
884 0.001234:0.0001234:0.0013574
885 &fsub
886 abc:abc:NaN
887 abc:+0:NaN
888 +0:abc:NaN
889 +inf:-inf:inf
890 -inf:+inf:-inf
891 +inf:+inf:NaN
892 -inf:-inf:NaN
893 baddNaN:+inf:NaN
894 baddNaN:+inf:NaN
895 +inf:baddNaN:NaN
896 -inf:baddNaN:NaN
897 +0:+0:0
898 +1:+0:1
899 +0:+1:-1
900 +1:+1:0
901 -1:+0:-1
902 +0:-1:1
903 -1:-1:0
904 -1:+1:-2
905 +1:-1:2
906 +9:+1:8
907 +99:+1:98
908 +999:+1:998
909 +9999:+1:9998
910 +99999:+1:99998
911 +999999:+1:999998
912 +9999999:+1:9999998
913 +99999999:+1:99999998
914 +999999999:+1:999999998
915 +9999999999:+1:9999999998
916 +99999999999:+1:99999999998
917 +10:-1:11
918 +100:-1:101
919 +1000:-1:1001
920 +10000:-1:10001
921 +100000:-1:100001
922 +1000000:-1:1000001
923 +10000000:-1:10000001
924 +100000000:-1:100000001
925 +1000000000:-1:1000000001
926 +10000000000:-1:10000000001
927 +123456789:+987654321:-864197532
928 -123456789:+987654321:-1111111110
929 -123456789:-987654321:864197532
930 +123456789:-987654321:1111111110
931 &fmul
932 abc:abc:NaN
933 abc:+0:NaN
934 +0:abc:NaN
935 +inf:NaNmul:NaN
936 +inf:NaNmul:NaN
937 NaNmul:+inf:NaN
938 NaNmul:-inf:NaN
939 +inf:+inf:inf
940 +inf:-inf:-inf
941 +inf:-inf:-inf
942 +inf:+inf:inf
943 +inf:123.34:inf
944 +inf:-123.34:-inf
945 -inf:123.34:-inf
946 -inf:-123.34:inf
947 123.34:+inf:inf
948 -123.34:+inf:-inf
949 123.34:-inf:-inf
950 -123.34:-inf:inf
951 +0:+0:0
952 +0:+1:0
953 +1:+0:0
954 +0:-1:0
955 -1:+0:0
956 +123456789123456789:+0:0
957 +0:+123456789123456789:0
958 -1:-1:1
959 -1:+1:-1
960 +1:-1:-1
961 +1:+1:1
962 +2:+3:6
963 -2:+3:-6
964 +2:-3:-6
965 -2:-3:6
966 +111:+111:12321
967 +10101:+10101:102030201
968 +1001001:+1001001:1002003002001
969 +100010001:+100010001:10002000300020001
970 +10000100001:+10000100001:100002000030000200001
971 +11111111111:+9:99999999999
972 +22222222222:+9:199999999998
973 +33333333333:+9:299999999997
974 +44444444444:+9:399999999996
975 +55555555555:+9:499999999995
976 +66666666666:+9:599999999994
977 +77777777777:+9:699999999993
978 +88888888888:+9:799999999992
979 +99999999999:+9:899999999991
980 6:120:720
981 10:10000:100000
982 &fdiv-list
983 0:0:NaN,NaN
984 0:1:0,0
985 9:4:2.25,1
986 9:5:1.8,4
987 &fdiv
988 $div_scale = 40; $round_mode = 'even'
989 abc:abc:NaN
990 abc:+1:abc:NaN
991 +1:abc:NaN
992 -1:abc:NaN
993 0:abc:NaN
994 +0:+0:NaN
995 +0:+1:0
996 +1:+0:inf
997 +3214:+0:inf
998 +0:-1:0
999 -1:+0:-inf
1000 -3214:+0:-inf
1001 +1:+1:1
1002 -1:-1:1
1003 +1:-1:-1
1004 -1:+1:-1
1005 +1:+2:0.5
1006 +2:+1:2
1007 123:+inf:0
1008 123:-inf:0
1009 +10:+5:2
1010 +100:+4:25
1011 +1000:+8:125
1012 +10000:+16:625
1013 +10000:-16:-625
1014 +999999999999:+9:111111111111
1015 +999999999999:+99:10101010101
1016 +999999999999:+999:1001001001
1017 +999999999999:+9999:100010001
1018 +999999999999999:+99999:10000100001
1019 +1000000000:+9:111111111.1111111111111111111111111111111
1020 +2000000000:+9:222222222.2222222222222222222222222222222
1021 +3000000000:+9:333333333.3333333333333333333333333333333
1022 +4000000000:+9:444444444.4444444444444444444444444444444
1023 +5000000000:+9:555555555.5555555555555555555555555555556
1024 +6000000000:+9:666666666.6666666666666666666666666666667
1025 +7000000000:+9:777777777.7777777777777777777777777777778
1026 +8000000000:+9:888888888.8888888888888888888888888888889
1027 +9000000000:+9:1000000000
1028 +35500000:+113:314159.2920353982300884955752212389380531
1029 +71000000:+226:314159.2920353982300884955752212389380531
1030 +106500000:+339:314159.2920353982300884955752212389380531
1031 +1000000000:+3:333333333.3333333333333333333333333333333
1032 2:25.024996000799840031993601279744051189762:0.07992009269196593320152084692285869265447
1033 123456:1:123456
1034 $div_scale = 20
1035 +1000000000:+9:111111111.11111111111
1036 +2000000000:+9:222222222.22222222222
1037 +3000000000:+9:333333333.33333333333
1038 +4000000000:+9:444444444.44444444444
1039 +5000000000:+9:555555555.55555555556
1040 +6000000000:+9:666666666.66666666667
1041 +7000000000:+9:777777777.77777777778
1042 +8000000000:+9:888888888.88888888889
1043 +9000000000:+9:1000000000
1044 1:10:0.1
1045 1:100:0.01
1046 1:1000:0.001
1047 1:10000:0.0001
1048 1:504:0.001984126984126984127
1049 2:1.987654321:1.0062111801179738436
1050 123456789.123456789123456789123456789:1:123456789.12345678912
1051 # the next two cases are the "old" behaviour, but are now (>v0.01) different
1052 #+35500000:+113:314159.292035398230088
1053 #+71000000:+226:314159.292035398230088
1054 +35500000:+113:314159.29203539823009
1055 +71000000:+226:314159.29203539823009
1056 +106500000:+339:314159.29203539823009
1057 +1000000000:+3:333333333.33333333333
1058 $div_scale = 1
1059 # round to accuracy 1 after bdiv
1060 +124:+3:40
1061 123456789.1234:1:100000000
1062 # reset scale for further tests
1063 $div_scale = 40
1064 &fmod
1065 +9:4:1
1066 +9:5:4
1067 +9000:56:40
1068 +56:9000:56
1069 # inf handling, see table in doc
1070 0:inf:0
1071 0:-inf:0
1072 5:inf:5
1073 5:-inf:5
1074 -5:inf:-5
1075 -5:-inf:-5
1076 inf:5:0
1077 -inf:5:0
1078 inf:-5:0
1079 -inf:-5:0
1080 5:5:0
1081 -5:-5:0
1082 inf:inf:NaN
1083 -inf:-inf:NaN
1084 -inf:inf:NaN
1085 inf:-inf:NaN
1086 8:0:8
1087 inf:0:inf
1088 # exceptions to reminder rule
1089 -inf:0:-inf
1090 -8:0:-8
1091 0:0:NaN
1092 abc:abc:NaN
1093 abc:1:abc:NaN
1094 1:abc:NaN
1095 0:0:NaN
1096 0:1:0
1097 1:0:1
1098 0:-1:0
1099 -1:0:-1
1100 1:1:0
1101 -1:-1:0
1102 1:-1:0
1103 -1:1:0
1104 1:2:1
1105 2:1:0
1106 1000000000:9:1
1107 2000000000:9:2
1108 3000000000:9:3
1109 4000000000:9:4
1110 5000000000:9:5
1111 6000000000:9:6
1112 7000000000:9:7
1113 8000000000:9:8
1114 9000000000:9:0
1115 35500000:113:33
1116 71000000:226:66
1117 106500000:339:99
1118 1000000000:3:1
1119 10:5:0
1120 100:4:0
1121 1000:8:0
1122 10000:16:0
1123 999999999999:9:0
1124 999999999999:99:0
1125 999999999999:999:0
1126 999999999999:9999:0
1127 999999999999999:99999:0
1128 -9:+5:1
1129 +9:-5:-1
1130 -9:-5:-4
1131 -5:3:1
1132 -2:3:1
1133 4:3:1
1134 1:3:1
1135 -5:-3:-2
1136 -2:-3:-2
1137 4:-3:-2
1138 1:-3:-2
1139 4095:4095:0
1140 100041000510123:3:0
1141 152403346:12345:4321
1142 87654321:87654321:0
1143 # now some floating point tests
1144 123:2.5:0.5
1145 1230:2.5:0
1146 123.4:2.5:0.9
1147 123e1:25:5
1148 &ffac
1149 Nanfac:NaN
1150 -1:NaN
1151 0:1
1152 1:1
1153 2:2
1154 3:6
1155 4:24
1156 5:120
1157 6:720
1158 10:3628800
1159 11:39916800
1160 12:479001600
1161 &fsqrt
1162 +0:0
1163 -1:NaN
1164 -2:NaN
1165 -16:NaN
1166 -123.45:NaN
1167 nanfsqrt:NaN
1168 +inf:inf
1169 -inf:NaN
1170 1:1
1171 2:1.41421356237309504880168872420969807857
1172 4:2
1173 9:3
1174 16:4
1175 100:10
1176 123.456:11.11107555549866648462149404118219234119
1177 15241.38393:123.4559999756998444766131352122991626468
1178 1.44:1.2
1179 # sqrt(1.44) = 1.2, sqrt(e10) = e5 => 12e4
1180 1.44E10:120000
1181 2e10:141421.356237309504880168872420969807857
1182 144e20:120000000000
1183 # proved to be an endless loop under 7-9
1184 12:3.464101615137754587054892683011744733886
1185 &is_nan
1186 123:0
1187 abc:1
1188 NaN:1
1189 -123:0
1190 &is_inf
1191 +inf::1
1192 -inf::1
1193 abc::0
1194 1::0
1195 NaN::0
1196 -1::0
1197 +inf:-:0
1198 +inf:+:1
1199 -inf:-:1
1200 -inf:+:0
1201 # it must be exactly /^[+-]inf$/
1202 +infinity::0
1203 -infinity::0
1204 &is_odd
1205 abc:0
1206 0:0
1207 -1:1
1208 -3:1
1209 1:1
1210 3:1
1211 1000001:1
1212 1000002:0
1213 +inf:0
1214 -inf:0
1215 123.45:0
1216 -123.45:0
1217 2:0
1218 &is_int
1219 NaNis_int:0
1220 0:1
1221 1:1
1222 2:1
1223 -2:1
1224 -1:1
1225 -inf:0
1226 +inf:0
1227 123.4567:0
1228 -0.1:0
1229 -0.002:0
1230 &is_even
1231 abc:0
1232 0:1
1233 -1:0
1234 -3:0
1235 1:0
1236 3:0
1237 1000001:0
1238 1000002:1
1239 2:1
1240 +inf:0
1241 -inf:0
1242 123.456:0
1243 -123.456:0
1244 0.01:0
1245 -0.01:0
1246 120:1
1247 1200:1
1248 -1200:1
1249 &is_positive
1250 0:1
1251 1:1
1252 -1:0
1253 -123:0
1254 NaN:0
1255 -inf:0
1256 +inf:1
1257 &is_negative
1258 0:0
1259 1:0
1260 -1:1
1261 -123:1
1262 NaN:0
1263 -inf:1
1264 +inf:0
1265 &parts
1266 0:0 1
1267 1:1 0
1268 123:123 0
1269 -123:-123 0
1270 -1200:-12 2
1271 NaNparts:NaN NaN
1272 +inf:inf inf
1273 -inf:-inf inf
1274 &exponent
1275 0:1
1276 1:0
1277 123:0
1278 -123:0
1279 -1200:2
1280 +inf:inf
1281 -inf:inf
1282 NaNexponent:NaN
1283 &mantissa
1284 0:0
1285 1:1
1286 123:123
1287 -123:-123
1288 -1200:-12
1289 +inf:inf
1290 -inf:-inf
1291 NaNmantissa:NaN
1292 &length
1293 123:3
1294 -123:3
1295 0:1
1296 1:1
1297 12345678901234567890:20
1298 &is_zero
1299 NaNzero:0
1300 +inf:0
1301 -inf:0
1302 0:1
1303 -1:0
1304 1:0
1305 &is_one
1306 NaNone:0
1307 +inf:0
1308 -inf:0
1309 0:0
1310 2:0
1311 1:1
1312 -1:0
1313 -2:0
1314 &ffloor
1315 0:0
1316 abc:NaN
1317 +inf:inf
1318 -inf:-inf
1319 1:1
1320 -51:-51
1321 -51.2:-52
1322 12.2:12
1323 &fceil
1324 0:0
1325 abc:NaN
1326 +inf:inf
1327 -inf:-inf
1328 1:1
1329 -51:-51
1330 -51.2:-51
1331 12.2:13