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