[perl #24506] [PATCH] cannot weaken refs to read only values
[p5sagit/p5-mst-13.2.git] / lib / Math / BigInt / t / bigfltpm.inc
CommitLineData
ee15d750 1#include this file into another test for subclass testing...
b3abae2a 2
3ok ($class->config()->{lib},$CL);
4
56d9de68 5use strict;
6
ee15d750 7while (<DATA>)
8 {
d614cd8b 9 chomp;
ee15d750 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 }
990fb837 33 $try = "\$x = $class->new('$args[0]');";
ee15d750 34 if ($f eq "fnorm")
35 {
36 $try .= "\$x;";
37 } elsif ($f eq "finf") {
38 $try .= "\$x->finf('$args[1]');";
027dc388 39 } elsif ($f eq "is_inf") {
40 $try .= "\$x->is_inf('$args[1]');";
ee15d750 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();';
ee15d750 46 } elsif ($f eq "parts") {
48b581a2 47 # ->bstr() to see if an object is returned
ee15d750 48 $try .= '($a,$b) = $x->parts(); $a = $a->bstr(); $b = $b->bstr();';
49 $try .= '"$a $b";';
ee15d750 50 } elsif ($f eq "exponent") {
48b581a2 51 # ->bstr() to see if an object is returned
ee15d750 52 $try .= '$x->exponent()->bstr();';
53 } elsif ($f eq "mantissa") {
48b581a2 54 # ->bstr() to see if an object is returned
ee15d750 55 $try .= '$x->mantissa()->bstr();';
56d9de68 56 } elsif ($f =~ /^(numify|length|as_number|as_hex|as_bin)$/) {
57 $try .= "\$x->$f();";
b3abae2a 58 # some unary ops (test the fxxx form, since that is done by AUTOLOAD)
027dc388 59 } elsif ($f =~ /^f(nan|sstr|neg|floor|ceil|abs)$/) {
394e6ffb 60 $try .= "\$x->f$1();";
027dc388 61 # some is_xxx test function
b3abae2a 62 } elsif ($f =~ /^is_(zero|one|negative|positive|odd|even|nan|int)$/) {
027dc388 63 $try .= "\$x->$f();";
ee15d750 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();";
b3abae2a 74 } elsif ($f eq "ffac") {
75 $try .= "$setup; \$x->ffac();";
990fb837 76 } elsif ($f eq "flog") {
77 if ($args[1] ne '')
78 {
79 $try .= "\$y = $class->new($args[1]);";
80 $try .= "$setup; \$x->flog(\$y);";
81 }
82 else
83 {
84 $try .= "$setup; \$x->flog();";
85 }
ee15d750 86 }
87 else
88 {
990fb837 89 $try .= "\$y = $class->new(\"$args[1]\");";
ee15d750 90 if ($f eq "fcmp") {
91 $try .= '$x <=> $y;';
92 } elsif ($f eq "facmp") {
93 $try .= '$x->facmp($y);';
94 } elsif ($f eq "fpow") {
95 $try .= '$x ** $y;';
990fb837 96 } elsif ($f eq "froot") {
97 $try .= "$setup; \$x->froot(\$y);";
ee15d750 98 } elsif ($f eq "fadd") {
99 $try .= '$x + $y;';
100 } elsif ($f eq "fsub") {
101 $try .= '$x - $y;';
102 } elsif ($f eq "fmul") {
103 $try .= '$x * $y;';
104 } elsif ($f eq "fdiv") {
105 $try .= "$setup; \$x / \$y;";
b3abae2a 106 } elsif ($f eq "fdiv-list") {
107 $try .= "$setup; join(',',\$x->fdiv(\$y));";
394e6ffb 108 } elsif ($f eq "frsft") {
109 $try .= '$x >> $y;';
110 } elsif ($f eq "flsft") {
111 $try .= '$x << $y;';
ee15d750 112 } elsif ($f eq "fmod") {
113 $try .= '$x % $y;';
114 } else { warn "Unknown op '$f'"; }
115 }
e745a66c 116 # print "# Trying: '$try'\n";
ee15d750 117 $ans1 = eval $try;
118 if ($ans =~ m|^/(.*)$|)
119 {
120 my $pat = $1;
121 if ($ans1 =~ /$pat/)
122 {
123 ok (1,1);
124 }
125 else
126 {
127 print "# '$try' expected: /$pat/ got: '$ans1'\n" if !ok(1,0);
128 }
129 }
130 else
131 {
132 if ($ans eq "")
133 {
134 ok_undef ($ans1);
135 }
136 else
137 {
138 print "# Tried: '$try'\n" if !ok ($ans1, $ans);
139 if (ref($ans1) eq "$class")
140 {
027dc388 141 # float numbers are normalized (for now), so mantissa shouldn't have
142 # trailing zeros
ee15d750 143 #print $ans1->_trailing_zeros(),"\n";
144 print "# Has trailing zeros after '$try'\n"
145 if !ok ($ans1->{_m}->_trailing_zeros(), 0);
146 }
147 }
148 } # end pattern or string
149 }
150 } # end while
151
394e6ffb 152# check whether $class->new( Math::BigInt->new()) destroys it
153# ($y == 12 in this case)
ee15d750 154$x = Math::BigInt->new(1200); $y = $class->new($x);
155ok ($y,1200); ok ($x,1200);
156
157###############################################################################
f9a08e12 158# Really huge, big, ultra-mega-biggy-monster exponents
159# Technically, the exponents should not be limited (they are BigInts), but
160# practically there are a few places were they are limited to a Perl scalar.
161# This is sometimes for speed, sometimes because otherwise the number wouldn't
162# fit into your memory (just think of 1e123456789012345678901234567890 + 1!)
163# anyway. We don't test everything here, but let's make sure it just basically
164# works.
165
166my $monster = '1e1234567890123456789012345678901234567890';
167
168# new
56d9de68 169ok ($class->new($monster)->bsstr(),
170 '1e+1234567890123456789012345678901234567890');
f9a08e12 171# cmp
172ok ($class->new($monster) > 0,1);
173
174# sub/mul
175ok ($class->new($monster)->bsub( $monster),0);
176ok ($class->new($monster)->bmul(2)->bsstr(),
177 '2e+1234567890123456789012345678901234567890');
178
179###############################################################################
b3abae2a 180# zero,inf,one,nan
ee15d750 181
394e6ffb 182$x = $class->new(2); $x->fzero(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
183$x = $class->new(2); $x->finf(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
184$x = $class->new(2); $x->fone(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
185$x = $class->new(2); $x->fnan(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
56b9c951 186
187###############################################################################
188# bone/binf etc as plain calls (Lite failed them)
189
190ok ($class->fzero(),0);
191ok ($class->fone(),1);
192ok ($class->fone('+'),1);
193ok ($class->fone('-'),-1);
194ok ($class->fnan(),'NaN');
195ok ($class->finf(),'inf');
196ok ($class->finf('+'),'inf');
197ok ($class->finf('-'),'-inf');
198ok ($class->finf('-inf'),'-inf');
61f5c3f5 199
56d9de68 200$class->accuracy(undef); $class->precision(undef); # reset
201
202###############################################################################
203# bug in bsstr()/numify() showed up in after-rounding in bdiv()
204
205$x = $class->new('0.008'); $y = $class->new(2);
206$x->bdiv(3,$y);
207ok ($x,'0.0027');
208
61f5c3f5 209###############################################################################
210# fsqrt() with set global A/P or A/P enabled on $x, also a test whether fsqrt()
211# correctly modifies $x
212
61f5c3f5 213
214$x = $class->new(12); $class->precision(-2); $x->fsqrt(); ok ($x,'3.46');
215
216$class->precision(undef);
217$x = $class->new(12); $class->precision(0); $x->fsqrt(); ok ($x,'3');
218
219$class->precision(-3); $x = $class->new(12); $x->fsqrt(); ok ($x,'3.464');
220
56d9de68 221{
222 no strict 'refs';
223 # A and P set => NaN
224 ${${class}.'::accuracy'} = 4; $x = $class->new(12);
225 $x->fsqrt(3); ok ($x,'NaN');
226 # supplied arg overrides set global
227 $class->precision(undef); $x = $class->new(12); $x->fsqrt(3); ok ($x,'3.46');
228 $class->accuracy(undef); $class->precision(undef); # reset for further tests
229}
230
231#############################################################################
13a12e00 232# can we call objectify (broken until v1.52)
233
56d9de68 234{
235 no strict;
236 $try =
237 '@args' . " = $class" . "::objectify(2,$class,4,5);".'join(" ",@args);';
238 $ans = eval $try;
239 ok ($ans,"$class 4 5");
240}
f9a08e12 241
990fb837 242#############################################################################
243# is_one('-') (broken until v1.64)
244
245ok ($class->new(-1)->is_one(),0);
246ok ($class->new(-1)->is_one('-'),1);
247
394e6ffb 2481; # all done
ee15d750 249
250###############################################################################
251# Perl 5.005 does not like ok ($x,undef)
252
253sub ok_undef
254 {
255 my $x = shift;
256
257 ok (1,1) and return if !defined $x;
258 ok ($x,'undef');
259 }
260
261__DATA__
b3abae2a 262$div_scale = 40;
263&flog
990fb837 2640::NaN
265-1::NaN
266-2::NaN
267# base > 0, base != 1
2682:-1:NaN
2692:0:NaN
2702:1:NaN
271# log(1) is always 1, regardless of $base
2721::0
2731:1:0
2741:2:0
b3abae2a 275# this is too slow for the testsuite
79c55733 276#2:0.6931471805599453094172321214581765680755
b3abae2a 277#2.718281828:0.9999999998311266953289851340574956564911
278#$div_scale = 20;
279#2.718281828:0.99999999983112669533
990fb837 280# too slow, too
b3abae2a 281#123:4.8112184355
79c55733 282$div_scale = 14;
b3abae2a 283#10:0:2.302585092994
61f5c3f5 284#1000:0:6.90775527898214
285#100:0:4.60517018598809
990fb837 2862::0.69314718055995
61f5c3f5 287#3.1415:0:1.14470039286086
990fb837 288# too slow
61f5c3f5 289#12345:0:9.42100640177928
290#0.001:0:-6.90775527898214
b3abae2a 291# reset for further tests
292$div_scale = 40;
990fb837 2931::0
394e6ffb 294&frsft
b3abae2a 295NaNfrsft:2:NaN
394e6ffb 2960:2:0
2971:1:0.5
2982:1:1
2994:1:2
300123:1:61.5
30132:3:4
302&flsft
b3abae2a 303NaNflsft:0:NaN
394e6ffb 3042:1:4
3054:3:32
3065:3:40
3071:2:4
3080:5:0
ee15d750 309&fnorm
3101:1
311-0:0
312fnormNaN:NaN
313+inf:inf
314-inf:-inf
315123:123
316-123.4567:-123.4567
027dc388 317# invalid inputs
3181__2:NaN
3191E1__2:NaN
32011__2E2:NaN
321#1.E3:NaN
322.2E-3.:NaN
323#1e3e4:NaN
324.2E2:20
ee15d750 325&as_number
3260:0
3271:1
3281.2:1
3292.345:2
330-2:-2
331-123.456:-123
332-200:-200
56d9de68 333# test for bug in brsft() not handling cases that return 0
3340.000641:0
3350.0006412:0
3360.00064123:0
3370.000641234:0
3380.0006412345:0
3390.00064123456:0
3400.000641234567:0
3410.0006412345678:0
3420.00064123456789:0
3430.1:0
3440.01:0
3450.001:0
3460.0001:0
3470.00001:0
3480.000001:0
3490.0000001:0
3500.00000001:0
3510.000000001:0
3520.0000000001:0
3530.00000000001:0
990fb837 3540.12345:0
3550.123456:0
3560.1234567:0
3570.12345678:0
3580.123456789:0
ee15d750 359&finf
3601:+:inf
3612:-:-inf
3623:abc:inf
56d9de68 363&as_hex
364+inf:inf
365-inf:-inf
366hexNaN:NaN
3670:0x0
3685:0x5
369-5:-0x5
370&as_bin
371+inf:inf
372-inf:-inf
373hexNaN:NaN
3740:0b0
3755:0b101
376-5:-0b101
ee15d750 377&numify
56d9de68 378# uses bsstr() so 5 => 5e+0 to be compatible w/ Perls output
ee15d750 3790:0e+1
380+1:1e+0
3811234:1234e+0
382NaN:NaN
383+inf:inf
384-inf:-inf
56d9de68 385-5:-5e+0
386100:1e+2
387-100:-1e+2
ee15d750 388&fnan
389abc:NaN
3902:NaN
391-2:NaN
3920:NaN
393&fone
3942:+:1
395-2:-:-1
396-2:+:1
3972:-:-1
3980::1
399-2::1
400abc::1
4012:abc:1
402&fsstr
403+inf:inf
404-inf:-inf
405abcfsstr:NaN
56d9de68 406-abcfsstr:NaN
ee15d750 4071234.567:1234567e-3
56d9de68 408123:123e+0
409-5:-5e+0
410-100:-1e+2
ee15d750 411&fstr
412+inf:::inf
413-inf:::-inf
414abcfstr:::NaN
4151234.567:9::1234.56700
4161234.567::-6:1234.567000
41712345:5::12345
4180.001234:6::0.00123400
4190.001234::-8:0.00123400
4200:4::0
4210::-4:0.0000
422&fnorm
423inf:inf
424+inf:inf
425-inf:-inf
426+infinity:NaN
427+-inf:NaN
428abc:NaN
429 1 a:NaN
4301bcd2:NaN
43111111b:NaN
432+1z:NaN
433-1z:NaN
aef458a0 4340e999:0
4350e-999:0
436-0e999:0
437-0e-999:0
ee15d750 4380:0
439+0:0
440+00:0
441+0_0_0:0
442000000_0000000_00000:0
443-0:0
444-0000:0
445+1:1
446+01:1
447+001:1
448+00000100000:100000
449123456789:123456789
450-1:-1
451-01:-1
452-001:-1
453-123456789:-123456789
454-00000100000:-100000
455123.456a:NaN
456123.456:123.456
4570.01:0.01
458.002:0.002
459+.2:0.2
460-0.0003:-0.0003
461-.0000000004:-0.0000000004
462123456E2:12345600
463123456E-2:1234.56
464-123456E2:-12345600
465-123456E-2:-1234.56
4661e1:10
4672e-11:0.00000000002
468# excercise _split
469 .02e-1:0.002
470 000001:1
471 -00001:-1
472 -1:-1
473 000.01:0.01
474 -000.0023:-0.0023
475 1.1e1:11
476-3e111:-3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
477-4e-1111:-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
478&fpow
4792:2:4
4801:2:1
4811:3:1
482-1:2:1
483-1:3:-1
484123.456:2:15241.383936
4852:-2:0.25
4862:-3:0.125
487128:-2:0.00006103515625
488abc:123.456:NaN
489123.456:abc:NaN
490+inf:123.45:inf
491-inf:123.45:-inf
492+inf:-123.45:inf
493-inf:-123.45:-inf
79c55733 494# 2 ** 0.5 == sqrt(2)
495# 1.41..7 and not 1.4170 since fallback (bsqrt(9) is '3', not 3.0...0)
4962:0.5:1.41421356237309504880168872420969807857
56b9c951 497#2:0.2:1.148698354997035006798626946777927589444
07d34614 498#6:1.5:14.6969384566990685891837044482353483518
56b9c951 499$div_scale = 20;
500#62.5:12.5:26447206647554886213592.3959144
501$div_scale = 40;
ee15d750 502&fneg
503fnegNaN:NaN
504+inf:-inf
505-inf:inf
506+0:0
507+1:-1
508-1:1
509+123456789:-123456789
510-123456789:123456789
511+123.456789:-123.456789
512-123456.789:123456.789
513&fabs
514fabsNaN:NaN
515+inf:inf
516-inf:inf
517+0:0
518+1:1
519-1:1
520+123456789:123456789
521-123456789:123456789
522+123.456789:123.456789
523-123456.789:123456.789
524&fround
525$round_mode = "trunc"
526+inf:5:inf
527-inf:5:-inf
5280:5:0
529NaNfround:5:NaN
530+10123456789:5:10123000000
531-10123456789:5:-10123000000
532+10123456789.123:5:10123000000
533-10123456789.123:5:-10123000000
534+10123456789:9:10123456700
535-10123456789:9:-10123456700
536+101234500:6:101234000
537-101234500:6:-101234000
538$round_mode = "zero"
539+20123456789:5:20123000000
540-20123456789:5:-20123000000
541+20123456789.123:5:20123000000
542-20123456789.123:5:-20123000000
543+20123456789:9:20123456800
544-20123456789:9:-20123456800
545+201234500:6:201234000
546-201234500:6:-201234000
547$round_mode = "+inf"
548+30123456789:5:30123000000
549-30123456789:5:-30123000000
550+30123456789.123:5:30123000000
551-30123456789.123:5:-30123000000
552+30123456789:9:30123456800
553-30123456789:9:-30123456800
554+301234500:6:301235000
555-301234500:6:-301234000
556$round_mode = "-inf"
557+40123456789:5:40123000000
558-40123456789:5:-40123000000
559+40123456789.123:5:40123000000
560-40123456789.123:5:-40123000000
561+40123456789:9:40123456800
562-40123456789:9:-40123456800
563+401234500:6:401234000
564-401234500:6:-401235000
565$round_mode = "odd"
566+50123456789:5:50123000000
567-50123456789:5:-50123000000
568+50123456789.123:5:50123000000
569-50123456789.123:5:-50123000000
570+50123456789:9:50123456800
571-50123456789:9:-50123456800
572+501234500:6:501235000
573-501234500:6:-501235000
574$round_mode = "even"
575+60123456789:5:60123000000
576-60123456789:5:-60123000000
577+60123456789:9:60123456800
578-60123456789:9:-60123456800
579+601234500:6:601234000
580-601234500:6:-601234000
581+60123456789.0123:5:60123000000
582-60123456789.0123:5:-60123000000
583&ffround
584$round_mode = "trunc"
585+inf:5:inf
586-inf:5:-inf
5870:5:0
588NaNffround:5:NaN
589+1.23:-1:1.2
590+1.234:-1:1.2
591+1.2345:-1:1.2
592+1.23:-2:1.23
593+1.234:-2:1.23
594+1.2345:-2:1.23
595+1.23:-3:1.230
596+1.234:-3:1.234
597+1.2345:-3:1.234
598-1.23:-1:-1.2
599+1.27:-1:1.2
600-1.27:-1:-1.2
601+1.25:-1:1.2
602-1.25:-1:-1.2
603+1.35:-1:1.3
604-1.35:-1:-1.3
605-0.0061234567890:-1:0.0
606-0.0061:-1:0.0
607-0.00612:-1:0.0
608-0.00612:-2:0.00
609-0.006:-1:0.0
610-0.006:-2:0.00
611-0.0006:-2:0.00
612-0.0006:-3:0.000
613-0.0065:-3:/-0\.006|-6e-03
614-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
615-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
6160.05:0:0
6170.5:0:0
6180.51:0:0
6190.41:0:0
620$round_mode = "zero"
621+2.23:-1:/2.2(?:0{5}\d+)?
622-2.23:-1:/-2.2(?:0{5}\d+)?
623+2.27:-1:/2.(?:3|29{5}\d+)
624-2.27:-1:/-2.(?:3|29{5}\d+)
625+2.25:-1:/2.2(?:0{5}\d+)?
626-2.25:-1:/-2.2(?:0{5}\d+)?
627+2.35:-1:/2.(?:3|29{5}\d+)
628-2.35:-1:/-2.(?:3|29{5}\d+)
629-0.0065:-1:0.0
630-0.0065:-2:/-0\.01|-1e-02
631-0.0065:-3:/-0\.006|-6e-03
632-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
633-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
6340.05:0:0
6350.5:0:0
6360.51:0:1
6370.41:0:0
638$round_mode = "+inf"
639+3.23:-1:/3.2(?:0{5}\d+)?
640-3.23:-1:/-3.2(?:0{5}\d+)?
641+3.27:-1:/3.(?:3|29{5}\d+)
642-3.27:-1:/-3.(?:3|29{5}\d+)
643+3.25:-1:/3.(?:3|29{5}\d+)
644-3.25:-1:/-3.2(?:0{5}\d+)?
645+3.35:-1:/3.(?:4|39{5}\d+)
646-3.35:-1:/-3.(?:3|29{5}\d+)
647-0.0065:-1:0.0
648-0.0065:-2:/-0\.01|-1e-02
649-0.0065:-3:/-0\.006|-6e-03
650-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
651-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
6520.05:0:0
6530.5:0:1
6540.51:0:1
6550.41:0:0
656$round_mode = "-inf"
657+4.23:-1:/4.2(?:0{5}\d+)?
658-4.23:-1:/-4.2(?:0{5}\d+)?
659+4.27:-1:/4.(?:3|29{5}\d+)
660-4.27:-1:/-4.(?:3|29{5}\d+)
661+4.25:-1:/4.2(?:0{5}\d+)?
662-4.25:-1:/-4.(?:3|29{5}\d+)
663+4.35:-1:/4.(?:3|29{5}\d+)
664-4.35:-1:/-4.(?:4|39{5}\d+)
665-0.0065:-1:0.0
666-0.0065:-2:/-0\.01|-1e-02
667-0.0065:-3:/-0\.007|-7e-03
668-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
669-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
6700.05:0:0
6710.5:0:0
6720.51:0:1
6730.41:0:0
674$round_mode = "odd"
675+5.23:-1:/5.2(?:0{5}\d+)?
676-5.23:-1:/-5.2(?:0{5}\d+)?
677+5.27:-1:/5.(?:3|29{5}\d+)
678-5.27:-1:/-5.(?:3|29{5}\d+)
679+5.25:-1:/5.(?:3|29{5}\d+)
680-5.25:-1:/-5.(?:3|29{5}\d+)
681+5.35:-1:/5.(?:3|29{5}\d+)
682-5.35:-1:/-5.(?:3|29{5}\d+)
683-0.0065:-1:0.0
684-0.0065:-2:/-0\.01|-1e-02
685-0.0065:-3:/-0\.007|-7e-03
686-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
687-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
6880.05:0:0
6890.5:0:1
6900.51:0:1
6910.41:0:0
692$round_mode = "even"
693+6.23:-1:/6.2(?:0{5}\d+)?
694-6.23:-1:/-6.2(?:0{5}\d+)?
695+6.27:-1:/6.(?:3|29{5}\d+)
696-6.27:-1:/-6.(?:3|29{5}\d+)
697+6.25:-1:/6.(?:2(?:0{5}\d+)?|29{5}\d+)
698-6.25:-1:/-6.(?:2(?:0{5}\d+)?|29{5}\d+)
699+6.35:-1:/6.(?:4|39{5}\d+|29{8}\d+)
700-6.35:-1:/-6.(?:4|39{5}\d+|29{8}\d+)
701-0.0065:-1:0.0
702-0.0065:-2:/-0\.01|-1e-02
703-0.0065:-3:/-0\.006|-7e-03
704-0.0065:-4:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
705-0.0065:-5:/-0\.006(?:5|49{5}\d+)|-6\.5e-03
7060.05:0:0
7070.5:0:0
7080.51:0:1
7090.41:0:0
7100.01234567:-3:0.012
7110.01234567:-4:0.0123
7120.01234567:-5:0.01235
7130.01234567:-6:0.012346
7140.01234567:-7:0.0123457
7150.01234567:-8:0.01234567
7160.01234567:-9:0.012345670
7170.01234567:-12:0.012345670000
718&fcmp
719fcmpNaN:fcmpNaN:
720fcmpNaN:+0:
721+0:fcmpNaN:
722+0:+0:0
723-1:+0:-1
724+0:-1:1
725+1:+0:1
726+0:+1:-1
727-1:+1:-1
728+1:-1:1
729-1:-1:0
730+1:+1:0
731-1.1:0:-1
732+0:-1.1:1
733+1.1:+0:1
734+0:+1.1:-1
735+123:+123:0
736+123:+12:1
737+12:+123:-1
738-123:-123:0
739-123:-12:-1
740-12:-123:1
741+123:+124:-1
742+124:+123:1
743-123:-124:1
744-124:-123:-1
7450:0.01:-1
7460:0.0001:-1
7470:-0.0001:1
7480:-0.1:1
7490.1:0:1
7500.00001:0:1
751-0.0001:0:-1
752-0.1:0:-1
7530:0.0001234:-1
7540:-0.0001234:1
7550.0001234:0:1
756-0.0001234:0:-1
7570.0001:0.0005:-1
7580.0005:0.0001:1
7590.005:0.0001:1
7600.001:0.0005:1
7610.000001:0.0005:-1
7620.00000123:0.0005:-1
7630.00512:0.0001:1
7640.005:0.000112:1
7650.00123:0.0005:1
7661.5:2:-1
7672:1.5:1
7681.54321:234:-1
769234:1.54321:1
770# infinity
771-inf:5432112345:-1
772+inf:5432112345:1
773-inf:-5432112345:-1
774+inf:-5432112345:1
775-inf:54321.12345:-1
776+inf:54321.12345:1
777-inf:-54321.12345:-1
778+inf:-54321.12345:1
779+inf:+inf:0
780-inf:-inf:0
781+inf:-inf:1
782-inf:+inf:-1
783# return undef
784+inf:NaN:
785NaN:inf:
786-inf:NaN:
787NaN:-inf:
788&facmp
789fcmpNaN:fcmpNaN:
790fcmpNaN:+0:
791+0:fcmpNaN:
792+0:+0:0
793-1:+0:1
794+0:-1:-1
795+1:+0:1
796+0:+1:-1
797-1:+1:0
798+1:-1:0
799-1:-1:0
800+1:+1:0
801-1.1:0:1
802+0:-1.1:-1
803+1.1:+0:1
804+0:+1.1:-1
805+123:+123:0
806+123:+12:1
807+12:+123:-1
808-123:-123:0
809-123:-12:1
810-12:-123:-1
811+123:+124:-1
812+124:+123:1
813-123:-124:-1
814-124:-123:1
8150:0.01:-1
8160:0.0001:-1
8170:-0.0001:-1
8180:-0.1:-1
8190.1:0:1
8200.00001:0:1
821-0.0001:0:1
822-0.1:0:1
8230:0.0001234:-1
8240:-0.0001234:-1
8250.0001234:0:1
826-0.0001234:0:1
8270.0001:0.0005:-1
8280.0005:0.0001:1
8290.005:0.0001:1
8300.001:0.0005:1
8310.000001:0.0005:-1
8320.00000123:0.0005:-1
8330.00512:0.0001:1
8340.005:0.000112:1
8350.00123:0.0005:1
8361.5:2:-1
8372:1.5:1
8381.54321:234:-1
839234:1.54321:1
840# infinity
841-inf:5432112345:1
842+inf:5432112345:1
843-inf:-5432112345:1
844+inf:-5432112345:1
845-inf:54321.12345:1
846+inf:54321.12345:1
847-inf:-54321.12345:1
848+inf:-54321.12345:1
849+inf:+inf:0
850-inf:-inf:0
851+inf:-inf:0
852-inf:+inf:0
48b581a2 8535:inf:-1
854-1:inf:-1
8555:-inf:-1
856-1:-inf:-1
ee15d750 857# return undef
858+inf:facmpNaN:
859facmpNaN:inf:
860-inf:facmpNaN:
861facmpNaN:-inf:
862&fdec
863fdecNaN:NaN
864+inf:inf
865-inf:-inf
866+0:-1
867+1:0
868-1:-2
8691.23:0.23
870-1.23:-2.23
e745a66c 871100:99
872101:100
873-100:-101
874-99:-100
875-98:-99
87699:98
ee15d750 877&finc
878fincNaN:NaN
879+inf:inf
880-inf:-inf
881+0:1
882+1:2
883-1:0
8841.23:2.23
885-1.23:-0.23
e745a66c 886100:101
887-100:-99
888-99:-98
889-101:-100
89099:100
ee15d750 891&fadd
892abc:abc:NaN
893abc:+0:NaN
894+0:abc:NaN
13a12e00 895+inf:-inf:NaN
896-inf:+inf:NaN
ee15d750 897+inf:+inf:inf
898-inf:-inf:-inf
899baddNaN:+inf:NaN
900baddNaN:+inf:NaN
901+inf:baddNaN:NaN
902-inf:baddNaN:NaN
903+0:+0:0
904+1:+0:1
905+0:+1:1
906+1:+1:2
907-1:+0:-1
908+0:-1:-1
909-1:-1:-2
910-1:+1:0
911+1:-1:0
912+9:+1:10
913+99:+1:100
914+999:+1:1000
915+9999:+1:10000
916+99999:+1:100000
917+999999:+1:1000000
918+9999999:+1:10000000
919+99999999:+1:100000000
920+999999999:+1:1000000000
921+9999999999:+1:10000000000
922+99999999999:+1:100000000000
923+10:-1:9
924+100:-1:99
925+1000:-1:999
926+10000:-1:9999
927+100000:-1:99999
928+1000000:-1:999999
929+10000000:-1:9999999
930+100000000:-1:99999999
931+1000000000:-1:999999999
932+10000000000:-1:9999999999
933+123456789:+987654321:1111111110
934-123456789:+987654321:864197532
935-123456789:-987654321:-1111111110
936+123456789:-987654321:-864197532
9370.001234:0.0001234:0.0013574
938&fsub
939abc:abc:NaN
940abc:+0:NaN
941+0:abc:NaN
942+inf:-inf:inf
943-inf:+inf:-inf
13a12e00 944+inf:+inf:NaN
945-inf:-inf:NaN
ee15d750 946baddNaN:+inf:NaN
947baddNaN:+inf:NaN
948+inf:baddNaN:NaN
949-inf:baddNaN:NaN
950+0:+0:0
951+1:+0:1
952+0:+1:-1
953+1:+1:0
954-1:+0:-1
955+0:-1:1
956-1:-1:0
957-1:+1:-2
958+1:-1:2
959+9:+1:8
960+99:+1:98
961+999:+1:998
962+9999:+1:9998
963+99999:+1:99998
964+999999:+1:999998
965+9999999:+1:9999998
966+99999999:+1:99999998
967+999999999:+1:999999998
968+9999999999:+1:9999999998
969+99999999999:+1:99999999998
970+10:-1:11
971+100:-1:101
972+1000:-1:1001
973+10000:-1:10001
974+100000:-1:100001
975+1000000:-1:1000001
976+10000000:-1:10000001
977+100000000:-1:100000001
978+1000000000:-1:1000000001
979+10000000000:-1:10000000001
980+123456789:+987654321:-864197532
981-123456789:+987654321:-1111111110
982-123456789:-987654321:864197532
983+123456789:-987654321:1111111110
984&fmul
985abc:abc:NaN
986abc:+0:NaN
987+0:abc:NaN
988+inf:NaNmul:NaN
989+inf:NaNmul:NaN
990NaNmul:+inf:NaN
991NaNmul:-inf:NaN
992+inf:+inf:inf
993+inf:-inf:-inf
994+inf:-inf:-inf
995+inf:+inf:inf
996+inf:123.34:inf
997+inf:-123.34:-inf
998-inf:123.34:-inf
999-inf:-123.34:inf
1000123.34:+inf:inf
1001-123.34:+inf:-inf
1002123.34:-inf:-inf
1003-123.34:-inf:inf
1004+0:+0:0
1005+0:+1:0
1006+1:+0:0
1007+0:-1:0
1008-1:+0:0
1009+123456789123456789:+0:0
1010+0:+123456789123456789:0
1011-1:-1:1
1012-1:+1:-1
1013+1:-1:-1
1014+1:+1:1
1015+2:+3:6
1016-2:+3:-6
1017+2:-3:-6
1018-2:-3:6
1019+111:+111:12321
1020+10101:+10101:102030201
1021+1001001:+1001001:1002003002001
1022+100010001:+100010001:10002000300020001
1023+10000100001:+10000100001:100002000030000200001
1024+11111111111:+9:99999999999
1025+22222222222:+9:199999999998
1026+33333333333:+9:299999999997
1027+44444444444:+9:399999999996
1028+55555555555:+9:499999999995
1029+66666666666:+9:599999999994
1030+77777777777:+9:699999999993
1031+88888888888:+9:799999999992
1032+99999999999:+9:899999999991
10336:120:720
103410:10000:100000
b3abae2a 1035&fdiv-list
10360:0:NaN,NaN
10370:1:0,0
10389:4:2.25,1
10399:5:1.8,4
ee15d750 1040&fdiv
1041$div_scale = 40; $round_mode = 'even'
1042abc:abc:NaN
1043abc:+1:abc:NaN
1044+1:abc:NaN
1045-1:abc:NaN
10460:abc:NaN
1047+0:+0:NaN
1048+0:+1:0
1049+1:+0:inf
1050+3214:+0:inf
1051+0:-1:0
1052-1:+0:-inf
1053-3214:+0:-inf
1054+1:+1:1
1055-1:-1:1
1056+1:-1:-1
1057-1:+1:-1
1058+1:+2:0.5
1059+2:+1:2
1060123:+inf:0
1061123:-inf:0
1062+10:+5:2
1063+100:+4:25
1064+1000:+8:125
1065+10000:+16:625
1066+10000:-16:-625
1067+999999999999:+9:111111111111
1068+999999999999:+99:10101010101
1069+999999999999:+999:1001001001
1070+999999999999:+9999:100010001
1071+999999999999999:+99999:10000100001
1072+1000000000:+9:111111111.1111111111111111111111111111111
1073+2000000000:+9:222222222.2222222222222222222222222222222
1074+3000000000:+9:333333333.3333333333333333333333333333333
1075+4000000000:+9:444444444.4444444444444444444444444444444
1076+5000000000:+9:555555555.5555555555555555555555555555556
1077+6000000000:+9:666666666.6666666666666666666666666666667
1078+7000000000:+9:777777777.7777777777777777777777777777778
1079+8000000000:+9:888888888.8888888888888888888888888888889
1080+9000000000:+9:1000000000
1081+35500000:+113:314159.2920353982300884955752212389380531
1082+71000000:+226:314159.2920353982300884955752212389380531
1083+106500000:+339:314159.2920353982300884955752212389380531
1084+1000000000:+3:333333333.3333333333333333333333333333333
10852:25.024996000799840031993601279744051189762:0.07992009269196593320152084692285869265447
394e6ffb 1086123456:1:123456
ee15d750 1087$div_scale = 20
1088+1000000000:+9:111111111.11111111111
1089+2000000000:+9:222222222.22222222222
1090+3000000000:+9:333333333.33333333333
1091+4000000000:+9:444444444.44444444444
1092+5000000000:+9:555555555.55555555556
1093+6000000000:+9:666666666.66666666667
1094+7000000000:+9:777777777.77777777778
1095+8000000000:+9:888888888.88888888889
1096+9000000000:+9:1000000000
10971:10:0.1
10981:100:0.01
10991:1000:0.001
11001:10000:0.0001
11011:504:0.001984126984126984127
11022:1.987654321:1.0062111801179738436
394e6ffb 1103123456789.123456789123456789123456789:1:123456789.12345678912
ee15d750 1104# the next two cases are the "old" behaviour, but are now (>v0.01) different
1105#+35500000:+113:314159.292035398230088
1106#+71000000:+226:314159.292035398230088
1107+35500000:+113:314159.29203539823009
1108+71000000:+226:314159.29203539823009
1109+106500000:+339:314159.29203539823009
1110+1000000000:+3:333333333.33333333333
1111$div_scale = 1
1112# round to accuracy 1 after bdiv
1113+124:+3:40
394e6ffb 1114123456789.1234:1:100000000
ee15d750 1115# reset scale for further tests
1116$div_scale = 40
1117&fmod
61f5c3f5 1118+9:4:1
1119+9:5:4
1120+9000:56:40
1121+56:9000:56
1122# inf handling, see table in doc
11230:inf:0
11240:-inf:0
11255:inf:5
11265:-inf:5
1127-5:inf:-5
1128-5:-inf:-5
1129inf:5:0
1130-inf:5:0
1131inf:-5:0
1132-inf:-5:0
11335:5:0
1134-5:-5:0
b3abae2a 1135inf:inf:NaN
1136-inf:-inf:NaN
1137-inf:inf:NaN
1138inf:-inf:NaN
61f5c3f5 11398:0:8
1140inf:0:inf
1141# exceptions to reminder rule
1142-inf:0:-inf
1143-8:0:-8
11440:0:NaN
1145abc:abc:NaN
1146abc:1:abc:NaN
11471:abc:NaN
11480:0:NaN
11490:1:0
11501:0:1
11510:-1:0
1152-1:0:-1
11531:1:0
1154-1:-1:0
11551:-1:0
1156-1:1:0
11571:2:1
11582:1:0
11591000000000:9:1
11602000000000:9:2
11613000000000:9:3
11624000000000:9:4
11635000000000:9:5
11646000000000:9:6
11657000000000:9:7
11668000000000:9:8
11679000000000:9:0
116835500000:113:33
116971000000:226:66
1170106500000:339:99
11711000000000:3:1
117210:5:0
1173100:4:0
11741000:8:0
117510000:16:0
1176999999999999:9:0
1177999999999999:99:0
1178999999999999:999:0
1179999999999999:9999:0
1180999999999999999:99999:0
1181-9:+5:1
1182+9:-5:-1
1183-9:-5:-4
1184-5:3:1
1185-2:3:1
11864:3:1
11871:3:1
1188-5:-3:-2
1189-2:-3:-2
11904:-3:-2
11911:-3:-2
11924095:4095:0
1193100041000510123:3:0
1194152403346:12345:4321
119587654321:87654321:0
1196# now some floating point tests
1197123:2.5:0.5
11981230:2.5:0
1199123.4:2.5:0.9
1200123e1:25:5
b3abae2a 1201&ffac
1202Nanfac:NaN
1203-1:NaN
091c87b1 1204+inf:NaN
1205-inf:NaN
b3abae2a 12060:1
12071:1
12082:2
12093:6
12104:24
12115:120
12126:720
121310:3628800
121411:39916800
121512:479001600
990fb837 1216&froot
1217# sqrt()
1218+0:2:0
1219+1:2:1
1220-1:2:NaN
1221# -$x ** (1/2) => -$y, but not in froot()
1222-123.456:2:NaN
1223+inf:2:inf
1224-inf:2:NaN
12252:2:1.41421356237309504880168872420969807857
1226-2:2:NaN
12274:2:2
12289:2:3
122916:2:4
1230100:2:10
1231123.456:2:11.11107555549866648462149404118219234119
123215241.38393:2:123.4559999756998444766131352122991626468
12331.44:2:1.2
123412:2:3.464101615137754587054892683011744733886
12350.49:2:0.7
12360.0049:2:0.07
1237# invalid ones
12381:NaN:NaN
1239-1:NaN:NaN
12400:NaN:NaN
1241-inf:NaN:NaN
1242+inf:NaN:NaN
1243NaN:0:NaN
1244NaN:2:NaN
1245NaN:inf:NaN
1246NaN:inf:NaN
124712:-inf:NaN
124812:inf:NaN
1249+0:0:NaN
1250+1:0:NaN
1251-1:0:NaN
1252-2:0:NaN
1253-123.45:0:NaN
1254+inf:0:NaN
125512:1:12
1256-12:1:NaN
12578:-1:NaN
1258-8:-1:NaN
1259# cubic root
12608:3:2
1261-8:3:NaN
1262# fourths root
126316:4:2
126481:4:3
ee15d750 1265&fsqrt
1266+0:0
1267-1:NaN
1268-2:NaN
1269-16:NaN
1270-123.45:NaN
1271nanfsqrt:NaN
1272+inf:inf
1273-inf:NaN
394e6ffb 12741:1
12752:1.41421356237309504880168872420969807857
12764:2
12779:3
127816:4
1279100:10
1280123.456:11.11107555549866648462149404118219234119
128115241.38393:123.4559999756998444766131352122991626468
12821.44:1.2
1283# sqrt(1.44) = 1.2, sqrt(e10) = e5 => 12e4
12841.44E10:120000
12852e10:141421.356237309504880168872420969807857
b3abae2a 1286144e20:120000000000
61f5c3f5 1287# proved to be an endless loop under 7-9
128812:3.464101615137754587054892683011744733886
990fb837 12890.49:0.7
12900.0049:0.07
027dc388 1291&is_nan
1292123:0
1293abc:1
1294NaN:1
1295-123:0
1296&is_inf
1297+inf::1
1298-inf::1
1299abc::0
13001::0
1301NaN::0
1302-1::0
1303+inf:-:0
1304+inf:+:1
1305-inf:-:1
1306-inf:+:0
1307# it must be exactly /^[+-]inf$/
1308+infinity::0
1309-infinity::0
ee15d750 1310&is_odd
1311abc:0
13120:0
1313-1:1
1314-3:1
13151:1
13163:1
13171000001:1
13181000002:0
1319+inf:0
1320-inf:0
1321123.45:0
1322-123.45:0
13232:0
b3abae2a 1324&is_int
1325NaNis_int:0
13260:1
13271:1
13282:1
1329-2:1
1330-1:1
1331-inf:0
1332+inf:0
1333123.4567:0
1334-0.1:0
1335-0.002:0
ee15d750 1336&is_even
1337abc:0
13380:1
1339-1:0
1340-3:0
13411:0
13423:0
13431000001:0
13441000002:1
13452:1
1346+inf:0
1347-inf:0
1348123.456:0
1349-123.456:0
b3abae2a 13500.01:0
1351-0.01:0
1352120:1
13531200:1
1354-1200:1
ee15d750 1355&is_positive
13560:1
13571:1
1358-1:0
1359-123:0
1360NaN:0
1361-inf:0
1362+inf:1
1363&is_negative
13640:0
13651:0
1366-1:1
1367-123:1
1368NaN:0
1369-inf:1
1370+inf:0
1371&parts
13720:0 1
13731:1 0
1374123:123 0
1375-123:-123 0
1376-1200:-12 2
1377NaNparts:NaN NaN
1378+inf:inf inf
1379-inf:-inf inf
1380&exponent
13810:1
13821:0
1383123:0
1384-123:0
1385-1200:2
1386+inf:inf
1387-inf:inf
1388NaNexponent:NaN
1389&mantissa
13900:0
13911:1
1392123:123
1393-123:-123
1394-1200:-12
1395+inf:inf
1396-inf:-inf
1397NaNmantissa:NaN
1398&length
1399123:3
1400-123:3
14010:1
14021:1
140312345678901234567890:20
1404&is_zero
1405NaNzero:0
1406+inf:0
1407-inf:0
14080:1
1409-1:0
14101:0
1411&is_one
1412NaNone:0
1413+inf:0
1414-inf:0
14150:0
14162:0
14171:1
1418-1:0
1419-2:0
027dc388 1420&ffloor
ee15d750 14210:0
1422abc:NaN
1423+inf:inf
1424-inf:-inf
14251:1
1426-51:-51
1427-51.2:-52
142812.2:12
990fb837 14290.12345:0
14300.123456:0
14310.1234567:0
14320.12345678:0
14330.123456789:0
027dc388 1434&fceil
ee15d750 14350:0
1436abc:NaN
1437+inf:inf
1438-inf:-inf
14391:1
1440-51:-51
1441-51.2:-51
144212.2:13