This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[PATCH] Math::BigInt v1.73 final
[perl5.git] / lib / Math / BigInt.pm
CommitLineData
13a12e00
JH
1package Math::BigInt;
2
3#
4# "Mike had an infinite amount to do and a negative amount of time in which
5# to do it." - Before and After
6#
7
58cde26e 8# The following hash values are used:
0716bf9b 9# value: unsigned int with actual value (as a Math::BigInt::Calc or similiar)
58cde26e
JH
10# sign : +,-,NaN,+inf,-inf
11# _a : accuracy
12# _p : precision
0716bf9b 13# _f : flags, used by MBF to flag parts of a float as untouchable
b4f14daa 14
574bacfe
JH
15# Remember not to take shortcuts ala $xs = $x->{value}; $CALC->foo($xs); since
16# underlying lib might change the reference!
17
58cde26e 18my $class = "Math::BigInt";
0716bf9b 19require 5.005;
58cde26e 20
2d2b2744 21$VERSION = '1.73';
58cde26e
JH
22use Exporter;
23@ISA = qw( Exporter );
091c87b1 24@EXPORT_OK = qw( objectify bgcd blcm);
b282a552
T
25# _trap_inf and _trap_nan are internal and should never be accessed from the
26# outside
27use vars qw/$round_mode $accuracy $precision $div_scale $rnd_mode
28 $upgrade $downgrade $_trap_nan $_trap_inf/;
58cde26e
JH
29use strict;
30
31# Inside overload, the first arg is always an object. If the original code had
091c87b1
T
32# it reversed (like $x = 2 * $y), then the third paramater is true.
33# In some cases (like add, $x = $x + 2 is the same as $x = 2 + $x) this makes
34# no difference, but in some cases it does.
58cde26e
JH
35
36# For overloaded ops with only one argument we simple use $_[0]->copy() to
37# preserve the argument.
38
39# Thus inheritance of overload operators becomes possible and transparent for
40# our subclasses without the need to repeat the entire overload section there.
a0d0e21e 41
a5f75d66 42use overload
58cde26e
JH
43'=' => sub { $_[0]->copy(); },
44
58cde26e
JH
45# some shortcuts for speed (assumes that reversed order of arguments is routed
46# to normal '+' and we thus can always modify first arg. If this is changed,
47# this breaks and must be adjusted.)
48'+=' => sub { $_[0]->badd($_[1]); },
49'-=' => sub { $_[0]->bsub($_[1]); },
50'*=' => sub { $_[0]->bmul($_[1]); },
51'/=' => sub { scalar $_[0]->bdiv($_[1]); },
027dc388
JH
52'%=' => sub { $_[0]->bmod($_[1]); },
53'^=' => sub { $_[0]->bxor($_[1]); },
54'&=' => sub { $_[0]->band($_[1]); },
55'|=' => sub { $_[0]->bior($_[1]); },
58cde26e
JH
56'**=' => sub { $_[0]->bpow($_[1]); },
57
2d2b2744
T
58'<<=' => sub { $_[0]->blsft($_[1]); },
59'>>=' => sub { $_[0]->brsft($_[1]); },
60
b3abae2a 61# not supported by Perl yet
027dc388
JH
62'..' => \&_pointpoint,
63
58cde26e 64'<=>' => sub { $_[2] ?
bd05a461 65 ref($_[0])->bcmp($_[1],$_[0]) :
f9a08e12 66 $_[0]->bcmp($_[1])},
027dc388 67'cmp' => sub {
58cde26e 68 $_[2] ?
b3abae2a
JH
69 "$_[1]" cmp $_[0]->bstr() :
70 $_[0]->bstr() cmp "$_[1]" },
58cde26e 71
091c87b1
T
72# make cos()/sin()/exp() "work" with BigInt's or subclasses
73'cos' => sub { cos($_[0]->numify()) },
74'sin' => sub { sin($_[0]->numify()) },
75'exp' => sub { exp($_[0]->numify()) },
76'atan2' => sub { atan2($_[0]->numify(),$_[1]) },
77
78'log' => sub { $_[0]->copy()->blog($_[1]); },
58cde26e
JH
79'int' => sub { $_[0]->copy(); },
80'neg' => sub { $_[0]->copy()->bneg(); },
81'abs' => sub { $_[0]->copy()->babs(); },
b3abae2a 82'sqrt' => sub { $_[0]->copy()->bsqrt(); },
58cde26e
JH
83'~' => sub { $_[0]->copy()->bnot(); },
84
12fc2493 85# for subtract it's a bit tricky to not modify b: b-a => -a+b
091c87b1 86'-' => sub { my $c = $_[0]->copy; $_[2] ?
12fc2493 87 $c->bneg()->badd( $_[1]) :
091c87b1
T
88 $c->bsub( $_[1]) },
89'+' => sub { $_[0]->copy()->badd($_[1]); },
90'*' => sub { $_[0]->copy()->bmul($_[1]); },
91
92'/' => sub {
93 $_[2] ? ref($_[0])->new($_[1])->bdiv($_[0]) : $_[0]->copy->bdiv($_[1]);
94 },
95'%' => sub {
96 $_[2] ? ref($_[0])->new($_[1])->bmod($_[0]) : $_[0]->copy->bmod($_[1]);
97 },
98'**' => sub {
99 $_[2] ? ref($_[0])->new($_[1])->bpow($_[0]) : $_[0]->copy->bpow($_[1]);
100 },
101'<<' => sub {
102 $_[2] ? ref($_[0])->new($_[1])->blsft($_[0]) : $_[0]->copy->blsft($_[1]);
103 },
104'>>' => sub {
105 $_[2] ? ref($_[0])->new($_[1])->brsft($_[0]) : $_[0]->copy->brsft($_[1]);
106 },
107'&' => sub {
108 $_[2] ? ref($_[0])->new($_[1])->band($_[0]) : $_[0]->copy->band($_[1]);
109 },
110'|' => sub {
111 $_[2] ? ref($_[0])->new($_[1])->bior($_[0]) : $_[0]->copy->bior($_[1]);
112 },
113'^' => sub {
114 $_[2] ? ref($_[0])->new($_[1])->bxor($_[0]) : $_[0]->copy->bxor($_[1]);
115 },
116
117# can modify arg of ++ and --, so avoid a copy() for speed, but don't
118# use $_[0]->bone(), it would modify $_[0] to be 1!
58cde26e
JH
119'++' => sub { $_[0]->binc() },
120'--' => sub { $_[0]->bdec() },
121
122# if overloaded, O(1) instead of O(N) and twice as fast for small numbers
123'bool' => sub {
124 # this kludge is needed for perl prior 5.6.0 since returning 0 here fails :-/
091c87b1 125 # v5.6.1 dumps on this: return !$_[0]->is_zero() || undef; :-(
3a427a11
RGS
126 my $t = undef;
127 $t = 1 if !$_[0]->is_zero();
b3abae2a 128 $t;
58cde26e 129 },
a0d0e21e 130
027dc388
JH
131# the original qw() does not work with the TIESCALAR below, why?
132# Order of arguments unsignificant
133'""' => sub { $_[0]->bstr(); },
134'0+' => sub { $_[0]->numify(); }
a5f75d66 135;
a0d0e21e 136
58cde26e
JH
137##############################################################################
138# global constants, flags and accessory
139
990fb837
RGS
140# these are public, but their usage is not recommended, use the accessor
141# methods instead
0716bf9b 142
ee15d750
JH
143$round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
144$accuracy = undef;
145$precision = undef;
146$div_scale = 40;
58cde26e 147
b3abae2a
JH
148$upgrade = undef; # default is no upgrade
149$downgrade = undef; # default is no downgrade
150
990fb837
RGS
151# these are internally, and not to be used from the outside
152
b282a552 153sub MB_NEVER_ROUND () { 0x0001; }
990fb837
RGS
154
155$_trap_nan = 0; # are NaNs ok? set w/ config()
156$_trap_inf = 0; # are infs ok? set w/ config()
157my $nan = 'NaN'; # constants for easier life
158
159my $CALC = 'Math::BigInt::Calc'; # module to do the low level math
091c87b1 160 # default is Calc.pm
990fb837
RGS
161my $IMPORT = 0; # was import() called yet?
162 # used to make require work
9b924220
RGS
163my %WARN; # warn only once for low-level libs
164my %CAN; # cache for $CALC->can(...)
b282a552 165my $EMU_LIB = 'Math/BigInt/CalcEmu.pm'; # emulate low-level math
b282a552 166
027dc388
JH
167##############################################################################
168# the old code had $rnd_mode, so we need to support it, too
169
170$rnd_mode = 'even';
171sub TIESCALAR { my ($class) = @_; bless \$round_mode, $class; }
172sub FETCH { return $round_mode; }
173sub STORE { $rnd_mode = $_[0]->round_mode($_[1]); }
174
b282a552
T
175BEGIN
176 {
177 # tie to enable $rnd_mode to work transparently
178 tie $rnd_mode, 'Math::BigInt';
179
180 # set up some handy alias names
181 *as_int = \&as_number;
182 *is_pos = \&is_positive;
183 *is_neg = \&is_negative;
184 }
027dc388
JH
185
186##############################################################################
187
58cde26e
JH
188sub round_mode
189 {
ee15d750 190 no strict 'refs';
58cde26e 191 # make Class->round_mode() work
ee15d750
JH
192 my $self = shift;
193 my $class = ref($self) || $self || __PACKAGE__;
58cde26e
JH
194 if (defined $_[0])
195 {
196 my $m = shift;
990fb837
RGS
197 if ($m !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
198 {
199 require Carp; Carp::croak ("Unknown round mode '$m'");
200 }
b3abae2a 201 return ${"${class}::round_mode"} = $m;
58cde26e 202 }
990fb837 203 ${"${class}::round_mode"};
ee15d750
JH
204 }
205
b3abae2a
JH
206sub upgrade
207 {
208 no strict 'refs';
28df3e88 209 # make Class->upgrade() work
b3abae2a
JH
210 my $self = shift;
211 my $class = ref($self) || $self || __PACKAGE__;
9393ace2
JH
212 # need to set new value?
213 if (@_ > 0)
b3abae2a
JH
214 {
215 my $u = shift;
216 return ${"${class}::upgrade"} = $u;
217 }
990fb837 218 ${"${class}::upgrade"};
b3abae2a
JH
219 }
220
28df3e88
JH
221sub downgrade
222 {
223 no strict 'refs';
224 # make Class->downgrade() work
225 my $self = shift;
226 my $class = ref($self) || $self || __PACKAGE__;
9393ace2
JH
227 # need to set new value?
228 if (@_ > 0)
28df3e88
JH
229 {
230 my $u = shift;
231 return ${"${class}::downgrade"} = $u;
232 }
990fb837 233 ${"${class}::downgrade"};
28df3e88
JH
234 }
235
ee15d750
JH
236sub div_scale
237 {
238 no strict 'refs';
990fb837 239 # make Class->div_scale() work
ee15d750
JH
240 my $self = shift;
241 my $class = ref($self) || $self || __PACKAGE__;
242 if (defined $_[0])
243 {
990fb837
RGS
244 if ($_[0] < 0)
245 {
246 require Carp; Carp::croak ('div_scale must be greater than zero');
247 }
ee15d750
JH
248 ${"${class}::div_scale"} = shift;
249 }
990fb837 250 ${"${class}::div_scale"};
58cde26e
JH
251 }
252
253sub accuracy
254 {
ee15d750
JH
255 # $x->accuracy($a); ref($x) $a
256 # $x->accuracy(); ref($x)
257 # Class->accuracy(); class
258 # Class->accuracy($a); class $a
58cde26e 259
ee15d750
JH
260 my $x = shift;
261 my $class = ref($x) || $x || __PACKAGE__;
58cde26e 262
ee15d750
JH
263 no strict 'refs';
264 # need to set new value?
58cde26e
JH
265 if (@_ > 0)
266 {
ee15d750 267 my $a = shift;
990fb837
RGS
268 # convert objects to scalars to avoid deep recursion. If object doesn't
269 # have numify(), then hopefully it will have overloading for int() and
270 # boolean test without wandering into a deep recursion path...
271 $a = $a->numify() if ref($a) && $a->can('numify');
272
273 if (defined $a)
274 {
275 # also croak on non-numerical
276 if (!$a || $a <= 0)
277 {
278 require Carp;
279 Carp::croak ('Argument to accuracy must be greater than zero');
280 }
281 if (int($a) != $a)
282 {
283 require Carp; Carp::croak ('Argument to accuracy must be an integer');
284 }
285 }
ee15d750
JH
286 if (ref($x))
287 {
288 # $object->accuracy() or fallback to global
ef9466ea
T
289 $x->bround($a) if $a; # not for undef, 0
290 $x->{_a} = $a; # set/overwrite, even if not rounded
291 delete $x->{_p}; # clear P
990fb837 292 $a = ${"${class}::accuracy"} unless defined $a; # proper return value
ee15d750
JH
293 }
294 else
295 {
ef9466ea
T
296 ${"${class}::accuracy"} = $a; # set global A
297 ${"${class}::precision"} = undef; # clear global P
ee15d750 298 }
ef9466ea 299 return $a; # shortcut
ee15d750
JH
300 }
301
f9a08e12
JH
302 my $r;
303 # $object->accuracy() or fallback to global
304 $r = $x->{_a} if ref($x);
305 # but don't return global undef, when $x's accuracy is 0!
306 $r = ${"${class}::accuracy"} if !defined $r;
307 $r;
990fb837 308 }
58cde26e
JH
309
310sub precision
311 {
ee15d750
JH
312 # $x->precision($p); ref($x) $p
313 # $x->precision(); ref($x)
314 # Class->precision(); class
315 # Class->precision($p); class $p
58cde26e 316
ee15d750
JH
317 my $x = shift;
318 my $class = ref($x) || $x || __PACKAGE__;
58cde26e 319
ee15d750 320 no strict 'refs';
58cde26e
JH
321 if (@_ > 0)
322 {
ee15d750 323 my $p = shift;
990fb837
RGS
324 # convert objects to scalars to avoid deep recursion. If object doesn't
325 # have numify(), then hopefully it will have overloading for int() and
326 # boolean test without wandering into a deep recursion path...
327 $p = $p->numify() if ref($p) && $p->can('numify');
328 if ((defined $p) && (int($p) != $p))
329 {
330 require Carp; Carp::croak ('Argument to precision must be an integer');
331 }
ee15d750
JH
332 if (ref($x))
333 {
334 # $object->precision() or fallback to global
ef9466ea
T
335 $x->bfround($p) if $p; # not for undef, 0
336 $x->{_p} = $p; # set/overwrite, even if not rounded
337 delete $x->{_a}; # clear A
990fb837 338 $p = ${"${class}::precision"} unless defined $p; # proper return value
ee15d750
JH
339 }
340 else
341 {
ef9466ea
T
342 ${"${class}::precision"} = $p; # set global P
343 ${"${class}::accuracy"} = undef; # clear global A
ee15d750 344 }
ef9466ea 345 return $p; # shortcut
58cde26e 346 }
ee15d750 347
f9a08e12
JH
348 my $r;
349 # $object->precision() or fallback to global
350 $r = $x->{_p} if ref($x);
351 # but don't return global undef, when $x's precision is 0!
352 $r = ${"${class}::precision"} if !defined $r;
353 $r;
990fb837 354 }
58cde26e 355
b3abae2a
JH
356sub config
357 {
990fb837 358 # return (or set) configuration data as hash ref
b3abae2a
JH
359 my $class = shift || 'Math::BigInt';
360
361 no strict 'refs';
990fb837
RGS
362 if (@_ > 0)
363 {
364 # try to set given options as arguments from hash
365
366 my $args = $_[0];
367 if (ref($args) ne 'HASH')
368 {
369 $args = { @_ };
370 }
371 # these values can be "set"
372 my $set_args = {};
373 foreach my $key (
374 qw/trap_inf trap_nan
375 upgrade downgrade precision accuracy round_mode div_scale/
376 )
377 {
378 $set_args->{$key} = $args->{$key} if exists $args->{$key};
379 delete $args->{$key};
380 }
381 if (keys %$args > 0)
382 {
383 require Carp;
384 Carp::croak ("Illegal key(s) '",
385 join("','",keys %$args),"' passed to $class\->config()");
386 }
387 foreach my $key (keys %$set_args)
388 {
389 if ($key =~ /^trap_(inf|nan)\z/)
390 {
391 ${"${class}::_trap_$1"} = ($set_args->{"trap_$1"} ? 1 : 0);
392 next;
393 }
394 # use a call instead of just setting the $variable to check argument
395 $class->$key($set_args->{$key});
396 }
397 }
398
399 # now return actual configuration
400
b3abae2a 401 my $cfg = {
990fb837
RGS
402 lib => $CALC,
403 lib_version => ${"${CALC}::VERSION"},
b3abae2a 404 class => $class,
990fb837
RGS
405 trap_nan => ${"${class}::_trap_nan"},
406 trap_inf => ${"${class}::_trap_inf"},
407 version => ${"${class}::VERSION"},
b3abae2a 408 };
990fb837
RGS
409 foreach my $key (qw/
410 upgrade downgrade precision accuracy round_mode div_scale
411 /)
b3abae2a 412 {
990fb837 413 $cfg->{$key} = ${"${class}::$key"};
b3abae2a
JH
414 };
415 $cfg;
416 }
417
58cde26e
JH
418sub _scale_a
419 {
420 # select accuracy parameter based on precedence,
421 # used by bround() and bfround(), may return undef for scale (means no op)
422 my ($x,$s,$m,$scale,$mode) = @_;
423 $scale = $x->{_a} if !defined $scale;
424 $scale = $s if (!defined $scale);
425 $mode = $m if !defined $mode;
426 return ($scale,$mode);
427 }
428
429sub _scale_p
430 {
431 # select precision parameter based on precedence,
432 # used by bround() and bfround(), may return undef for scale (means no op)
433 my ($x,$s,$m,$scale,$mode) = @_;
434 $scale = $x->{_p} if !defined $scale;
435 $scale = $s if (!defined $scale);
436 $mode = $m if !defined $mode;
437 return ($scale,$mode);
438 }
439
440##############################################################################
441# constructors
442
443sub copy
444 {
445 my ($c,$x);
446 if (@_ > 1)
447 {
448 # if two arguments, the first one is the class to "swallow" subclasses
449 ($c,$x) = @_;
450 }
451 else
452 {
453 $x = shift;
454 $c = ref($x);
455 }
456 return unless ref($x); # only for objects
457
458 my $self = {}; bless $self,$c;
9b924220
RGS
459
460 $self->{sign} = $x->{sign};
461 $self->{value} = $CALC->_copy($x->{value});
462 $self->{_a} = $x->{_a} if defined $x->{_a};
463 $self->{_p} = $x->{_p} if defined $x->{_p};
58cde26e
JH
464 $self;
465 }
466
467sub new
468 {
b22b3e31 469 # create a new BigInt object from a string or another BigInt object.
0716bf9b 470 # see hash keys documented at top
58cde26e
JH
471
472 # the argument could be an object, so avoid ||, && etc on it, this would
b22b3e31
PN
473 # cause costly overloaded code to be called. The only allowed ops are
474 # ref() and defined.
58cde26e 475
61f5c3f5 476 my ($class,$wanted,$a,$p,$r) = @_;
58cde26e 477
61f5c3f5
T
478 # avoid numify-calls by not using || on $wanted!
479 return $class->bzero($a,$p) if !defined $wanted; # default to 0
9393ace2
JH
480 return $class->copy($wanted,$a,$p,$r)
481 if ref($wanted) && $wanted->isa($class); # MBI or subclass
58cde26e 482
61f5c3f5
T
483 $class->import() if $IMPORT == 0; # make require work
484
9393ace2
JH
485 my $self = bless {}, $class;
486
487 # shortcut for "normal" numbers
739c8b3a 488 if ((!ref $wanted) && ($wanted =~ /^([+-]?)[1-9][0-9]*\z/))
9393ace2
JH
489 {
490 $self->{sign} = $1 || '+';
9b924220 491
9393ace2
JH
492 if ($wanted =~ /^[+-]/)
493 {
56d9de68 494 # remove sign without touching wanted to make it work with constants
9b924220
RGS
495 my $t = $wanted; $t =~ s/^[+-]//;
496 $self->{value} = $CALC->_new($t);
497 }
498 else
499 {
500 $self->{value} = $CALC->_new($wanted);
9393ace2 501 }
9393ace2
JH
502 no strict 'refs';
503 if ( (defined $a) || (defined $p)
504 || (defined ${"${class}::precision"})
505 || (defined ${"${class}::accuracy"})
506 )
507 {
508 $self->round($a,$p,$r) unless (@_ == 4 && !defined $a && !defined $p);
509 }
510 return $self;
511 }
512
58cde26e 513 # handle '+inf', '-inf' first
ee15d750 514 if ($wanted =~ /^[+-]?inf$/)
58cde26e 515 {
0716bf9b 516 $self->{value} = $CALC->_zero();
ee15d750 517 $self->{sign} = $wanted; $self->{sign} = '+inf' if $self->{sign} eq 'inf';
58cde26e
JH
518 return $self;
519 }
520 # split str in m mantissa, e exponent, i integer, f fraction, v value, s sign
9b924220 521 my ($mis,$miv,$mfv,$es,$ev) = _split($wanted);
58cde26e
JH
522 if (!ref $mis)
523 {
990fb837
RGS
524 if ($_trap_nan)
525 {
526 require Carp; Carp::croak("$wanted is not a number in $class");
527 }
0716bf9b 528 $self->{value} = $CALC->_zero();
58cde26e
JH
529 $self->{sign} = $nan;
530 return $self;
531 }
574bacfe
JH
532 if (!ref $miv)
533 {
534 # _from_hex or _from_bin
535 $self->{value} = $mis->{value};
536 $self->{sign} = $mis->{sign};
537 return $self; # throw away $mis
538 }
58cde26e
JH
539 # make integer from mantissa by adjusting exp, then convert to bigint
540 $self->{sign} = $$mis; # store sign
0716bf9b 541 $self->{value} = $CALC->_zero(); # for all the NaN cases
58cde26e
JH
542 my $e = int("$$es$$ev"); # exponent (avoid recursion)
543 if ($e > 0)
544 {
545 my $diff = $e - CORE::length($$mfv);
546 if ($diff < 0) # Not integer
547 {
990fb837
RGS
548 if ($_trap_nan)
549 {
550 require Carp; Carp::croak("$wanted not an integer in $class");
551 }
58cde26e 552 #print "NOI 1\n";
b3abae2a 553 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
58cde26e
JH
554 $self->{sign} = $nan;
555 }
556 else # diff >= 0
557 {
558 # adjust fraction and add it to value
990fb837 559 #print "diff > 0 $$miv\n";
58cde26e
JH
560 $$miv = $$miv . ($$mfv . '0' x $diff);
561 }
562 }
563 else
564 {
565 if ($$mfv ne '') # e <= 0
566 {
567 # fraction and negative/zero E => NOI
990fb837
RGS
568 if ($_trap_nan)
569 {
570 require Carp; Carp::croak("$wanted not an integer in $class");
571 }
58cde26e 572 #print "NOI 2 \$\$mfv '$$mfv'\n";
b3abae2a 573 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
58cde26e
JH
574 $self->{sign} = $nan;
575 }
576 elsif ($e < 0)
577 {
578 # xE-y, and empty mfv
579 #print "xE-y\n";
580 $e = abs($e);
581 if ($$miv !~ s/0{$e}$//) # can strip so many zero's?
582 {
990fb837
RGS
583 if ($_trap_nan)
584 {
585 require Carp; Carp::croak("$wanted not an integer in $class");
586 }
58cde26e 587 #print "NOI 3\n";
b3abae2a 588 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
58cde26e
JH
589 $self->{sign} = $nan;
590 }
591 }
592 }
593 $self->{sign} = '+' if $$miv eq '0'; # normalize -0 => +0
9b924220 594 $self->{value} = $CALC->_new($$miv) if $self->{sign} =~ /^[+-]$/;
0716bf9b 595 # if any of the globals is set, use them to round and store them inside $self
61f5c3f5
T
596 # do not round for new($x,undef,undef) since that is used by MBF to signal
597 # no rounding
598 $self->round($a,$p,$r) unless @_ == 4 && !defined $a && !defined $p;
9393ace2 599 $self;
58cde26e
JH
600 }
601
58cde26e
JH
602sub bnan
603 {
604 # create a bigint 'NaN', if given a BigInt, set it to 'NaN'
b4f14daa 605 my $self = shift;
58cde26e
JH
606 $self = $class if !defined $self;
607 if (!ref($self))
608 {
609 my $c = $self; $self = {}; bless $self, $c;
610 }
990fb837
RGS
611 no strict 'refs';
612 if (${"${class}::_trap_nan"})
613 {
614 require Carp;
615 Carp::croak ("Tried to set $self to NaN in $class\::bnan()");
616 }
61f5c3f5 617 $self->import() if $IMPORT == 0; # make require work
58cde26e 618 return if $self->modify('bnan');
13a12e00
JH
619 if ($self->can('_bnan'))
620 {
621 # use subclass to initialize
622 $self->_bnan();
623 }
624 else
625 {
626 # otherwise do our own thing
627 $self->{value} = $CALC->_zero();
628 }
58cde26e 629 $self->{sign} = $nan;
394e6ffb 630 delete $self->{_a}; delete $self->{_p}; # rounding NaN is silly
ef9466ea 631 $self;
b4f14daa 632 }
58cde26e
JH
633
634sub binf
635 {
636 # create a bigint '+-inf', if given a BigInt, set it to '+-inf'
637 # the sign is either '+', or if given, used from there
638 my $self = shift;
56b9c951 639 my $sign = shift; $sign = '+' if !defined $sign || $sign !~ /^-(inf)?$/;
58cde26e
JH
640 $self = $class if !defined $self;
641 if (!ref($self))
642 {
643 my $c = $self; $self = {}; bless $self, $c;
644 }
990fb837
RGS
645 no strict 'refs';
646 if (${"${class}::_trap_inf"})
647 {
648 require Carp;
649 Carp::croak ("Tried to set $self to +-inf in $class\::binfn()");
650 }
61f5c3f5 651 $self->import() if $IMPORT == 0; # make require work
58cde26e 652 return if $self->modify('binf');
13a12e00
JH
653 if ($self->can('_binf'))
654 {
655 # use subclass to initialize
656 $self->_binf();
657 }
658 else
659 {
660 # otherwise do our own thing
661 $self->{value} = $CALC->_zero();
662 }
56b9c951
JH
663 $sign = $sign . 'inf' if $sign !~ /inf$/; # - => -inf
664 $self->{sign} = $sign;
394e6ffb 665 ($self->{_a},$self->{_p}) = @_; # take over requested rounding
ef9466ea 666 $self;
58cde26e
JH
667 }
668
669sub bzero
670 {
671 # create a bigint '+0', if given a BigInt, set it to 0
672 my $self = shift;
12fc2493 673 $self = __PACKAGE__ if !defined $self;
0716bf9b 674
58cde26e
JH
675 if (!ref($self))
676 {
677 my $c = $self; $self = {}; bless $self, $c;
678 }
61f5c3f5 679 $self->import() if $IMPORT == 0; # make require work
58cde26e 680 return if $self->modify('bzero');
990fb837 681
13a12e00
JH
682 if ($self->can('_bzero'))
683 {
684 # use subclass to initialize
685 $self->_bzero();
686 }
687 else
688 {
689 # otherwise do our own thing
690 $self->{value} = $CALC->_zero();
691 }
58cde26e 692 $self->{sign} = '+';
61f5c3f5
T
693 if (@_ > 0)
694 {
f9a08e12
JH
695 if (@_ > 3)
696 {
697 # call like: $x->bzero($a,$p,$r,$y);
698 ($self,$self->{_a},$self->{_p}) = $self->_find_round_parameters(@_);
699 }
700 else
701 {
702 $self->{_a} = $_[0]
703 if ( (!defined $self->{_a}) || (defined $_[0] && $_[0] > $self->{_a}));
704 $self->{_p} = $_[1]
705 if ( (!defined $self->{_p}) || (defined $_[1] && $_[1] > $self->{_p}));
706 }
61f5c3f5 707 }
f9a08e12 708 $self;
58cde26e
JH
709 }
710
574bacfe
JH
711sub bone
712 {
713 # create a bigint '+1' (or -1 if given sign '-'),
714 # if given a BigInt, set it to +1 or -1, respecively
715 my $self = shift;
716 my $sign = shift; $sign = '+' if !defined $sign || $sign ne '-';
717 $self = $class if !defined $self;
990fb837 718
574bacfe
JH
719 if (!ref($self))
720 {
721 my $c = $self; $self = {}; bless $self, $c;
722 }
61f5c3f5 723 $self->import() if $IMPORT == 0; # make require work
574bacfe 724 return if $self->modify('bone');
13a12e00
JH
725
726 if ($self->can('_bone'))
727 {
728 # use subclass to initialize
729 $self->_bone();
730 }
731 else
732 {
733 # otherwise do our own thing
734 $self->{value} = $CALC->_one();
735 }
574bacfe 736 $self->{sign} = $sign;
61f5c3f5
T
737 if (@_ > 0)
738 {
f9a08e12
JH
739 if (@_ > 3)
740 {
741 # call like: $x->bone($sign,$a,$p,$r,$y);
742 ($self,$self->{_a},$self->{_p}) = $self->_find_round_parameters(@_);
743 }
744 else
745 {
091c87b1 746 # call like: $x->bone($sign,$a,$p,$r);
f9a08e12
JH
747 $self->{_a} = $_[0]
748 if ( (!defined $self->{_a}) || (defined $_[0] && $_[0] > $self->{_a}));
749 $self->{_p} = $_[1]
750 if ( (!defined $self->{_p}) || (defined $_[1] && $_[1] > $self->{_p}));
751 }
61f5c3f5 752 }
f9a08e12 753 $self;
574bacfe
JH
754 }
755
58cde26e
JH
756##############################################################################
757# string conversation
758
759sub bsstr
760 {
761 # (ref to BFLOAT or num_str ) return num_str
762 # Convert number from internal format to scientific string format.
763 # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
12fc2493 764 my $x = shift; my $class = ref($x) || $x; $x = $class->new(shift) if !ref($x);
dccbb853 765 # my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
58cde26e 766
574bacfe
JH
767 if ($x->{sign} !~ /^[+-]$/)
768 {
769 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
770 return 'inf'; # +inf
771 }
58cde26e 772 my ($m,$e) = $x->parts();
b282a552
T
773 #$m->bstr() . 'e+' . $e->bstr(); # e can only be positive in BigInt
774 # 'e+' because E can only be positive in BigInt
9b924220 775 $m->bstr() . 'e+' . $CALC->_str($e->{value});
58cde26e
JH
776 }
777
778sub bstr
779 {
0716bf9b 780 # make a string from bigint object
12fc2493 781 my $x = shift; my $class = ref($x) || $x; $x = $class->new(shift) if !ref($x);
ee15d750 782 # my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
56b9c951 783
574bacfe
JH
784 if ($x->{sign} !~ /^[+-]$/)
785 {
786 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
787 return 'inf'; # +inf
788 }
0716bf9b 789 my $es = ''; $es = $x->{sign} if $x->{sign} eq '-';
9b924220 790 $es.$CALC->_str($x->{value});
58cde26e
JH
791 }
792
793sub numify
794 {
394e6ffb 795 # Make a "normal" scalar from a BigInt object
58cde26e 796 my $x = shift; $x = $class->new($x) unless ref $x;
56d9de68
T
797
798 return $x->bstr() if $x->{sign} !~ /^[+-]$/;
0716bf9b
JH
799 my $num = $CALC->_num($x->{value});
800 return -$num if $x->{sign} eq '-';
9393ace2 801 $num;
58cde26e
JH
802 }
803
804##############################################################################
805# public stuff (usually prefixed with "b")
806
807sub sign
808 {
9393ace2 809 # return the sign of the number: +/-/-inf/+inf/NaN
b282a552 810 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
ee15d750 811
9393ace2 812 $x->{sign};
58cde26e
JH
813 }
814
ee15d750 815sub _find_round_parameters
58cde26e
JH
816 {
817 # After any operation or when calling round(), the result is rounded by
818 # regarding the A & P from arguments, local parameters, or globals.
61f5c3f5 819
990fb837
RGS
820 # !!!!!!! If you change this, remember to change round(), too! !!!!!!!!!!
821
61f5c3f5
T
822 # This procedure finds the round parameters, but it is for speed reasons
823 # duplicated in round. Otherwise, it is tested by the testsuite and used
824 # by fdiv().
990fb837
RGS
825
826 # returns ($self) or ($self,$a,$p,$r) - sets $self to NaN of both A and P
827 # were requested/defined (locally or globally or both)
61f5c3f5 828
394e6ffb
JH
829 my ($self,$a,$p,$r,@args) = @_;
830 # $a accuracy, if given by caller
831 # $p precision, if given by caller
832 # $r round_mode, if given by caller
833 # @args all 'other' arguments (0 for unary, 1 for binary ops)
58cde26e 834
17baacb7 835 # leave bigfloat parts alone
990fb837 836 return ($self) if exists $self->{_f} && ($self->{_f} & MB_NEVER_ROUND) != 0;
17baacb7 837
394e6ffb 838 my $c = ref($self); # find out class of argument(s)
574bacfe 839 no strict 'refs';
574bacfe 840
58cde26e 841 # now pick $a or $p, but only if we have got "arguments"
61f5c3f5 842 if (!defined $a)
58cde26e 843 {
61f5c3f5 844 foreach ($self,@args)
58cde26e
JH
845 {
846 # take the defined one, or if both defined, the one that is smaller
847 $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
848 }
61f5c3f5
T
849 }
850 if (!defined $p)
ee15d750 851 {
61f5c3f5
T
852 # even if $a is defined, take $p, to signal error for both defined
853 foreach ($self,@args)
854 {
855 # take the defined one, or if both defined, the one that is bigger
856 # -2 > -3, and 3 > 2
857 $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
858 }
ee15d750 859 }
61f5c3f5
T
860 # if still none defined, use globals (#2)
861 $a = ${"$c\::accuracy"} unless defined $a;
862 $p = ${"$c\::precision"} unless defined $p;
990fb837
RGS
863
864 # A == 0 is useless, so undef it to signal no rounding
865 $a = undef if defined $a && $a == 0;
61f5c3f5
T
866
867 # no rounding today?
868 return ($self) unless defined $a || defined $p; # early out
869
870 # set A and set P is an fatal error
990fb837 871 return ($self->bnan()) if defined $a && defined $p; # error
61f5c3f5
T
872
873 $r = ${"$c\::round_mode"} unless defined $r;
990fb837
RGS
874 if ($r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
875 {
876 require Carp; Carp::croak ("Unknown round mode '$r'");
877 }
878
879 ($self,$a,$p,$r);
ee15d750
JH
880 }
881
882sub round
883 {
61f5c3f5 884 # Round $self according to given parameters, or given second argument's
ee15d750 885 # parameters or global defaults
ee15d750 886
61f5c3f5
T
887 # for speed reasons, _find_round_parameters is embeded here:
888
889 my ($self,$a,$p,$r,@args) = @_;
890 # $a accuracy, if given by caller
891 # $p precision, if given by caller
892 # $r round_mode, if given by caller
893 # @args all 'other' arguments (0 for unary, 1 for binary ops)
894
12fc2493
AMS
895 # leave bigfloat parts alone (that is only used in BigRat for now and can be
896 # removed once we rewrote BigRat))
990fb837 897 return ($self) if exists $self->{_f} && ($self->{_f} & MB_NEVER_ROUND) != 0;
61f5c3f5
T
898
899 my $c = ref($self); # find out class of argument(s)
900 no strict 'refs';
901
902 # now pick $a or $p, but only if we have got "arguments"
903 if (!defined $a)
58cde26e 904 {
61f5c3f5
T
905 foreach ($self,@args)
906 {
907 # take the defined one, or if both defined, the one that is smaller
908 $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
909 }
58cde26e 910 }
61f5c3f5
T
911 if (!defined $p)
912 {
913 # even if $a is defined, take $p, to signal error for both defined
914 foreach ($self,@args)
915 {
916 # take the defined one, or if both defined, the one that is bigger
917 # -2 > -3, and 3 > 2
918 $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
919 }
920 }
921 # if still none defined, use globals (#2)
922 $a = ${"$c\::accuracy"} unless defined $a;
923 $p = ${"$c\::precision"} unless defined $p;
924
990fb837
RGS
925 # A == 0 is useless, so undef it to signal no rounding
926 $a = undef if defined $a && $a == 0;
927
61f5c3f5
T
928 # no rounding today?
929 return $self unless defined $a || defined $p; # early out
930
931 # set A and set P is an fatal error
932 return $self->bnan() if defined $a && defined $p;
933
934 $r = ${"$c\::round_mode"} unless defined $r;
990fb837
RGS
935 if ($r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
936 {
b282a552 937 require Carp; Carp::croak ("Unknown round mode '$r'");
990fb837 938 }
61f5c3f5
T
939
940 # now round, by calling either fround or ffround:
941 if (defined $a)
942 {
943 $self->bround($a,$r) if !defined $self->{_a} || $self->{_a} >= $a;
944 }
945 else # both can't be undefined due to early out
58cde26e 946 {
61f5c3f5 947 $self->bfround($p,$r) if !defined $self->{_p} || $self->{_p} <= $p;
58cde26e 948 }
12fc2493
AMS
949 # bround() or bfround() already callled bnorm() if necc.
950 $self;
58cde26e
JH
951 }
952
17baacb7 953sub bnorm
58cde26e 954 {
027dc388 955 # (numstr or BINT) return BINT
58cde26e 956 # Normalize number -- no-op here
b282a552 957 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
b3abae2a 958 $x;
58cde26e
JH
959 }
960
961sub babs
962 {
963 # (BINT or num_str) return BINT
964 # make number absolute, or return absolute BINT from string
ee15d750
JH
965 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
966
58cde26e
JH
967 return $x if $x->modify('babs');
968 # post-normalized abs for internal use (does nothing for NaN)
969 $x->{sign} =~ s/^-/+/;
970 $x;
971 }
972
973sub bneg
974 {
975 # (BINT or num_str) return BINT
976 # negate number or make a negated number from string
ee15d750
JH
977 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
978
58cde26e 979 return $x if $x->modify('bneg');
b3abae2a 980
58cde26e 981 # for +0 dont negate (to have always normalized)
b3abae2a 982 $x->{sign} =~ tr/+-/-+/ if !$x->is_zero(); # does nothing for NaN
58cde26e
JH
983 $x;
984 }
985
986sub bcmp
987 {
988 # Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort)
989 # (BINT or num_str, BINT or num_str) return cond_code
f9a08e12
JH
990
991 # set up parameters
992 my ($self,$x,$y) = (ref($_[0]),@_);
993
994 # objectify is costly, so avoid it
995 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
996 {
997 ($self,$x,$y) = objectify(2,@_);
998 }
0716bf9b 999
56d9de68
T
1000 return $upgrade->bcmp($x,$y) if defined $upgrade &&
1001 ((!$x->isa($self)) || (!$y->isa($self)));
1002
0716bf9b
JH
1003 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
1004 {
1005 # handle +-inf and NaN
1006 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
574bacfe 1007 return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
0716bf9b
JH
1008 return +1 if $x->{sign} eq '+inf';
1009 return -1 if $x->{sign} eq '-inf';
1010 return -1 if $y->{sign} eq '+inf';
b3abae2a 1011 return +1;
0716bf9b 1012 }
574bacfe
JH
1013 # check sign for speed first
1014 return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y
1015 return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0
1016
f9a08e12
JH
1017 # have same sign, so compare absolute values. Don't make tests for zero here
1018 # because it's actually slower than testin in Calc (especially w/ Pari et al)
1019
dccbb853
JH
1020 # post-normalized compare for internal use (honors signs)
1021 if ($x->{sign} eq '+')
1022 {
56b9c951 1023 # $x and $y both > 0
dccbb853
JH
1024 return $CALC->_acmp($x->{value},$y->{value});
1025 }
1026
56b9c951 1027 # $x && $y both < 0
b282a552 1028 $CALC->_acmp($y->{value},$x->{value}); # swaped acmp (lib returns 0,1,-1)
58cde26e
JH
1029 }
1030
1031sub bacmp
1032 {
1033 # Compares 2 values, ignoring their signs.
1034 # Returns one of undef, <0, =0, >0. (suitable for sort)
1035 # (BINT, BINT) return cond_code
574bacfe 1036
f9a08e12
JH
1037 # set up parameters
1038 my ($self,$x,$y) = (ref($_[0]),@_);
1039 # objectify is costly, so avoid it
1040 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1041 {
1042 ($self,$x,$y) = objectify(2,@_);
1043 }
1044
56d9de68
T
1045 return $upgrade->bacmp($x,$y) if defined $upgrade &&
1046 ((!$x->isa($self)) || (!$y->isa($self)));
1047
574bacfe
JH
1048 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
1049 {
1050 # handle +-inf and NaN
1051 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
1052 return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
ef9466ea
T
1053 return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/;
1054 return -1;
574bacfe 1055 }
b3abae2a 1056 $CALC->_acmp($x->{value},$y->{value}); # lib does only 0,1,-1
58cde26e
JH
1057 }
1058
1059sub badd
1060 {
1061 # add second arg (BINT or string) to first (BINT) (modifies first)
1062 # return result as BINT
f9a08e12
JH
1063
1064 # set up parameters
1065 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1066 # objectify is costly, so avoid it
1067 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1068 {
1069 ($self,$x,$y,@r) = objectify(2,@_);
1070 }
58cde26e
JH
1071
1072 return $x if $x->modify('badd');
091c87b1 1073 return $upgrade->badd($upgrade->new($x),$upgrade->new($y),@r) if defined $upgrade &&
8f675a64 1074 ((!$x->isa($self)) || (!$y->isa($self)));
58cde26e 1075
61f5c3f5 1076 $r[3] = $y; # no push!
574bacfe
JH
1077 # inf and NaN handling
1078 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
1079 {
1080 # NaN first
1081 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
13a12e00
JH
1082 # inf handling
1083 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
574bacfe 1084 {
b3abae2a
JH
1085 # +inf++inf or -inf+-inf => same, rest is NaN
1086 return $x if $x->{sign} eq $y->{sign};
1087 return $x->bnan();
574bacfe
JH
1088 }
1089 # +-inf + something => +inf
1090 # something +-inf => +-inf
1091 $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
1092 return $x;
1093 }
1094
b282a552 1095 my ($sx, $sy) = ( $x->{sign}, $y->{sign} ); # get signs
58cde26e
JH
1096
1097 if ($sx eq $sy)
1098 {
574bacfe 1099 $x->{value} = $CALC->_add($x->{value},$y->{value}); # same sign, abs add
58cde26e
JH
1100 }
1101 else
1102 {
574bacfe 1103 my $a = $CALC->_acmp ($y->{value},$x->{value}); # absolute compare
58cde26e
JH
1104 if ($a > 0)
1105 {
574bacfe 1106 $x->{value} = $CALC->_sub($y->{value},$x->{value},1); # abs sub w/ swap
58cde26e
JH
1107 $x->{sign} = $sy;
1108 }
1109 elsif ($a == 0)
1110 {
1111 # speedup, if equal, set result to 0
0716bf9b 1112 $x->{value} = $CALC->_zero();
58cde26e
JH
1113 $x->{sign} = '+';
1114 }
1115 else # a < 0
1116 {
574bacfe 1117 $x->{value} = $CALC->_sub($x->{value}, $y->{value}); # abs sub
a0d0e21e 1118 }
a0d0e21e 1119 }
f9a08e12
JH
1120 $x->round(@r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
1121 $x;
58cde26e
JH
1122 }
1123
1124sub bsub
1125 {
091c87b1 1126 # (BINT or num_str, BINT or num_str) return BINT
58cde26e 1127 # subtract second arg from first, modify first
f9a08e12
JH
1128
1129 # set up parameters
1130 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1131 # objectify is costly, so avoid it
1132 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1133 {
1134 ($self,$x,$y,@r) = objectify(2,@_);
1135 }
58cde26e 1136
58cde26e 1137 return $x if $x->modify('bsub');
8f675a64 1138
9b924220
RGS
1139 return $upgrade->new($x)->bsub($upgrade->new($y),@r) if defined $upgrade &&
1140 ((!$x->isa($self)) || (!$y->isa($self)));
b3abae2a
JH
1141
1142 if ($y->is_zero())
1143 {
f9a08e12
JH
1144 $x->round(@r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
1145 return $x;
e745a66c 1146 }
b3abae2a 1147
ae161977
RGS
1148 require Scalar::Util;
1149 if (Scalar::Util::refaddr($x) == Scalar::Util::refaddr($y))
03874afe
T
1150 {
1151 # if we get the same variable twice, the result must be zero (the code
1152 # below fails in that case)
1153 return $x->bzero(@r) if $x->{sign} =~ /^[+-]$/;
1154 return $x->bnan(); # NaN, -inf, +inf
1155 }
b3abae2a
JH
1156 $y->{sign} =~ tr/+\-/-+/; # does nothing for NaN
1157 $x->badd($y,@r); # badd does not leave internal zeros
1158 $y->{sign} =~ tr/+\-/-+/; # refix $y (does nothing for NaN)
61f5c3f5 1159 $x; # already rounded by badd() or no round necc.
58cde26e
JH
1160 }
1161
1162sub binc
1163 {
1164 # increment arg by one
ee15d750 1165 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
58cde26e 1166 return $x if $x->modify('binc');
e745a66c
JH
1167
1168 if ($x->{sign} eq '+')
1169 {
1170 $x->{value} = $CALC->_inc($x->{value});
f9a08e12
JH
1171 $x->round($a,$p,$r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
1172 return $x;
e745a66c
JH
1173 }
1174 elsif ($x->{sign} eq '-')
1175 {
1176 $x->{value} = $CALC->_dec($x->{value});
1177 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0
f9a08e12
JH
1178 $x->round($a,$p,$r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
1179 return $x;
e745a66c
JH
1180 }
1181 # inf, nan handling etc
091c87b1 1182 $x->badd($self->bone(),$a,$p,$r); # badd does round
58cde26e
JH
1183 }
1184
1185sub bdec
1186 {
1187 # decrement arg by one
b282a552 1188 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
58cde26e 1189 return $x if $x->modify('bdec');
e745a66c 1190
b282a552 1191 if ($x->{sign} eq '-')
e745a66c 1192 {
b282a552 1193 # < 0
e745a66c 1194 $x->{value} = $CALC->_inc($x->{value});
b282a552
T
1195 }
1196 else
e745a66c 1197 {
b282a552
T
1198 return $x->badd($self->bone('-'),@r) unless $x->{sign} eq '+'; # inf/NaN
1199 # >= 0
1200 if ($CALC->_is_zero($x->{value}))
1201 {
1202 # == 0
1203 $x->{value} = $CALC->_one(); $x->{sign} = '-'; # 0 => -1
1204 }
1205 else
1206 {
1207 # > 0
1208 $x->{value} = $CALC->_dec($x->{value});
1209 }
e745a66c 1210 }
b282a552
T
1211 $x->round(@r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
1212 $x;
1213 }
58cde26e 1214
61f5c3f5
T
1215sub blog
1216 {
091c87b1
T
1217 # calculate $x = $a ** $base + $b and return $a (e.g. the log() to base
1218 # $base of $x)
1219
1220 # set up parameters
1221 my ($self,$x,$base,@r) = (ref($_[0]),@_);
1222 # objectify is costly, so avoid it
1223 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1224 {
9b924220 1225 ($self,$x,$base,@r) = objectify(1,$class,@_);
091c87b1 1226 }
9b924220 1227
ef9466ea
T
1228 return $x if $x->modify('blog');
1229
091c87b1
T
1230 # inf, -inf, NaN, <0 => NaN
1231 return $x->bnan()
9b924220 1232 if $x->{sign} ne '+' || (defined $base && $base->{sign} ne '+');
091c87b1 1233
9b924220
RGS
1234 return $upgrade->blog($upgrade->new($x),$base,@r) if
1235 defined $upgrade;
091c87b1 1236
9b924220
RGS
1237 my ($rc,$exact) = $CALC->_log_int($x->{value},$base->{value});
1238 return $x->bnan() unless defined $rc; # not possible to take log?
1239 $x->{value} = $rc;
1240 $x->round(@r);
61f5c3f5 1241 }
091c87b1 1242
58cde26e
JH
1243sub blcm
1244 {
1245 # (BINT or num_str, BINT or num_str) return BINT
1246 # does not modify arguments, but returns new object
1247 # Lowest Common Multiplicator
58cde26e 1248
0716bf9b
JH
1249 my $y = shift; my ($x);
1250 if (ref($y))
1251 {
1252 $x = $y->copy();
1253 }
1254 else
1255 {
12fc2493 1256 $x = $class->new($y);
0716bf9b 1257 }
9b924220
RGS
1258 my $self = ref($x);
1259 while (@_)
1260 {
1261 my $y = shift; $y = $self->new($y) if !ref ($y);
1262 $x = __lcm($x,$y);
1263 }
58cde26e
JH
1264 $x;
1265 }
1266
1267sub bgcd
1268 {
1269 # (BINT or num_str, BINT or num_str) return BINT
1270 # does not modify arguments, but returns new object
1271 # GCD -- Euclids algorithm, variant C (Knuth Vol 3, pg 341 ff)
0716bf9b 1272
dccbb853 1273 my $y = shift;
12fc2493 1274 $y = $class->new($y) if !ref($y);
dccbb853 1275 my $self = ref($y);
9b924220
RGS
1276 my $x = $y->copy()->babs(); # keep arguments
1277 return $x->bnan() if $x->{sign} !~ /^[+-]$/; # x NaN?
1278
1279 while (@_)
0716bf9b 1280 {
9b924220
RGS
1281 $y = shift; $y = $self->new($y) if !ref($y);
1282 next if $y->is_zero();
1283 return $x->bnan() if $y->{sign} !~ /^[+-]$/; # y NaN?
1284 $x->{value} = $CALC->_gcd($x->{value},$y->{value}); last if $x->is_one();
0716bf9b 1285 }
9b924220 1286 $x;
58cde26e
JH
1287 }
1288
58cde26e
JH
1289sub bnot
1290 {
1291 # (num_str or BINT) return BINT
1292 # represent ~x as twos-complement number
ee15d750
JH
1293 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1294 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
1295
58cde26e 1296 return $x if $x->modify('bnot');
091c87b1 1297 $x->binc()->bneg(); # binc already does round
58cde26e
JH
1298 }
1299
091c87b1 1300##############################################################################
b3abae2a 1301# is_foo test routines
091c87b1 1302# we don't need $self, so undef instead of ref($_[0]) make it slightly faster
b3abae2a 1303
58cde26e
JH
1304sub is_zero
1305 {
1306 # return true if arg (BINT or num_str) is zero (array '+', '0')
ee15d750 1307 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
0716bf9b 1308
574bacfe 1309 return 0 if $x->{sign} !~ /^\+$/; # -, NaN & +-inf aren't
17baacb7 1310 $CALC->_is_zero($x->{value});
58cde26e
JH
1311 }
1312
1313sub is_nan
1314 {
1315 # return true if arg (BINT or num_str) is NaN
091c87b1 1316 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
ee15d750 1317
091c87b1 1318 $x->{sign} eq $nan ? 1 : 0;
58cde26e
JH
1319 }
1320
1321sub is_inf
1322 {
1323 # return true if arg (BINT or num_str) is +-inf
091c87b1 1324 my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
58cde26e 1325
091c87b1 1326 if (defined $sign)
ee15d750 1327 {
091c87b1
T
1328 $sign = '[+-]inf' if $sign eq ''; # +- doesn't matter, only that's inf
1329 $sign = "[$1]inf" if $sign =~ /^([+-])(inf)?$/; # extract '+' or '-'
1330 return $x->{sign} =~ /^$sign$/ ? 1 : 0;
ee15d750 1331 }
091c87b1 1332 $x->{sign} =~ /^[+-]inf$/ ? 1 : 0; # only +-inf is infinity
58cde26e
JH
1333 }
1334
1335sub is_one
1336 {
091c87b1 1337 # return true if arg (BINT or num_str) is +1, or -1 if sign is given
ee15d750
JH
1338 my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
1339
990fb837 1340 $sign = '+' if !defined $sign || $sign ne '-';
0716bf9b 1341
ee15d750 1342 return 0 if $x->{sign} ne $sign; # -1 != +1, NaN, +-inf aren't either
394e6ffb 1343 $CALC->_is_one($x->{value});
58cde26e
JH
1344 }
1345
1346sub is_odd
1347 {
1348 # return true when arg (BINT or num_str) is odd, false for even
ee15d750 1349 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
0716bf9b 1350
b22b3e31 1351 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
394e6ffb 1352 $CALC->_is_odd($x->{value});
58cde26e
JH
1353 }
1354
1355sub is_even
1356 {
1357 # return true when arg (BINT or num_str) is even, false for odd
ee15d750 1358 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
0716bf9b 1359
b22b3e31 1360 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
394e6ffb 1361 $CALC->_is_even($x->{value});
0716bf9b
JH
1362 }
1363
1364sub is_positive
1365 {
1366 # return true when arg (BINT or num_str) is positive (>= 0)
ee15d750
JH
1367 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1368
091c87b1 1369 $x->{sign} =~ /^\+/ ? 1 : 0; # +inf is also positive, but NaN not
0716bf9b
JH
1370 }
1371
1372sub is_negative
1373 {
1374 # return true when arg (BINT or num_str) is negative (< 0)
ee15d750
JH
1375 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1376
091c87b1 1377 $x->{sign} =~ /^-/ ? 1 : 0; # -inf is also negative, but NaN not
58cde26e
JH
1378 }
1379
b3abae2a
JH
1380sub is_int
1381 {
1382 # return true when arg (BINT or num_str) is an integer
091c87b1 1383 # always true for BigInt, but different for BigFloats
b3abae2a
JH
1384 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1385
1386 $x->{sign} =~ /^[+-]$/ ? 1 : 0; # inf/-inf/NaN aren't
1387 }
1388
0716bf9b
JH
1389###############################################################################
1390
58cde26e
JH
1391sub bmul
1392 {
1393 # multiply two numbers -- stolen from Knuth Vol 2 pg 233
1394 # (BINT or num_str, BINT or num_str) return BINT
f9a08e12
JH
1395
1396 # set up parameters
1397 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1398 # objectify is costly, so avoid it
1399 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1400 {
1401 ($self,$x,$y,@r) = objectify(2,@_);
1402 }
0716bf9b 1403
58cde26e 1404 return $x if $x->modify('bmul');
61f5c3f5 1405
574bacfe 1406 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
b3abae2a 1407
574bacfe
JH
1408 # inf handling
1409 if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
1410 {
b3abae2a 1411 return $x->bnan() if $x->is_zero() || $y->is_zero();
574bacfe
JH
1412 # result will always be +-inf:
1413 # +inf * +/+inf => +inf, -inf * -/-inf => +inf
1414 # +inf * -/-inf => -inf, -inf * +/+inf => -inf
1415 return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
1416 return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
1417 return $x->binf('-');
1418 }
9b924220
RGS
1419
1420 return $upgrade->bmul($x,$upgrade->new($y),@r)
1421 if defined $upgrade && !$y->isa($self);
9393ace2
JH
1422
1423 $r[3] = $y; # no push here
58cde26e 1424
0716bf9b 1425 $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
dccbb853 1426
b3abae2a
JH
1427 $x->{value} = $CALC->_mul($x->{value},$y->{value}); # do actual math
1428 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # no -0
f9a08e12
JH
1429
1430 $x->round(@r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
1431 $x;
dccbb853
JH
1432 }
1433
1434sub _div_inf
1435 {
1436 # helper function that handles +-inf cases for bdiv()/bmod() to reuse code
1437 my ($self,$x,$y) = @_;
1438
1439 # NaN if x == NaN or y == NaN or x==y==0
1440 return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan()
1441 if (($x->is_nan() || $y->is_nan()) ||
1442 ($x->is_zero() && $y->is_zero()));
1443
b3abae2a
JH
1444 # +-inf / +-inf == NaN, reminder also NaN
1445 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
dccbb853 1446 {
b3abae2a 1447 return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan();
dccbb853
JH
1448 }
1449 # x / +-inf => 0, remainder x (works even if x == 0)
1450 if ($y->{sign} =~ /^[+-]inf$/)
1451 {
f9a08e12 1452 my $t = $x->copy(); # bzero clobbers up $x
dccbb853
JH
1453 return wantarray ? ($x->bzero(),$t) : $x->bzero()
1454 }
1455
1456 # 5 / 0 => +inf, -6 / 0 => -inf
1457 # +inf / 0 = inf, inf, and -inf / 0 => -inf, -inf
1458 # exception: -8 / 0 has remainder -8, not 8
1459 # exception: -inf / 0 has remainder -inf, not inf
1460 if ($y->is_zero())
1461 {
1462 # +-inf / 0 => special case for -inf
1463 return wantarray ? ($x,$x->copy()) : $x if $x->is_inf();
1464 if (!$x->is_zero() && !$x->is_inf())
1465 {
1466 my $t = $x->copy(); # binf clobbers up $x
1467 return wantarray ?
1468 ($x->binf($x->{sign}),$t) : $x->binf($x->{sign})
1469 }
1470 }
1471
1472 # last case: +-inf / ordinary number
1473 my $sign = '+inf';
1474 $sign = '-inf' if substr($x->{sign},0,1) ne $y->{sign};
1475 $x->{sign} = $sign;
1476 return wantarray ? ($x,$self->bzero()) : $x;
58cde26e
JH
1477 }
1478
1479sub bdiv
1480 {
1481 # (dividend: BINT or num_str, divisor: BINT or num_str) return
1482 # (BINT,BINT) (quo,rem) or BINT (only rem)
f9a08e12
JH
1483
1484 # set up parameters
1485 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1486 # objectify is costly, so avoid it
1487 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1488 {
1489 ($self,$x,$y,@r) = objectify(2,@_);
1490 }
58cde26e
JH
1491
1492 return $x if $x->modify('bdiv');
1493
dccbb853
JH
1494 return $self->_div_inf($x,$y)
1495 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
58cde26e 1496
9393ace2
JH
1497 return $upgrade->bdiv($upgrade->new($x),$upgrade->new($y),@r)
1498 if defined $upgrade;
58cde26e 1499
990fb837
RGS
1500 $r[3] = $y; # no push!
1501
58cde26e 1502 # calc new sign and in case $y == +/- 1, return $x
dccbb853 1503 my $xsign = $x->{sign}; # keep
58cde26e 1504 $x->{sign} = ($x->{sign} ne $y->{sign} ? '-' : '+');
58cde26e 1505
58cde26e
JH
1506 if (wantarray)
1507 {
394e6ffb
JH
1508 my $rem = $self->bzero();
1509 ($x->{value},$rem->{value}) = $CALC->_div($x->{value},$y->{value});
1510 $x->{sign} = '+' if $CALC->_is_zero($x->{value});
f9a08e12
JH
1511 $rem->{_a} = $x->{_a};
1512 $rem->{_p} = $x->{_p};
990fb837 1513 $x->round(@r) if !exists $x->{_f} || ($x->{_f} & MB_NEVER_ROUND) == 0;
dccbb853
JH
1514 if (! $CALC->_is_zero($rem->{value}))
1515 {
1516 $rem->{sign} = $y->{sign};
990fb837 1517 $rem = $y->copy()->bsub($rem) if $xsign ne $y->{sign}; # one of them '-'
dccbb853
JH
1518 }
1519 else
1520 {
1521 $rem->{sign} = '+'; # dont leave -0
1522 }
990fb837
RGS
1523 $rem->round(@r) if !exists $rem->{_f} || ($rem->{_f} & MB_NEVER_ROUND) == 0;
1524 return ($x,$rem);
58cde26e 1525 }
394e6ffb
JH
1526
1527 $x->{value} = $CALC->_div($x->{value},$y->{value});
1528 $x->{sign} = '+' if $CALC->_is_zero($x->{value});
f9a08e12 1529
990fb837 1530 $x->round(@r) if !exists $x->{_f} || ($x->{_f} & MB_NEVER_ROUND) == 0;
f9a08e12 1531 $x;
58cde26e
JH
1532 }
1533
d614cd8b
JH
1534###############################################################################
1535# modulus functions
1536
dccbb853
JH
1537sub bmod
1538 {
1539 # modulus (or remainder)
1540 # (BINT or num_str, BINT or num_str) return BINT
f9a08e12
JH
1541
1542 # set up parameters
1543 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1544 # objectify is costly, so avoid it
1545 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1546 {
1547 ($self,$x,$y,@r) = objectify(2,@_);
1548 }
28df3e88 1549
dccbb853 1550 return $x if $x->modify('bmod');
61f5c3f5 1551 $r[3] = $y; # no push!
dccbb853
JH
1552 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero())
1553 {
1554 my ($d,$r) = $self->_div_inf($x,$y);
f9a08e12
JH
1555 $x->{sign} = $r->{sign};
1556 $x->{value} = $r->{value};
1557 return $x->round(@r);
dccbb853
JH
1558 }
1559
9b924220
RGS
1560 # calc new sign and in case $y == +/- 1, return $x
1561 $x->{value} = $CALC->_mod($x->{value},$y->{value});
1562 if (!$CALC->_is_zero($x->{value}))
dccbb853 1563 {
9b924220
RGS
1564 my $xsign = $x->{sign};
1565 $x->{sign} = $y->{sign};
1566 if ($xsign ne $y->{sign})
dccbb853 1567 {
9b924220
RGS
1568 my $t = $CALC->_copy($x->{value}); # copy $x
1569 $x->{value} = $CALC->_sub($y->{value},$t,1); # $y-$x
dccbb853
JH
1570 }
1571 }
9b924220 1572 else
b3abae2a 1573 {
9b924220 1574 $x->{sign} = '+'; # dont leave -0
b3abae2a 1575 }
9b924220 1576 $x->round(@r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
b3abae2a 1577 $x;
dccbb853
JH
1578 }
1579
07d34614 1580sub bmodinv
d614cd8b 1581 {
56d9de68 1582 # Modular inverse. given a number which is (hopefully) relatively
d614cd8b 1583 # prime to the modulus, calculate its inverse using Euclid's
56d9de68 1584 # alogrithm. If the number is not relatively prime to the modulus
d614cd8b
JH
1585 # (i.e. their gcd is not one) then NaN is returned.
1586
f9a08e12
JH
1587 # set up parameters
1588 my ($self,$x,$y,@r) = (ref($_[0]),@_);
56d9de68 1589 # objectify is costly, so avoid it
f9a08e12
JH
1590 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1591 {
1592 ($self,$x,$y,@r) = objectify(2,@_);
56d9de68 1593 }
d614cd8b 1594
f9a08e12 1595 return $x if $x->modify('bmodinv');
d614cd8b 1596
f9a08e12 1597 return $x->bnan()
56d9de68
T
1598 if ($y->{sign} ne '+' # -, NaN, +inf, -inf
1599 || $x->is_zero() # or num == 0
1600 || $x->{sign} !~ /^[+-]$/ # or num NaN, inf, -inf
d614cd8b 1601 );
1ddff52a 1602
f9a08e12
JH
1603 # put least residue into $x if $x was negative, and thus make it positive
1604 $x->bmod($y) if $x->{sign} eq '-';
07d34614 1605
9b924220
RGS
1606 my $sign;
1607 ($x->{value},$sign) = $CALC->_modinv($x->{value},$y->{value});
1608 return $x->bnan() if !defined $x->{value}; # in case no GCD found
1609 return $x if !defined $sign; # already real result
1610 $x->{sign} = $sign; # flip/flop see below
1611 $x->bmod($y); # calc real result
1612 $x;
d614cd8b
JH
1613 }
1614
07d34614 1615sub bmodpow
d614cd8b
JH
1616 {
1617 # takes a very large number to a very large exponent in a given very
1618 # large modulus, quickly, thanks to binary exponentation. supports
1619 # negative exponents.
1620 my ($self,$num,$exp,$mod,@r) = objectify(3,@_);
1621
1622 return $num if $num->modify('bmodpow');
1623
1624 # check modulus for valid values
1625 return $num->bnan() if ($mod->{sign} ne '+' # NaN, - , -inf, +inf
1626 || $mod->is_zero());
1627
1628 # check exponent for valid values
1629 if ($exp->{sign} =~ /\w/)
1630 {
1631 # i.e., if it's NaN, +inf, or -inf...
1632 return $num->bnan();
1633 }
07d34614 1634
1ddff52a 1635 $num->bmodinv ($mod) if ($exp->{sign} eq '-');
d614cd8b 1636
1ddff52a 1637 # check num for valid values (also NaN if there was no inverse but $exp < 0)
07d34614 1638 return $num->bnan() if $num->{sign} !~ /^[+-]$/;
d614cd8b 1639
9b924220
RGS
1640 # $mod is positive, sign on $exp is ignored, result also positive
1641 $num->{value} = $CALC->_modpow($num->{value},$exp->{value},$mod->{value});
1642 $num;
d614cd8b
JH
1643 }
1644
1645###############################################################################
1646
b3abae2a
JH
1647sub bfac
1648 {
1649 # (BINT or num_str, BINT or num_str) return BINT
091c87b1 1650 # compute factorial number from $x, modify $x in place
f9a08e12 1651 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
b3abae2a
JH
1652
1653 return $x if $x->modify('bfac');
1654
b282a552
T
1655 return $x if $x->{sign} eq '+inf'; # inf => inf
1656 return $x->bnan() if $x->{sign} ne '+'; # NaN, <0 etc => NaN
b3abae2a 1657
9b924220
RGS
1658 $x->{value} = $CALC->_fac($x->{value});
1659 $x->round(@r);
b3abae2a
JH
1660 }
1661
58cde26e
JH
1662sub bpow
1663 {
1664 # (BINT or num_str, BINT or num_str) return BINT
1665 # compute power of two numbers -- stolen from Knuth Vol 2 pg 233
1666 # modifies first argument
aef458a0 1667
f9a08e12
JH
1668 # set up parameters
1669 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1670 # objectify is costly, so avoid it
1671 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1672 {
1673 ($self,$x,$y,@r) = objectify(2,@_);
1674 }
58cde26e
JH
1675
1676 return $x if $x->modify('bpow');
9393ace2 1677
2d2b2744
T
1678 return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
1679
1680 # inf handling
1681 if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
1682 {
1683 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
1684 {
1685 # +-inf ** +-inf
1686 return $x->bnan();
1687 }
1688 # +-inf ** Y
1689 if ($x->{sign} =~ /^[+-]inf/)
1690 {
1691 # +inf ** 0 => NaN
1692 return $x->bnan() if $y->is_zero();
1693 # -inf ** -1 => 1/inf => 0
1694 return $x->bzero() if $y->is_one('-') && $x->is_negative();
1695
1696 # +inf ** Y => inf
1697 return $x if $x->{sign} eq '+inf';
1698
1699 # -inf ** Y => -inf if Y is odd
1700 return $x if $y->is_odd();
1701 return $x->babs();
1702 }
1703 # X ** +-inf
1704
1705 # 1 ** +inf => 1
1706 return $x if $x->is_one();
1707
1708 # 0 ** inf => 0
1709 return $x if $x->is_zero() && $y->{sign} =~ /^[+]/;
1710
1711 # 0 ** -inf => inf
1712 return $x->binf() if $x->is_zero();
1713
1714 # -1 ** -inf => NaN
1715 return $x->bnan() if $x->is_one('-') && $y->{sign} =~ /^[-]/;
1716
1717 # -X ** -inf => 0
1718 return $x->bzero() if $x->{sign} eq '-' && $y->{sign} =~ /^[-]/;
1719
1720 # -1 ** inf => NaN
1721 return $x->bnan() if $x->{sign} eq '-';
1722
1723 # X ** inf => inf
1724 return $x->binf() if $y->{sign} =~ /^[+]/;
1725 # X ** -inf => 0
1726 return $x->bzero();
1727 }
1728
9393ace2 1729 return $upgrade->bpow($upgrade->new($x),$y,@r)
8f675a64 1730 if defined $upgrade && !$y->isa($self);
9393ace2 1731
61f5c3f5 1732 $r[3] = $y; # no push!
b282a552
T
1733
1734 # cases 0 ** Y, X ** 0, X ** 1, 1 ** Y are handled by Calc or Emu
1735
9b924220
RGS
1736 my $new_sign = '+';
1737 $new_sign = $y->is_odd() ? '-' : '+' if ($x->{sign} ne '+');
1738
1739 # 0 ** -7 => ( 1 / (0 ** 7)) => 1 / 0 => +inf
1740 return $x->binf()
1741 if $y->{sign} eq '-' && $x->{sign} eq '+' && $CALC->_is_zero($x->{value});
574bacfe
JH
1742 # 1 ** -y => 1 / (1 ** |y|)
1743 # so do test for negative $y after above's clause
9b924220 1744 return $x->bnan() if $y->{sign} eq '-' && !$CALC->_is_one($x->{value});
027dc388 1745
9b924220
RGS
1746 $x->{value} = $CALC->_pow($x->{value},$y->{value});
1747 $x->{sign} = $new_sign;
1748 $x->{sign} = '+' if $CALC->_is_zero($y->{value});
1749 $x->round(@r) if !exists $x->{_f} || $x->{_f} & MB_NEVER_ROUND == 0;
1750 $x;
58cde26e
JH
1751 }
1752
1753sub blsft
1754 {
1755 # (BINT or num_str, BINT or num_str) return BINT
1756 # compute x << y, base n, y >= 0
f9a08e12
JH
1757
1758 # set up parameters
1759 my ($self,$x,$y,$n,@r) = (ref($_[0]),@_);
1760 # objectify is costly, so avoid it
1761 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1762 {
1763 ($self,$x,$y,$n,@r) = objectify(2,@_);
1764 }
1765
58cde26e
JH
1766 return $x if $x->modify('blsft');
1767 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
f9a08e12 1768 return $x->round(@r) if $y->is_zero();
58cde26e 1769
574bacfe
JH
1770 $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
1771
9b924220
RGS
1772 $x->{value} = $CALC->_lsft($x->{value},$y->{value},$n);
1773 $x->round(@r);
58cde26e
JH
1774 }
1775
1776sub brsft
1777 {
1778 # (BINT or num_str, BINT or num_str) return BINT
1779 # compute x >> y, base n, y >= 0
f9a08e12
JH
1780
1781 # set up parameters
1782 my ($self,$x,$y,$n,@r) = (ref($_[0]),@_);
1783 # objectify is costly, so avoid it
1784 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1785 {
1786 ($self,$x,$y,$n,@r) = objectify(2,@_);
1787 }
58cde26e
JH
1788
1789 return $x if $x->modify('brsft');
1790 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
f9a08e12
JH
1791 return $x->round(@r) if $y->is_zero();
1792 return $x->bzero(@r) if $x->is_zero(); # 0 => 0
58cde26e
JH
1793
1794 $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
574bacfe 1795
b3abae2a
JH
1796 # this only works for negative numbers when shifting in base 2
1797 if (($x->{sign} eq '-') && ($n == 2))
1798 {
f9a08e12 1799 return $x->round(@r) if $x->is_one('-'); # -1 => -1
b3abae2a
JH
1800 if (!$y->is_one())
1801 {
1802 # although this is O(N*N) in calc (as_bin!) it is O(N) in Pari et al
1803 # but perhaps there is a better emulation for two's complement shift...
1804 # if $y != 1, we must simulate it by doing:
1805 # convert to bin, flip all bits, shift, and be done
1806 $x->binc(); # -3 => -2
1807 my $bin = $x->as_bin();
1808 $bin =~ s/^-0b//; # strip '-0b' prefix
1809 $bin =~ tr/10/01/; # flip bits
1810 # now shift
8f675a64 1811 if (CORE::length($bin) <= $y)
b3abae2a
JH
1812 {
1813 $bin = '0'; # shifting to far right creates -1
1814 # 0, because later increment makes
1815 # that 1, attached '-' makes it '-1'
1816 # because -1 >> x == -1 !
1817 }
1818 else
1819 {
1820 $bin =~ s/.{$y}$//; # cut off at the right side
1821 $bin = '1' . $bin; # extend left side by one dummy '1'
1822 $bin =~ tr/10/01/; # flip bits back
1823 }
1824 my $res = $self->new('0b'.$bin); # add prefix and convert back
1825 $res->binc(); # remember to increment
1826 $x->{value} = $res->{value}; # take over value
f9a08e12 1827 return $x->round(@r); # we are done now, magic, isn't?
b3abae2a 1828 }
b282a552 1829 # x < 0, n == 2, y == 1
b3abae2a
JH
1830 $x->bdec(); # n == 2, but $y == 1: this fixes it
1831 }
1832
9b924220
RGS
1833 $x->{value} = $CALC->_rsft($x->{value},$y->{value},$n);
1834 $x->round(@r);
58cde26e
JH
1835 }
1836
1837sub band
1838 {
1839 #(BINT or num_str, BINT or num_str) return BINT
1840 # compute x & y
f9a08e12
JH
1841
1842 # set up parameters
1843 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1844 # objectify is costly, so avoid it
1845 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1846 {
1847 ($self,$x,$y,@r) = objectify(2,@_);
1848 }
58cde26e
JH
1849
1850 return $x if $x->modify('band');
1851
f9a08e12 1852 $r[3] = $y; # no push!
b3abae2a 1853
58cde26e 1854 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
0716bf9b 1855
b282a552
T
1856 my $sx = $x->{sign} eq '+' ? 1 : -1;
1857 my $sy = $y->{sign} eq '+' ? 1 : -1;
574bacfe 1858
9b924220 1859 if ($sx == 1 && $sy == 1)
0716bf9b 1860 {
574bacfe 1861 $x->{value} = $CALC->_and($x->{value},$y->{value});
f9a08e12 1862 return $x->round(@r);
0716bf9b 1863 }
091c87b1
T
1864
1865 if ($CAN{signed_and})
1866 {
1867 $x->{value} = $CALC->_signed_and($x->{value},$y->{value},$sx,$sy);
1868 return $x->round(@r);
1869 }
b282a552
T
1870
1871 require $EMU_LIB;
1872 __emu_band($self,$x,$y,$sx,$sy,@r);
58cde26e
JH
1873 }
1874
1875sub bior
1876 {
1877 #(BINT or num_str, BINT or num_str) return BINT
1878 # compute x | y
f9a08e12
JH
1879
1880 # set up parameters
1881 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1882 # objectify is costly, so avoid it
1883 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1884 {
1885 ($self,$x,$y,@r) = objectify(2,@_);
1886 }
58cde26e
JH
1887
1888 return $x if $x->modify('bior');
f9a08e12 1889 $r[3] = $y; # no push!
58cde26e
JH
1890
1891 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
574bacfe 1892
b282a552
T
1893 my $sx = $x->{sign} eq '+' ? 1 : -1;
1894 my $sy = $y->{sign} eq '+' ? 1 : -1;
574bacfe 1895
091c87b1
T
1896 # the sign of X follows the sign of X, e.g. sign of Y irrelevant for bior()
1897
574bacfe 1898 # don't use lib for negative values
9b924220 1899 if ($sx == 1 && $sy == 1)
0716bf9b 1900 {
574bacfe 1901 $x->{value} = $CALC->_or($x->{value},$y->{value});
f9a08e12 1902 return $x->round(@r);
0716bf9b
JH
1903 }
1904
b282a552 1905 # if lib can do negative values, let it handle this
091c87b1
T
1906 if ($CAN{signed_or})
1907 {
1908 $x->{value} = $CALC->_signed_or($x->{value},$y->{value},$sx,$sy);
1909 return $x->round(@r);
1910 }
1911
b282a552
T
1912 require $EMU_LIB;
1913 __emu_bior($self,$x,$y,$sx,$sy,@r);
58cde26e
JH
1914 }
1915
1916sub bxor
1917 {
1918 #(BINT or num_str, BINT or num_str) return BINT
1919 # compute x ^ y
f9a08e12
JH
1920
1921 # set up parameters
1922 my ($self,$x,$y,@r) = (ref($_[0]),@_);
1923 # objectify is costly, so avoid it
1924 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1925 {
1926 ($self,$x,$y,@r) = objectify(2,@_);
1927 }
58cde26e
JH
1928
1929 return $x if $x->modify('bxor');
f9a08e12 1930 $r[3] = $y; # no push!
58cde26e 1931
0716bf9b 1932 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
0716bf9b 1933
b282a552
T
1934 my $sx = $x->{sign} eq '+' ? 1 : -1;
1935 my $sy = $y->{sign} eq '+' ? 1 : -1;
574bacfe
JH
1936
1937 # don't use lib for negative values
9b924220 1938 if ($sx == 1 && $sy == 1)
0716bf9b 1939 {
574bacfe 1940 $x->{value} = $CALC->_xor($x->{value},$y->{value});
f9a08e12 1941 return $x->round(@r);
0716bf9b 1942 }
091c87b1 1943
b282a552 1944 # if lib can do negative values, let it handle this
091c87b1
T
1945 if ($CAN{signed_xor})
1946 {
1947 $x->{value} = $CALC->_signed_xor($x->{value},$y->{value},$sx,$sy);
1948 return $x->round(@r);
1949 }
0716bf9b 1950
b282a552
T
1951 require $EMU_LIB;
1952 __emu_bxor($self,$x,$y,$sx,$sy,@r);
58cde26e
JH
1953 }
1954
1955sub length
1956 {
b282a552 1957 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
58cde26e 1958
0716bf9b 1959 my $e = $CALC->_len($x->{value});
091c87b1 1960 wantarray ? ($e,0) : $e;
58cde26e
JH
1961 }
1962
1963sub digit
1964 {
0716bf9b 1965 # return the nth decimal digit, negative values count backward, 0 is right
ef9466ea 1966 my ($self,$x,$n) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
58cde26e 1967
ef9466ea 1968 $n = $n->numify() if ref($n);
f9a08e12 1969 $CALC->_digit($x->{value},$n||0);
58cde26e
JH
1970 }
1971
1972sub _trailing_zeros
1973 {
b282a552 1974 # return the amount of trailing zeros in $x (as scalar)
58cde26e
JH
1975 my $x = shift;
1976 $x = $class->new($x) unless ref $x;
1977
9b924220 1978 return 0 if $x->{sign} !~ /^[+-]$/; # NaN, inf, -inf etc
0716bf9b 1979
9b924220 1980 $CALC->_zeros($x->{value}); # must handle odd values, 0 etc
58cde26e
JH
1981 }
1982
1983sub bsqrt
1984 {
990fb837 1985 # calculate square root of $x
f9a08e12 1986 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
58cde26e 1987
b3abae2a
JH
1988 return $x if $x->modify('bsqrt');
1989
990fb837
RGS
1990 return $x->bnan() if $x->{sign} !~ /^\+/; # -x or -inf or NaN => NaN
1991 return $x if $x->{sign} eq '+inf'; # sqrt(+inf) == inf
b3abae2a 1992
f9a08e12 1993 return $upgrade->bsqrt($x,@r) if defined $upgrade;
58cde26e 1994
9b924220
RGS
1995 $x->{value} = $CALC->_sqrt($x->{value});
1996 $x->round(@r);
58cde26e
JH
1997 }
1998
990fb837
RGS
1999sub broot
2000 {
2001 # calculate $y'th root of $x
c38b2de2 2002
990fb837
RGS
2003 # set up parameters
2004 my ($self,$x,$y,@r) = (ref($_[0]),@_);
c38b2de2
JH
2005
2006 $y = $self->new(2) unless defined $y;
2007
990fb837 2008 # objectify is costly, so avoid it
c38b2de2 2009 if ((!ref($x)) || (ref($x) ne ref($y)))
990fb837 2010 {
3a427a11 2011 ($self,$x,$y,@r) = objectify(2,$self || $class,@_);
990fb837
RGS
2012 }
2013
2014 return $x if $x->modify('broot');
2015
2016 # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
2017 return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
2018 $y->{sign} !~ /^\+$/;
2019
2020 return $x->round(@r)
2021 if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
2022
c38b2de2 2023 return $upgrade->new($x)->broot($upgrade->new($y),@r) if defined $upgrade;
990fb837 2024
9b924220
RGS
2025 $x->{value} = $CALC->_root($x->{value},$y->{value});
2026 $x->round(@r);
990fb837
RGS
2027 }
2028
58cde26e
JH
2029sub exponent
2030 {
2031 # return a copy of the exponent (here always 0, NaN or 1 for $m == 0)
ee15d750 2032 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
58cde26e 2033
ee15d750
JH
2034 if ($x->{sign} !~ /^[+-]$/)
2035 {
b282a552
T
2036 my $s = $x->{sign}; $s =~ s/^[+-]//; # NaN, -inf,+inf => NaN or inf
2037 return $self->new($s);
ee15d750 2038 }
b282a552
T
2039 return $self->bone() if $x->is_zero();
2040
2041 $self->new($x->_trailing_zeros());
58cde26e
JH
2042 }
2043
2044sub mantissa
2045 {
ee15d750
JH
2046 # return the mantissa (compatible to Math::BigFloat, e.g. reduced)
2047 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
58cde26e 2048
ee15d750
JH
2049 if ($x->{sign} !~ /^[+-]$/)
2050 {
b282a552
T
2051 # for NaN, +inf, -inf: keep the sign
2052 return $self->new($x->{sign});
ee15d750 2053 }
b282a552
T
2054 my $m = $x->copy(); delete $m->{_p}; delete $m->{_a};
2055 # that's a bit inefficient:
58cde26e 2056 my $zeros = $m->_trailing_zeros();
56b9c951 2057 $m->brsft($zeros,10) if $zeros != 0;
56b9c951 2058 $m;
58cde26e
JH
2059 }
2060
2061sub parts
2062 {
ee15d750 2063 # return a copy of both the exponent and the mantissa
091c87b1 2064 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
58cde26e 2065
091c87b1 2066 ($x->mantissa(),$x->exponent());
58cde26e
JH
2067 }
2068
2069##############################################################################
2070# rounding functions
2071
2072sub bfround
2073 {
2074 # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
ee15d750 2075 # $n == 0 || $n == 1 => round to integer
ef9466ea 2076 my $x = shift; my $self = ref($x) || $x; $x = $self->new($x) unless ref $x;
b282a552 2077
dccbb853 2078 my ($scale,$mode) = $x->_scale_p($x->precision(),$x->round_mode(),@_);
b282a552
T
2079
2080 return $x if !defined $scale || $x->modify('bfround'); # no-op
58cde26e
JH
2081
2082 # no-op for BigInts if $n <= 0
b282a552 2083 $x->bround( $x->length()-$scale, $mode) if $scale > 0;
58cde26e 2084
ef9466ea
T
2085 delete $x->{_a}; # delete to save memory
2086 $x->{_p} = $scale; # store new _p
ee15d750 2087 $x;
58cde26e
JH
2088 }
2089
2090sub _scan_for_nonzero
2091 {
ae161977
RGS
2092 # internal, used by bround() to scan for non-zeros after a '5'
2093 my ($x,$pad,$xs,$len) = @_;
58cde26e 2094
ae161977 2095 return 0 if $len == 1; # "5" is trailed by invisible zeros
58cde26e
JH
2096 my $follow = $pad - 1;
2097 return 0 if $follow > $len || $follow < 1;
0716bf9b 2098
ae161977
RGS
2099 # use the string form to check whether only '0's follow or not
2100 substr ($xs,-$follow) =~ /[^0]/ ? 1 : 0;
58cde26e
JH
2101 }
2102
2103sub fround
2104 {
091c87b1
T
2105 # Exists to make life easier for switch between MBF and MBI (should we
2106 # autoload fxxx() like MBF does for bxxx()?)
58cde26e 2107 my $x = shift;
091c87b1 2108 $x->bround(@_);
58cde26e
JH
2109 }
2110
2111sub bround
2112 {
2113 # accuracy: +$n preserve $n digits from left,
2114 # -$n preserve $n digits from right (f.i. for 0.1234 style in MBF)
2115 # no-op for $n == 0
2116 # and overwrite the rest with 0's, return normalized number
2117 # do not return $x->bnorm(), but $x
61f5c3f5 2118
58cde26e 2119 my $x = shift; $x = $class->new($x) unless ref $x;
dccbb853 2120 my ($scale,$mode) = $x->_scale_a($x->accuracy(),$x->round_mode(),@_);
61f5c3f5 2121 return $x if !defined $scale; # no-op
b3abae2a 2122 return $x if $x->modify('bround');
58cde26e 2123
61f5c3f5
T
2124 if ($x->is_zero() || $scale == 0)
2125 {
2126 $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
2127 return $x;
2128 }
2129 return $x if $x->{sign} !~ /^[+-]$/; # inf, NaN
58cde26e
JH
2130
2131 # we have fewer digits than we want to scale to
2132 my $len = $x->length();
56d9de68
T
2133 # convert $scale to a scalar in case it is an object (put's a limit on the
2134 # number length, but this would already limited by memory constraints), makes
2135 # it faster
2136 $scale = $scale->numify() if ref ($scale);
2137
ee15d750
JH
2138 # scale < 0, but > -len (not >=!)
2139 if (($scale < 0 && $scale < -$len-1) || ($scale >= $len))
2140 {
61f5c3f5 2141 $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
ee15d750
JH
2142 return $x;
2143 }
58cde26e
JH
2144
2145 # count of 0's to pad, from left (+) or right (-): 9 - +6 => 3, or |-6| => 6
2146 my ($pad,$digit_round,$digit_after);
2147 $pad = $len - $scale;
ee15d750
JH
2148 $pad = abs($scale-1) if $scale < 0;
2149
ae161977
RGS
2150 # do not use digit(), it is very costly for binary => decimal
2151 # getting the entire string is also costly, but we need to do it only once
0716bf9b
JH
2152 my $xs = $CALC->_str($x->{value});
2153 my $pl = -$pad-1;
56d9de68 2154
0716bf9b
JH
2155 # pad: 123: 0 => -1, at 1 => -2, at 2 => -3, at 3 => -4
2156 # pad+1: 123: 0 => 0, at 1 => -1, at 2 => -2, at 3 => -3
9b924220 2157 $digit_round = '0'; $digit_round = substr($xs,$pl,1) if $pad <= $len;
0716bf9b 2158 $pl++; $pl ++ if $pad >= $len;
9b924220 2159 $digit_after = '0'; $digit_after = substr($xs,$pl,1) if $pad > 0;
ee15d750 2160
58cde26e
JH
2161 # in case of 01234 we round down, for 6789 up, and only in case 5 we look
2162 # closer at the remaining digits of the original $x, remember decision
2163 my $round_up = 1; # default round up
2164 $round_up -- if
2165 ($mode eq 'trunc') || # trunc by round down
2166 ($digit_after =~ /[01234]/) || # round down anyway,
2167 # 6789 => round up
2168 ($digit_after eq '5') && # not 5000...0000
ae161977 2169 ($x->_scan_for_nonzero($pad,$xs,$len) == 0) &&
58cde26e
JH
2170 (
2171 ($mode eq 'even') && ($digit_round =~ /[24680]/) ||
2172 ($mode eq 'odd') && ($digit_round =~ /[13579]/) ||
2173 ($mode eq '+inf') && ($x->{sign} eq '-') ||
2174 ($mode eq '-inf') && ($x->{sign} eq '+') ||
2175 ($mode eq 'zero') # round down if zero, sign adjusted below
2176 );
61f5c3f5
T
2177 my $put_back = 0; # not yet modified
2178
61f5c3f5
T
2179 if (($pad > 0) && ($pad <= $len))
2180 {
ae161977
RGS
2181 substr($xs,-$pad,$pad) = '0' x $pad; # replace with '00...'
2182 $put_back = 1; # need to put back
58cde26e 2183 }
61f5c3f5
T
2184 elsif ($pad > $len)
2185 {
2186 $x->bzero(); # round to '0'
2187 }
2188
58cde26e
JH
2189 if ($round_up) # what gave test above?
2190 {
ae161977 2191 $put_back = 1; # need to put back
9b924220 2192 $pad = $len, $xs = '0' x $pad if $scale < 0; # tlr: whack 0.51=>1.0
61f5c3f5
T
2193
2194 # we modify directly the string variant instead of creating a number and
f9a08e12 2195 # adding it, since that is faster (we already have the string)
61f5c3f5
T
2196 my $c = 0; $pad ++; # for $pad == $len case
2197 while ($pad <= $len)
2198 {
9b924220
RGS
2199 $c = substr($xs,-$pad,1) + 1; $c = '0' if $c eq '10';
2200 substr($xs,-$pad,1) = $c; $pad++;
61f5c3f5
T
2201 last if $c != 0; # no overflow => early out
2202 }
9b924220 2203 $xs = '1'.$xs if $c == 0;
61f5c3f5 2204
58cde26e 2205 }
ae161977 2206 $x->{value} = $CALC->_new($xs) if $put_back == 1; # put back, if needed
ee15d750
JH
2207
2208 $x->{_a} = $scale if $scale >= 0;
2209 if ($scale < 0)
2210 {
2211 $x->{_a} = $len+$scale;
2212 $x->{_a} = 0 if $scale < -$len;
2213 }
58cde26e
JH
2214 $x;
2215 }
2216
2217sub bfloor
2218 {
091c87b1
T
2219 # return integer less or equal then number; no-op since it's already integer
2220 my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
58cde26e 2221
f9a08e12 2222 $x->round(@r);
58cde26e
JH
2223 }
2224
2225sub bceil
2226 {
091c87b1
T
2227 # return integer greater or equal then number; no-op since it's already int
2228 my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
58cde26e 2229
f9a08e12 2230 $x->round(@r);
58cde26e
JH
2231 }
2232
091c87b1
T
2233sub as_number
2234 {
2235 # An object might be asked to return itself as bigint on certain overloaded
2236 # operations, this does exactly this, so that sub classes can simple inherit
2237 # it or override with their own integer conversion routine.
2238 $_[0]->copy();
2239 }
58cde26e 2240
091c87b1 2241sub as_hex
58cde26e 2242 {
091c87b1
T
2243 # return as hex string, with prefixed 0x
2244 my $x = shift; $x = $class->new($x) if !ref($x);
2245
2246 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2247
b282a552 2248 my $s = '';
091c87b1 2249 $s = $x->{sign} if $x->{sign} eq '-';
9b924220 2250 $s . $CALC->_as_hex($x->{value});
58cde26e
JH
2251 }
2252
091c87b1 2253sub as_bin
58cde26e 2254 {
091c87b1
T
2255 # return as binary string, with prefixed 0b
2256 my $x = shift; $x = $class->new($x) if !ref($x);
2257
2258 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2259
b282a552 2260 my $s = ''; $s = $x->{sign} if $x->{sign} eq '-';
9b924220 2261 return $s . $CALC->_as_bin($x->{value});
58cde26e
JH
2262 }
2263
091c87b1
T
2264##############################################################################
2265# private stuff (internal use only)
2266
58cde26e
JH
2267sub objectify
2268 {
2269 # check for strings, if yes, return objects instead
2270
2271 # the first argument is number of args objectify() should look at it will
2272 # return $count+1 elements, the first will be a classname. This is because
2273 # overloaded '""' calls bstr($object,undef,undef) and this would result in
2274 # useless objects beeing created and thrown away. So we cannot simple loop
2275 # over @_. If the given count is 0, all arguments will be used.
2276
2277 # If the second arg is a ref, use it as class.
2278 # If not, try to use it as classname, unless undef, then use $class
2279 # (aka Math::BigInt). The latter shouldn't happen,though.
2280
2281 # caller: gives us:
2282 # $x->badd(1); => ref x, scalar y
2283 # Class->badd(1,2); => classname x (scalar), scalar x, scalar y
2284 # Class->badd( Class->(1),2); => classname x (scalar), ref x, scalar y
2285 # Math::BigInt::badd(1,2); => scalar x, scalar y
2286 # In the last case we check number of arguments to turn it silently into
574bacfe 2287 # $class,1,2. (We can not take '1' as class ;o)
58cde26e
JH
2288 # badd($class,1) is not supported (it should, eventually, try to add undef)
2289 # currently it tries 'Math::BigInt' + 1, which will not work.
ee15d750
JH
2290
2291 # some shortcut for the common cases
ee15d750
JH
2292 # $x->unary_op();
2293 return (ref($_[1]),$_[1]) if (@_ == 2) && ($_[0]||0 == 1) && ref($_[1]);
ee15d750 2294
58cde26e
JH
2295 my $count = abs(shift || 0);
2296
9393ace2 2297 my (@a,$k,$d); # resulting array, temp, and downgrade
58cde26e
JH
2298 if (ref $_[0])
2299 {
2300 # okay, got object as first
2301 $a[0] = ref $_[0];
2302 }
2303 else
2304 {
2305 # nope, got 1,2 (Class->xxx(1) => Class,1 and not supported)
2306 $a[0] = $class;
58cde26e
JH
2307 $a[0] = shift if $_[0] =~ /^[A-Z].*::/; # classname as first?
2308 }
8f675a64 2309
9393ace2
JH
2310 no strict 'refs';
2311 # disable downgrading, because Math::BigFLoat->foo('1.0','2.0') needs floats
2312 if (defined ${"$a[0]::downgrade"})
2313 {
2314 $d = ${"$a[0]::downgrade"};
2315 ${"$a[0]::downgrade"} = undef;
2316 }
2317
d614cd8b 2318 my $up = ${"$a[0]::upgrade"};
c38b2de2 2319 #print "Now in objectify, my class is today $a[0], count = $count\n";
58cde26e
JH
2320 if ($count == 0)
2321 {
2322 while (@_)
2323 {
2324 $k = shift;
2325 if (!ref($k))
2326 {
2327 $k = $a[0]->new($k);
2328 }
d614cd8b 2329 elsif (!defined $up && ref($k) ne $a[0])
58cde26e
JH
2330 {
2331 # foreign object, try to convert to integer
2332 $k->can('as_number') ? $k = $k->as_number() : $k = $a[0]->new($k);
e16b8f49 2333 }
58cde26e
JH
2334 push @a,$k;
2335 }
2336 }
2337 else
2338 {
2339 while ($count > 0)
2340 {
58cde26e
JH
2341 $count--;
2342 $k = shift;
2343 if (!ref($k))
2344 {
2345 $k = $a[0]->new($k);
2346 }
d614cd8b 2347 elsif (!defined $up && ref($k) ne $a[0])
58cde26e
JH
2348 {
2349 # foreign object, try to convert to integer
2350 $k->can('as_number') ? $k = $k->as_number() : $k = $a[0]->new($k);
e16b8f49 2351 }
58cde26e
JH
2352 push @a,$k;
2353 }
2354 push @a,@_; # return other params, too
2355 }
990fb837
RGS
2356 if (! wantarray)
2357 {
2358 require Carp; Carp::croak ("$class objectify needs list context");
2359 }
9393ace2 2360 ${"$a[0]::downgrade"} = $d;
58cde26e
JH
2361 @a;
2362 }
2363
2364sub import
2365 {
2366 my $self = shift;
61f5c3f5 2367
091c87b1 2368 $IMPORT++; # remember we did import()
8f675a64
JH
2369 my @a; my $l = scalar @_;
2370 for ( my $i = 0; $i < $l ; $i++ )
58cde26e 2371 {
0716bf9b 2372 if ($_[$i] eq ':constant')
58cde26e 2373 {
0716bf9b 2374 # this causes overlord er load to step in
091c87b1
T
2375 overload::constant
2376 integer => sub { $self->new(shift) },
2377 binary => sub { $self->new(shift) };
0716bf9b 2378 }
b3abae2a
JH
2379 elsif ($_[$i] eq 'upgrade')
2380 {
2381 # this causes upgrading
2382 $upgrade = $_[$i+1]; # or undef to disable
8f675a64 2383 $i++;
b3abae2a 2384 }
0716bf9b
JH
2385 elsif ($_[$i] =~ /^lib$/i)
2386 {
2387 # this causes a different low lib to take care...
61f5c3f5 2388 $CALC = $_[$i+1] || '';
8f675a64
JH
2389 $i++;
2390 }
2391 else
2392 {
2393 push @a, $_[$i];
58cde26e
JH
2394 }
2395 }
2396 # any non :constant stuff is handled by our parent, Exporter
2397 # even if @_ is empty, to give it a chance
dccbb853
JH
2398 $self->SUPER::import(@a); # need it for subclasses
2399 $self->export_to_level(1,$self,@a); # need it for MBF
58cde26e 2400
574bacfe
JH
2401 # try to load core math lib
2402 my @c = split /\s*,\s*/,$CALC;
2403 push @c,'Calc'; # if all fail, try this
61f5c3f5 2404 $CALC = ''; # signal error
574bacfe
JH
2405 foreach my $lib (@c)
2406 {
07d34614 2407 next if ($lib || '') eq '';
574bacfe
JH
2408 $lib = 'Math::BigInt::'.$lib if $lib !~ /^Math::BigInt/i;
2409 $lib =~ s/\.pm$//;
61f5c3f5 2410 if ($] < 5.006)
574bacfe
JH
2411 {
2412 # Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is
2413 # used in the same script, or eval inside import().
07d34614
T
2414 my @parts = split /::/, $lib; # Math::BigInt => Math BigInt
2415 my $file = pop @parts; $file .= '.pm'; # BigInt => BigInt.pm
2416 require File::Spec;
2417 $file = File::Spec->catfile (@parts, $file);
2418 eval { require "$file"; $lib->import( @c ); }
574bacfe
JH
2419 }
2420 else
2421 {
61f5c3f5 2422 eval "use $lib qw/@c/;";
574bacfe 2423 }
9b924220
RGS
2424 if ($@ eq '')
2425 {
2426 my $ok = 1;
2427 # loaded it ok, see if the api_version() is high enough
2428 if ($lib->can('api_version') && $lib->api_version() >= 1.0)
2429 {
2430 $ok = 0;
2431 # api_version matches, check if it really provides anything we need
2432 for my $method (qw/
2433 one two ten
2434 str num
2435 add mul div sub dec inc
2436 acmp len digit is_one is_zero is_even is_odd
2437 is_two is_ten
2438 new copy check from_hex from_bin as_hex as_bin zeros
2439 rsft lsft xor and or
2440 mod sqrt root fac pow modinv modpow log_int gcd
2441 /)
2442 {
2443 if (!$lib->can("_$method"))
2444 {
2445 if (($WARN{$lib}||0) < 2)
2446 {
2447 require Carp;
2448 Carp::carp ("$lib is missing method '_$method'");
2449 $WARN{$lib} = 1; # still warn about the lib
2450 }
2451 $ok++; last;
2452 }
2453 }
2454 }
2455 if ($ok == 0)
2456 {
2457 $CALC = $lib;
2458 last; # found a usable one, break
2459 }
2460 else
2461 {
2462 if (($WARN{$lib}||0) < 2)
2463 {
2464 my $ver = eval "\$$lib\::VERSION";
2465 require Carp;
2466 Carp::carp ("Cannot load outdated $lib v$ver, please upgrade");
2467 $WARN{$lib} = 2; # never warn again
2468 }
2469 }
2470 }
574bacfe 2471 }
990fb837
RGS
2472 if ($CALC eq '')
2473 {
2474 require Carp;
091c87b1
T
2475 Carp::croak ("Couldn't load any math lib, not even 'Calc.pm'");
2476 }
9b924220 2477 _fill_can_cache(); # for emulating lower math lib functions
091c87b1
T
2478 }
2479
2480sub _fill_can_cache
2481 {
2482 # fill $CAN with the results of $CALC->can(...)
2483
2484 %CAN = ();
9b924220 2485 for my $method (qw/ signed_and or signed_or xor signed_xor /)
091c87b1
T
2486 {
2487 $CAN{$method} = $CALC->can("_$method") ? 1 : 0;
990fb837 2488 }
58cde26e
JH
2489 }
2490
574bacfe 2491sub __from_hex
58cde26e
JH
2492 {
2493 # convert a (ref to) big hex string to BigInt, return undef for error
2494 my $hs = shift;
2495
2496 my $x = Math::BigInt->bzero();
394e6ffb
JH
2497
2498 # strip underscores
9b924220
RGS
2499 $hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;
2500 $hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;
394e6ffb 2501
9b924220 2502 return $x->bnan() if $hs !~ /^[\-\+]?0x[0-9A-Fa-f]+$/;
58cde26e 2503
9b924220 2504 my $sign = '+'; $sign = '-' if $hs =~ /^-/;
58cde26e 2505
9b924220
RGS
2506 $hs =~ s/^[+-]//; # strip sign
2507 $x->{value} = $CALC->_from_hex($hs);
13a12e00
JH
2508 $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); # no '-0'
2509 $x;
58cde26e
JH
2510 }
2511
574bacfe 2512sub __from_bin
58cde26e
JH
2513 {
2514 # convert a (ref to) big binary string to BigInt, return undef for error
2515 my $bs = shift;
2516
2517 my $x = Math::BigInt->bzero();
394e6ffb 2518 # strip underscores
9b924220
RGS
2519 $bs =~ s/([01])_([01])/$1$2/g;
2520 $bs =~ s/([01])_([01])/$1$2/g;
2521 return $x->bnan() if $bs !~ /^[+-]?0b[01]+$/;
58cde26e 2522
9b924220
RGS
2523 my $sign = '+'; $sign = '-' if $bs =~ /^\-/;
2524 $bs =~ s/^[+-]//; # strip sign
2525
2526 $x->{value} = $CALC->_from_bin($bs);
13a12e00
JH
2527 $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); # no '-0'
2528 $x;
58cde26e
JH
2529 }
2530
2531sub _split
2532 {
2533 # (ref to num_str) return num_str
2534 # internal, take apart a string and return the pieces
dccbb853 2535 # strip leading/trailing whitespace, leading zeros, underscore and reject
574bacfe 2536 # invalid input
58cde26e
JH
2537 my $x = shift;
2538
574bacfe 2539 # strip white space at front, also extranous leading zeros
9b924220
RGS
2540 $x =~ s/^\s*([-]?)0*([0-9])/$1$2/g; # will not strip ' .2'
2541 $x =~ s/^\s+//; # but this will
2542 $x =~ s/\s+$//g; # strip white space at end
58cde26e 2543
574bacfe 2544 # shortcut, if nothing to split, return early
9b924220 2545 if ($x =~ /^[+-]?\d+\z/)
574bacfe 2546 {
9b924220
RGS
2547 $x =~ s/^([+-])0*([0-9])/$2/; my $sign = $1 || '+';
2548 return (\$sign, \$x, \'', \'', \0);
574bacfe 2549 }
58cde26e 2550
574bacfe 2551 # invalid starting char?
9b924220 2552 return if $x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/;
58cde26e 2553
9b924220
RGS
2554 return __from_hex($x) if $x =~ /^[\-\+]?0x/; # hex string
2555 return __from_bin($x) if $x =~ /^[\-\+]?0b/; # binary string
394e6ffb
JH
2556
2557 # strip underscores between digits
9b924220
RGS
2558 $x =~ s/(\d)_(\d)/$1$2/g;
2559 $x =~ s/(\d)_(\d)/$1$2/g; # do twice for 1_2_3
574bacfe 2560
58cde26e
JH
2561 # some possible inputs:
2562 # 2.1234 # 0.12 # 1 # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2
aef458a0 2563 # .2 # 1_2_3.4_5_6 # 1.4E1_2_3 # 1e3 # +.2 # 0e999
58cde26e 2564
9b924220 2565 my ($m,$e,$last) = split /[Ee]/,$x;
56d9de68 2566 return if defined $last; # last defined => 1e2E3 or others
58cde26e 2567 $e = '0' if !defined $e || $e eq "";
56d9de68 2568
58cde26e
JH
2569 # sign,value for exponent,mantint,mantfrac
2570 my ($es,$ev,$mis,$miv,$mfv);
2571 # valid exponent?
2572 if ($e =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
2573 {
2574 $es = $1; $ev = $2;
58cde26e
JH
2575 # valid mantissa?
2576 return if $m eq '.' || $m eq '';
56d9de68 2577 my ($mi,$mf,$lastf) = split /\./,$m;
8df1e0a2 2578 return if defined $lastf; # lastf defined => 1.2.3 or others
58cde26e
JH
2579 $mi = '0' if !defined $mi;
2580 $mi .= '0' if $mi =~ /^[\-\+]?$/;
2581 $mf = '0' if !defined $mf || $mf eq '';
2582 if ($mi =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
2583 {
2584 $mis = $1||'+'; $miv = $2;
58cde26e
JH
2585 return unless ($mf =~ /^(\d*?)0*$/); # strip trailing zeros
2586 $mfv = $1;
aef458a0
JH
2587 # handle the 0e999 case here
2588 $ev = 0 if $miv eq '0' && $mfv eq '';
58cde26e
JH
2589 return (\$mis,\$miv,\$mfv,\$es,\$ev);
2590 }
2591 }
2592 return; # NaN, not a number
2593 }
2594
58cde26e 2595##############################################################################
0716bf9b 2596# internal calculation routines (others are in Math::BigInt::Calc etc)
58cde26e 2597
dccbb853 2598sub __lcm
58cde26e
JH
2599 {
2600 # (BINT or num_str, BINT or num_str) return BINT
2601 # does modify first argument
2602 # LCM
2603
2604 my $x = shift; my $ty = shift;
2605 return $x->bnan() if ($x->{sign} eq $nan) || ($ty->{sign} eq $nan);
9b924220 2606 $x * $ty / bgcd($x,$ty);
58cde26e
JH
2607 }
2608
58cde26e
JH
2609###############################################################################
2610# this method return 0 if the object can be modified, or 1 for not
b282a552 2611# We use a fast constant sub() here, to avoid costly calls. Subclasses
58cde26e
JH
2612# may override it with special code (f.i. Math::BigInt::Constant does so)
2613
0716bf9b 2614sub modify () { 0; }
e16b8f49 2615
a0d0e21e 26161;
a5f75d66
AD
2617__END__
2618
2619=head1 NAME
2620
2621Math::BigInt - Arbitrary size integer math package
2622
2623=head1 SYNOPSIS
2624
2625 use Math::BigInt;
58cde26e 2626
990fb837
RGS
2627 # or make it faster: install (optional) Math::BigInt::GMP
2628 # and always use (it will fall back to pure Perl if the
2629 # GMP library is not installed):
2630
2631 use Math::BigInt lib => 'GMP';
2632
9b924220
RGS
2633 my $str = '1234567890';
2634 my @values = (64,74,18);
2635 my $n = 1; my $sign = '-';
2636
58cde26e 2637 # Number creation
574bacfe 2638 $x = Math::BigInt->new($str); # defaults to 0
9b924220 2639 $y = $x->copy(); # make a true copy
574bacfe
JH
2640 $nan = Math::BigInt->bnan(); # create a NotANumber
2641 $zero = Math::BigInt->bzero(); # create a +0
2642 $inf = Math::BigInt->binf(); # create a +inf
2643 $inf = Math::BigInt->binf('-'); # create a -inf
2644 $one = Math::BigInt->bone(); # create a +1
2645 $one = Math::BigInt->bone('-'); # create a -1
58cde26e 2646
56d9de68
T
2647 # Testing (don't modify their arguments)
2648 # (return true if the condition is met, otherwise false)
2649
2650 $x->is_zero(); # if $x is +0
2651 $x->is_nan(); # if $x is NaN
2652 $x->is_one(); # if $x is +1
2653 $x->is_one('-'); # if $x is -1
2654 $x->is_odd(); # if $x is odd
2655 $x->is_even(); # if $x is even
b282a552
T
2656 $x->is_pos(); # if $x >= 0
2657 $x->is_neg(); # if $x < 0
9b924220 2658 $x->is_inf($sign); # if $x is +inf, or -inf (sign is default '+')
56d9de68
T
2659 $x->is_int(); # if $x is an integer (not a float)
2660
2661 # comparing and digit/sign extration
2662 $x->bcmp($y); # compare numbers (undef,<0,=0,>0)
2663 $x->bacmp($y); # compare absolutely (undef,<0,=0,>0)
2664 $x->sign(); # return the sign, either +,- or NaN
2665 $x->digit($n); # return the nth digit, counting from right
2666 $x->digit(-$n); # return the nth digit, counting from left
58cde26e 2667
990fb837
RGS
2668 # The following all modify their first argument. If you want to preserve
2669 # $x, use $z = $x->copy()->bXXX($y); See under L<CAVEATS> for why this is
2670 # neccessary when mixing $a = $b assigments with non-overloaded math.
58cde26e 2671
56d9de68
T
2672 $x->bzero(); # set $x to 0
2673 $x->bnan(); # set $x to NaN
2674 $x->bone(); # set $x to +1
2675 $x->bone('-'); # set $x to -1
2676 $x->binf(); # set $x to inf
2677 $x->binf('-'); # set $x to -inf
2678
2679 $x->bneg(); # negation
2680 $x->babs(); # absolute value
2681 $x->bnorm(); # normalize (no-op in BigInt)
2682 $x->bnot(); # two's complement (bit wise not)
2683 $x->binc(); # increment $x by 1
2684 $x->bdec(); # decrement $x by 1
58cde26e 2685
56d9de68
T
2686 $x->badd($y); # addition (add $y to $x)
2687 $x->bsub($y); # subtraction (subtract $y from $x)
2688 $x->bmul($y); # multiplication (multiply $x by $y)
2689 $x->bdiv($y); # divide, set $x to quotient
2690 # return (quo,rem) or quo if scalar
2691
2692 $x->bmod($y); # modulus (x % y)
2693 $x->bmodpow($exp,$mod); # modular exponentation (($num**$exp) % $mod))
2694 $x->bmodinv($mod); # the inverse of $x in the given modulus $mod
2695
2696 $x->bpow($y); # power of arguments (x ** y)
2697 $x->blsft($y); # left shift
2698 $x->brsft($y); # right shift
2699 $x->blsft($y,$n); # left shift, by base $n (like 10)
2700 $x->brsft($y,$n); # right shift, by base $n (like 10)
58cde26e 2701
56d9de68
T
2702 $x->band($y); # bitwise and
2703 $x->bior($y); # bitwise inclusive or
2704 $x->bxor($y); # bitwise exclusive or
2705 $x->bnot(); # bitwise not (two's complement)
2706
2707 $x->bsqrt(); # calculate square-root
990fb837 2708 $x->broot($y); # $y'th root of $x (e.g. $y == 3 => cubic root)
56d9de68 2709 $x->bfac(); # factorial of $x (1*2*3*4*..$x)
58cde26e 2710
990fb837 2711 $x->round($A,$P,$mode); # round to accuracy or precision using mode $mode
9b924220
RGS
2712 $x->bround($n); # accuracy: preserve $n digits
2713 $x->bfround($n); # round to $nth digit, no-op for BigInts
58cde26e 2714
990fb837 2715 # The following do not modify their arguments in BigInt (are no-ops),
56d9de68 2716 # but do so in BigFloat:
58cde26e 2717
56d9de68
T
2718 $x->bfloor(); # return integer less or equal than $x
2719 $x->bceil(); # return integer greater or equal than $x
58cde26e
JH
2720
2721 # The following do not modify their arguments:
2722
9b924220
RGS
2723 # greatest common divisor (no OO style)
2724 my $gcd = Math::BigInt::bgcd(@values);
2725 # lowest common multiplicator (no OO style)
2726 my $lcm = Math::BigInt::blcm(@values);
bd05a461 2727
56d9de68 2728 $x->length(); # return number of digits in number
9b924220 2729 ($xl,$f) = $x->length(); # length of number and length of fraction part,
56d9de68
T
2730 # latter is always 0 digits long for BigInt's
2731
2732 $x->exponent(); # return exponent as BigInt
2733 $x->mantissa(); # return (signed) mantissa as BigInt
2734 $x->parts(); # return (mantissa,exponent) as BigInt
2735 $x->copy(); # make a true copy of $x (unlike $y = $x;)
b282a552
T
2736 $x->as_int(); # return as BigInt (in BigInt: same as copy())
2737 $x->numify(); # return as scalar (might overflow!)
bd05a461 2738
56d9de68
T
2739 # conversation to string (do not modify their argument)
2740 $x->bstr(); # normalized string
2741 $x->bsstr(); # normalized string in scientific notation
2742 $x->as_hex(); # as signed hexadecimal string with prefixed 0x
2743 $x->as_bin(); # as signed binary string with prefixed 0b
b282a552 2744
bd05a461 2745
f9a08e12 2746 # precision and accuracy (see section about rounding for more)
56d9de68
T
2747 $x->precision(); # return P of $x (or global, if P of $x undef)
2748 $x->precision($n); # set P of $x to $n
2749 $x->accuracy(); # return A of $x (or global, if A of $x undef)
2750 $x->accuracy($n); # set A $x to $n
f9a08e12 2751
56d9de68
T
2752 # Global methods
2753 Math::BigInt->precision(); # get/set global P for all BigInt objects
2754 Math::BigInt->accuracy(); # get/set global A for all BigInt objects
2755 Math::BigInt->config(); # return hash containing configuration
f9a08e12 2756
a5f75d66
AD
2757=head1 DESCRIPTION
2758
58cde26e
JH
2759All operators (inlcuding basic math operations) are overloaded if you
2760declare your big integers as
a5f75d66 2761
58cde26e 2762 $i = new Math::BigInt '123_456_789_123_456_789';
a5f75d66 2763
58cde26e
JH
2764Operations with overloaded operators preserve the arguments which is
2765exactly what you expect.
a5f75d66
AD
2766
2767=over 2
2768
aef458a0 2769=item Input
a5f75d66 2770
aef458a0
JH
2771Input values to these routines may be any string, that looks like a number
2772and results in an integer, including hexadecimal and binary numbers.
58cde26e 2773
aef458a0
JH
2774Scalars holding numbers may also be passed, but note that non-integer numbers
2775may already have lost precision due to the conversation to float. Quote
091c87b1 2776your input if you want BigInt to see all the digits:
a5f75d66 2777
aef458a0
JH
2778 $x = Math::BigInt->new(12345678890123456789); # bad
2779 $x = Math::BigInt->new('12345678901234567890'); # good
58cde26e 2780
56d9de68 2781You can include one underscore between any two digits.
58cde26e
JH
2782
2783This means integer values like 1.01E2 or even 1000E-2 are also accepted.
aef458a0 2784Non-integer values result in NaN.
58cde26e 2785
aef458a0 2786Currently, Math::BigInt::new() defaults to 0, while Math::BigInt::new('')
091c87b1
T
2787results in 'NaN'. This might change in the future, so use always the following
2788explicit forms to get a zero or NaN:
2789
2790 $zero = Math::BigInt->bzero();
2791 $nan = Math::BigInt->bnan();
58cde26e 2792
aef458a0 2793C<bnorm()> on a BigInt object is now effectively a no-op, since the numbers
091c87b1 2794are always stored in normalized form. If passed a string, creates a BigInt
aef458a0 2795object from the input.
a5f75d66
AD
2796
2797=item Output
2798
58cde26e
JH
2799Output values are BigInt objects (normalized), except for bstr(), which
2800returns a string in normalized form.
2801Some routines (C<is_odd()>, C<is_even()>, C<is_zero()>, C<is_one()>,
2802C<is_nan()>) return true or false, while others (C<bcmp()>, C<bacmp()>)
2803return either undef, <0, 0 or >0 and are suited for sort.
a5f75d66
AD
2804
2805=back
2806
b3abae2a
JH
2807=head1 METHODS
2808
56d9de68
T
2809Each of the methods below (except config(), accuracy() and precision())
2810accepts three additional parameters. These arguments $A, $P and $R are
2811accuracy, precision and round_mode. Please see the section about
2812L<ACCURACY and PRECISION> for more information.
b3abae2a 2813
8f675a64
JH
2814=head2 config
2815
2816 use Data::Dumper;
2817
2818 print Dumper ( Math::BigInt->config() );
56d9de68 2819 print Math::BigInt->config()->{lib},"\n";
8f675a64
JH
2820
2821Returns a hash containing the configuration, e.g. the version number, lib
56d9de68
T
2822loaded etc. The following hash keys are currently filled in with the
2823appropriate information.
2824
2825 key Description
2826 Example
2827 ============================================================
091c87b1 2828 lib Name of the low-level math library
56d9de68 2829 Math::BigInt::Calc
091c87b1 2830 lib_version Version of low-level math library (see 'lib')
56d9de68 2831 0.30
091c87b1 2832 class The class name of config() you just called
56d9de68 2833 Math::BigInt
091c87b1 2834 upgrade To which class math operations might be upgraded
56d9de68 2835 Math::BigFloat
091c87b1 2836 downgrade To which class math operations might be downgraded
56d9de68
T
2837 undef
2838 precision Global precision
2839 undef
2840 accuracy Global accuracy
2841 undef
2842 round_mode Global round mode
2843 even
2844 version version number of the class you used
2845 1.61
2846 div_scale Fallback acccuracy for div
2847 40
091c87b1
T
2848 trap_nan If true, traps creation of NaN via croak()
2849 1
2850 trap_inf If true, traps creation of +inf/-inf via croak()
2851 1
56d9de68 2852
c38b2de2 2853The following values can be set by passing C<config()> a reference to a hash:
93c87d9d
T
2854
2855 trap_inf trap_nan
2856 upgrade downgrade precision accuracy round_mode div_scale
2857
2858Example:
2859
2860 $new_cfg = Math::BigInt->config( { trap_inf => 1, precision => 5 } );
8f675a64 2861
13a12e00
JH
2862=head2 accuracy
2863
2864 $x->accuracy(5); # local for $x
56d9de68
T
2865 CLASS->accuracy(5); # global for all members of CLASS
2866 $A = $x->accuracy(); # read out
2867 $A = CLASS->accuracy(); # read out
13a12e00
JH
2868
2869Set or get the global or local accuracy, aka how many significant digits the
56d9de68
T
2870results have.
2871
2872Please see the section about L<ACCURACY AND PRECISION> for further details.
13a12e00
JH
2873
2874Value must be greater than zero. Pass an undef value to disable it:
2875
2876 $x->accuracy(undef);
2877 Math::BigInt->accuracy(undef);
2878
2879Returns the current accuracy. For C<$x->accuracy()> it will return either the
2880local accuracy, or if not defined, the global. This means the return value
2881represents the accuracy that will be in effect for $x:
2882
2883 $y = Math::BigInt->new(1234567); # unrounded
2884 print Math::BigInt->accuracy(4),"\n"; # set 4, print 4
2885 $x = Math::BigInt->new(123456); # will be automatically rounded
2886 print "$x $y\n"; # '123500 1234567'
2887 print $x->accuracy(),"\n"; # will be 4
2888 print $y->accuracy(),"\n"; # also 4, since global is 4
2889 print Math::BigInt->accuracy(5),"\n"; # set to 5, print 5
2890 print $x->accuracy(),"\n"; # still 4
2891 print $y->accuracy(),"\n"; # 5, since global is 5
2892
56d9de68
T
2893Note: Works also for subclasses like Math::BigFloat. Each class has it's own
2894globals separated from Math::BigInt, but it is possible to subclass
2895Math::BigInt and make the globals of the subclass aliases to the ones from
2896Math::BigInt.
2897
2898=head2 precision
2899
2900 $x->precision(-2); # local for $x, round right of the dot
2901 $x->precision(2); # ditto, but round left of the dot
2902 CLASS->accuracy(5); # global for all members of CLASS
2903 CLASS->precision(-5); # ditto
2904 $P = CLASS->precision(); # read out
2905 $P = $x->precision(); # read out
2906
2907Set or get the global or local precision, aka how many digits the result has
2908after the dot (or where to round it when passing a positive number). In
2909Math::BigInt, passing a negative number precision has no effect since no
2910numbers have digits after the dot.
2911
2912Please see the section about L<ACCURACY AND PRECISION> for further details.
2913
2914Value must be greater than zero. Pass an undef value to disable it:
2915
2916 $x->precision(undef);
2917 Math::BigInt->precision(undef);
2918
2919Returns the current precision. For C<$x->precision()> it will return either the
2920local precision of $x, or if not defined, the global. This means the return
2921value represents the accuracy that will be in effect for $x:
2922
2923 $y = Math::BigInt->new(1234567); # unrounded
2924 print Math::BigInt->precision(4),"\n"; # set 4, print 4
2925 $x = Math::BigInt->new(123456); # will be automatically rounded
2926
2927Note: Works also for subclasses like Math::BigFloat. Each class has it's own
2928globals separated from Math::BigInt, but it is possible to subclass
2929Math::BigInt and make the globals of the subclass aliases to the ones from
2930Math::BigInt.
2931
b3abae2a
JH
2932=head2 brsft
2933
2934 $x->brsft($y,$n);
2935
2936Shifts $x right by $y in base $n. Default is base 2, used are usually 10 and
29372, but others work, too.
2938
2939Right shifting usually amounts to dividing $x by $n ** $y and truncating the
2940result:
2941
2942
2943 $x = Math::BigInt->new(10);
2944 $x->brsft(1); # same as $x >> 1: 5
2945 $x = Math::BigInt->new(1234);
2946 $x->brsft(2,10); # result 12
2947
2948There is one exception, and that is base 2 with negative $x:
2949
2950
2951 $x = Math::BigInt->new(-5);
2952 print $x->brsft(1);
2953
2954This will print -3, not -2 (as it would if you divide -5 by 2 and truncate the
2955result).
2956
2957=head2 new
2958
2959 $x = Math::BigInt->new($str,$A,$P,$R);
2960
aef458a0 2961Creates a new BigInt object from a scalar or another BigInt object. The
b3abae2a
JH
2962input is accepted as decimal, hex (with leading '0x') or binary (with leading
2963'0b').
2964
aef458a0
JH
2965See L<Input> for more info on accepted input formats.
2966
b3abae2a
JH
2967=head2 bnan
2968
2969 $x = Math::BigInt->bnan();
2970
2971Creates a new BigInt object representing NaN (Not A Number).
2972If used on an object, it will set it to NaN:
2973
2974 $x->bnan();
2975
2976=head2 bzero
2977
2978 $x = Math::BigInt->bzero();
2979
2980Creates a new BigInt object representing zero.
2981If used on an object, it will set it to zero:
2982
2983 $x->bzero();
2984
2985=head2 binf
2986
2987 $x = Math::BigInt->binf($sign);
2988
2989Creates a new BigInt object representing infinity. The optional argument is
2990either '-' or '+', indicating whether you want infinity or minus infinity.
2991If used on an object, it will set it to infinity:
2992
2993 $x->binf();
2994 $x->binf('-');
2995
2996=head2 bone
2997
2998 $x = Math::BigInt->binf($sign);
2999
3000Creates a new BigInt object representing one. The optional argument is
3001either '-' or '+', indicating whether you want one or minus one.
3002If used on an object, it will set it to one:
3003
3004 $x->bone(); # +1
3005 $x->bone('-'); # -1
3006
56b9c951
JH
3007=head2 is_one()/is_zero()/is_nan()/is_inf()
3008
b3abae2a
JH
3009
3010 $x->is_zero(); # true if arg is +0
3011 $x->is_nan(); # true if arg is NaN
3012 $x->is_one(); # true if arg is +1
3013 $x->is_one('-'); # true if arg is -1
b3abae2a
JH
3014 $x->is_inf(); # true if +inf
3015 $x->is_inf('-'); # true if -inf (sign is default '+')
56b9c951
JH
3016
3017These methods all test the BigInt for beeing one specific value and return
3018true or false depending on the input. These are faster than doing something
3019like:
3020
3021 if ($x == 0)
3022
b282a552 3023=head2 is_pos()/is_neg()
56b9c951 3024
b282a552
T
3025 $x->is_pos(); # true if >= 0
3026 $x->is_neg(); # true if < 0
56b9c951
JH
3027
3028The methods return true if the argument is positive or negative, respectively.
3029C<NaN> is neither positive nor negative, while C<+inf> counts as positive, and
3030C<-inf> is negative. A C<zero> is positive.
3031
3032These methods are only testing the sign, and not the value.
3033
b282a552
T
3034C<is_positive()> and C<is_negative()> are aliase to C<is_pos()> and
3035C<is_neg()>, respectively. C<is_positive()> and C<is_negative()> were
3036introduced in v1.36, while C<is_pos()> and C<is_neg()> were only introduced
3037in v1.68.
3038
56b9c951
JH
3039=head2 is_odd()/is_even()/is_int()
3040
3041 $x->is_odd(); # true if odd, false for even
3042 $x->is_even(); # true if even, false for odd
b3abae2a
JH
3043 $x->is_int(); # true if $x is an integer
3044
56b9c951
JH
3045The return true when the argument satisfies the condition. C<NaN>, C<+inf>,
3046C<-inf> are not integers and are neither odd nor even.
b3abae2a 3047
c38b2de2
JH
3048In BigInt, all numbers except C<NaN>, C<+inf> and C<-inf> are integers.
3049
b3abae2a
JH
3050=head2 bcmp
3051
56b9c951
JH
3052 $x->bcmp($y);
3053
3054Compares $x with $y and takes the sign into account.
3055Returns -1, 0, 1 or undef.
b3abae2a
JH
3056
3057=head2 bacmp
3058
56b9c951
JH
3059 $x->bacmp($y);
3060
3061Compares $x with $y while ignoring their. Returns -1, 0, 1 or undef.
b3abae2a
JH
3062
3063=head2 sign
3064
56b9c951
JH
3065 $x->sign();
3066
3067Return the sign, of $x, meaning either C<+>, C<->, C<-inf>, C<+inf> or NaN.
b3abae2a 3068
091c87b1
T
3069=head2 digit
3070
3071 $x->digit($n); # return the nth digit, counting from right
b3abae2a 3072
091c87b1 3073If C<$n> is negative, returns the digit counting from left.
b3abae2a
JH
3074
3075=head2 bneg
3076
3077 $x->bneg();
3078
3079Negate the number, e.g. change the sign between '+' and '-', or between '+inf'
3080and '-inf', respectively. Does nothing for NaN or zero.
3081
3082=head2 babs
3083
3084 $x->babs();
3085
3086Set the number to it's absolute value, e.g. change the sign from '-' to '+'
3087and from '-inf' to '+inf', respectively. Does nothing for NaN or positive
3088numbers.
3089
3090=head2 bnorm
3091
56d9de68 3092 $x->bnorm(); # normalize (no-op)
b3abae2a
JH
3093
3094=head2 bnot
3095
091c87b1
T
3096 $x->bnot();
3097
3098Two's complement (bit wise not). This is equivalent to
3099
3100 $x->binc()->bneg();
3101
3102but faster.
b3abae2a
JH
3103
3104=head2 binc
3105
56d9de68 3106 $x->binc(); # increment x by 1
b3abae2a
JH
3107
3108=head2 bdec
3109
56d9de68 3110 $x->bdec(); # decrement x by 1
b3abae2a
JH
3111
3112=head2 badd
3113
56d9de68 3114 $x->badd($y); # addition (add $y to $x)
b3abae2a
JH
3115
3116=head2 bsub
3117
56d9de68 3118 $x->bsub($y); # subtraction (subtract $y from $x)
b3abae2a
JH
3119
3120=head2 bmul
3121
56d9de68 3122 $x->bmul($y); # multiplication (multiply $x by $y)
b3abae2a
JH
3123
3124=head2 bdiv
3125
56d9de68
T
3126 $x->bdiv($y); # divide, set $x to quotient
3127 # return (quo,rem) or quo if scalar
b3abae2a
JH
3128
3129=head2 bmod
3130
56d9de68 3131 $x->bmod($y); # modulus (x % y)
b3abae2a 3132
d614cd8b
JH
3133=head2 bmodinv
3134
56d9de68 3135 num->bmodinv($mod); # modular inverse
d614cd8b
JH
3136
3137Returns the inverse of C<$num> in the given modulus C<$mod>. 'C<NaN>' is
3138returned unless C<$num> is relatively prime to C<$mod>, i.e. unless
3139C<bgcd($num, $mod)==1>.
3140
3141=head2 bmodpow
3142
56d9de68
T
3143 $num->bmodpow($exp,$mod); # modular exponentation
3144 # ($num**$exp % $mod)
d614cd8b
JH
3145
3146Returns the value of C<$num> taken to the power C<$exp> in the modulus
3147C<$mod> using binary exponentation. C<bmodpow> is far superior to
3148writing
3149
56d9de68 3150 $num ** $exp % $mod
d614cd8b 3151
091c87b1 3152because it is much faster - it reduces internal variables into
d614cd8b
JH
3153the modulus whenever possible, so it operates on smaller numbers.
3154
3155C<bmodpow> also supports negative exponents.
3156
56d9de68 3157 bmodpow($num, -1, $mod)
d614cd8b
JH
3158
3159is exactly equivalent to
3160
56d9de68 3161 bmodinv($num, $mod)
d614cd8b 3162
b3abae2a
JH
3163=head2 bpow
3164
56d9de68 3165 $x->bpow($y); # power of arguments (x ** y)
b3abae2a
JH
3166
3167=head2 blsft
3168
56d9de68
T
3169 $x->blsft($y); # left shift
3170 $x->blsft($y,$n); # left shift, in base $n (like 10)
b3abae2a
JH
3171
3172=head2 brsft
3173
56d9de68
T
3174 $x->brsft($y); # right shift
3175 $x->brsft($y,$n); # right shift, in base $n (like 10)
b3abae2a
JH
3176
3177=head2 band
3178
56d9de68 3179 $x->band($y); # bitwise and
b3abae2a
JH
3180
3181=head2 bior
3182
56d9de68 3183 $x->bior($y); # bitwise inclusive or
b3abae2a
JH
3184
3185=head2 bxor
3186
56d9de68 3187 $x->bxor($y); # bitwise exclusive or
b3abae2a
JH
3188
3189=head2 bnot
3190
56d9de68 3191 $x->bnot(); # bitwise not (two's complement)
b3abae2a
JH
3192
3193=head2 bsqrt
3194
56d9de68 3195 $x->bsqrt(); # calculate square-root
b3abae2a
JH
3196
3197=head2 bfac
3198
56d9de68 3199 $x->bfac(); # factorial of $x (1*2*3*4*..$x)
b3abae2a
JH
3200
3201=head2 round
3202
56d9de68
T
3203 $x->round($A,$P,$round_mode);
3204
3205Round $x to accuracy C<$A> or precision C<$P> using the round mode
3206C<$round_mode>.
b3abae2a
JH
3207
3208=head2 bround
3209
56d9de68 3210 $x->bround($N); # accuracy: preserve $N digits
b3abae2a
JH
3211
3212=head2 bfround
3213
56d9de68 3214 $x->bfround($N); # round to $Nth digit, no-op for BigInts
b3abae2a
JH
3215
3216=head2 bfloor
3217
3218 $x->bfloor();
3219
3220Set $x to the integer less or equal than $x. This is a no-op in BigInt, but
3221does change $x in BigFloat.
3222
3223=head2 bceil
3224
3225 $x->bceil();
3226
3227Set $x to the integer greater or equal than $x. This is a no-op in BigInt, but
3228does change $x in BigFloat.
3229
3230=head2 bgcd
3231
56d9de68 3232 bgcd(@values); # greatest common divisor (no OO style)
b3abae2a
JH
3233
3234=head2 blcm
3235
56d9de68 3236 blcm(@values); # lowest common multiplicator (no OO style)
b3abae2a
JH
3237
3238head2 length
3239
3240 $x->length();
3241 ($xl,$fl) = $x->length();
3242
3243Returns the number of digits in the decimal representation of the number.
3244In list context, returns the length of the integer and fraction part. For
3245BigInt's, the length of the fraction part will always be 0.
3246
3247=head2 exponent
3248
3249 $x->exponent();
3250
3251Return the exponent of $x as BigInt.
3252
3253=head2 mantissa
3254
3255 $x->mantissa();
3256
3257Return the signed mantissa of $x as BigInt.
3258
3259=head2 parts
3260
56d9de68 3261 $x->parts(); # return (mantissa,exponent) as BigInt
b3abae2a
JH
3262
3263=head2 copy
3264
56d9de68 3265 $x->copy(); # make a true copy of $x (unlike $y = $x;)
b3abae2a 3266
b282a552 3267=head2 as_int
b3abae2a 3268
b282a552
T
3269 $x->as_int();
3270
3271Returns $x as a BigInt (truncated towards zero). In BigInt this is the same as
3272C<copy()>.
3273
3274C<as_number()> is an alias to this method. C<as_number> was introduced in
3275v1.22, while C<as_int()> was only introduced in v1.68.
b3abae2a 3276
b282a552
T
3277=head2 bstr
3278
3279 $x->bstr();
b3abae2a 3280
b282a552 3281Returns a normalized string represantation of C<$x>.
b3abae2a
JH
3282
3283=head2 bsstr
3284
56d9de68 3285 $x->bsstr(); # normalized string in scientific notation
b3abae2a
JH
3286
3287=head2 as_hex
3288
56d9de68 3289 $x->as_hex(); # as signed hexadecimal string with prefixed 0x
b3abae2a
JH
3290
3291=head2 as_bin
3292
56d9de68 3293 $x->as_bin(); # as signed binary string with prefixed 0b
b3abae2a 3294
0716bf9b
JH
3295=head1 ACCURACY and PRECISION
3296
b22b3e31 3297Since version v1.33, Math::BigInt and Math::BigFloat have full support for
0716bf9b 3298accuracy and precision based rounding, both automatically after every
091c87b1 3299operation, as well as manually.
0716bf9b
JH
3300
3301This section describes the accuracy/precision handling in Math::Big* as it
b22b3e31 3302used to be and as it is now, complete with an explanation of all terms and
0716bf9b
JH
3303abbreviations.
3304
3305Not yet implemented things (but with correct description) are marked with '!',
3306things that need to be answered are marked with '?'.
3307
3308In the next paragraph follows a short description of terms used here (because
574bacfe 3309these may differ from terms used by others people or documentation).
0716bf9b 3310
b22b3e31 3311During the rest of this document, the shortcuts A (for accuracy), P (for
0716bf9b
JH
3312precision), F (fallback) and R (rounding mode) will be used.
3313
3314=head2 Precision P
3315
3316A fixed number of digits before (positive) or after (negative)
b22b3e31
PN
3317the decimal point. For example, 123.45 has a precision of -2. 0 means an
3318integer like 123 (or 120). A precision of 2 means two digits to the left
3319of the decimal point are zero, so 123 with P = 1 becomes 120. Note that
3320numbers with zeros before the decimal point may have different precisions,
3321because 1200 can have p = 0, 1 or 2 (depending on what the inital value
3322was). It could also have p < 0, when the digits after the decimal point
3323are zero.
0716bf9b 3324
574bacfe
JH
3325The string output (of floating point numbers) will be padded with zeros:
3326
3327 Initial value P A Result String
3328 ------------------------------------------------------------
3329 1234.01 -3 1000 1000
3330 1234 -2 1200 1200
3331 1234.5 -1 1230 1230
3332 1234.001 1 1234 1234.0
3333 1234.01 0 1234 1234
3334 1234.01 2 1234.01 1234.01
3335 1234.01 5 1234.01 1234.01000
3336
3337For BigInts, no padding occurs.
0716bf9b
JH
3338
3339=head2 Accuracy A
3340
3341Number of significant digits. Leading zeros are not counted. A
3342number may have an accuracy greater than the non-zero digits
b22b3e31
PN
3343when there are zeros in it or trailing zeros. For example, 123.456 has
3344A of 6, 10203 has 5, 123.0506 has 7, 123.450000 has 8 and 0.000123 has 3.
0716bf9b 3345
574bacfe
JH
3346The string output (of floating point numbers) will be padded with zeros:
3347
3348 Initial value P A Result String
3349 ------------------------------------------------------------
3350 1234.01 3 1230 1230
3351 1234.01 6 1234.01 1234.01
3352 1234.1 8 1234.1 1234.1000
3353
3354For BigInts, no padding occurs.
3355
0716bf9b 3356=head2 Fallback F
a5f75d66 3357
574bacfe
JH
3358When both A and P are undefined, this is used as a fallback accuracy when
3359dividing numbers.
0716bf9b
JH
3360
3361=head2 Rounding mode R
3362
3363When rounding a number, different 'styles' or 'kinds'
3364of rounding are possible. (Note that random rounding, as in
3365Math::Round, is not implemented.)
58cde26e
JH
3366
3367=over 2
a5f75d66 3368
0716bf9b
JH
3369=item 'trunc'
3370
3371truncation invariably removes all digits following the
3372rounding place, replacing them with zeros. Thus, 987.65 rounded
b22b3e31 3373to tens (P=1) becomes 980, and rounded to the fourth sigdig
0716bf9b 3374becomes 987.6 (A=4). 123.456 rounded to the second place after the
b22b3e31 3375decimal point (P=-2) becomes 123.46.
0716bf9b
JH
3376
3377All other implemented styles of rounding attempt to round to the
3378"nearest digit." If the digit D immediately to the right of the
3379rounding place (skipping the decimal point) is greater than 5, the
3380number is incremented at the rounding place (possibly causing a
3381cascade of incrementation): e.g. when rounding to units, 0.9 rounds
3382to 1, and -19.9 rounds to -20. If D < 5, the number is similarly
3383truncated at the rounding place: e.g. when rounding to units, 0.4
3384rounds to 0, and -19.4 rounds to -19.
3385
3386However the results of other styles of rounding differ if the
3387digit immediately to the right of the rounding place (skipping the
3388decimal point) is 5 and if there are no digits, or no digits other
3389than 0, after that 5. In such cases:
3390
3391=item 'even'
3392
3393rounds the digit at the rounding place to 0, 2, 4, 6, or 8
3394if it is not already. E.g., when rounding to the first sigdig, 0.45
3395becomes 0.4, -0.55 becomes -0.6, but 0.4501 becomes 0.5.
3396
3397=item 'odd'
3398
3399rounds the digit at the rounding place to 1, 3, 5, 7, or 9 if
3400it is not already. E.g., when rounding to the first sigdig, 0.45
3401becomes 0.5, -0.55 becomes -0.5, but 0.5501 becomes 0.6.
3402
3403=item '+inf'
3404
3405round to plus infinity, i.e. always round up. E.g., when
3406rounding to the first sigdig, 0.45 becomes 0.5, -0.55 becomes -0.5,
b22b3e31 3407and 0.4501 also becomes 0.5.
0716bf9b
JH
3408
3409=item '-inf'
3410
3411round to minus infinity, i.e. always round down. E.g., when
3412rounding to the first sigdig, 0.45 becomes 0.4, -0.55 becomes -0.6,
3413but 0.4501 becomes 0.5.
3414
3415=item 'zero'
3416
3417round to zero, i.e. positive numbers down, negative ones up.
3418E.g., when rounding to the first sigdig, 0.45 becomes 0.4, -0.55
3419becomes -0.5, but 0.4501 becomes 0.5.
3420
3421=back
3422
3423The handling of A & P in MBI/MBF (the old core code shipped with Perl
3424versions <= 5.7.2) is like this:
3425
3426=over 2
a5f75d66 3427
0716bf9b
JH
3428=item Precision
3429
b22b3e31
PN
3430 * ffround($p) is able to round to $p number of digits after the decimal
3431 point
0716bf9b
JH
3432 * otherwise P is unused
3433
3434=item Accuracy (significant digits)
3435
3436 * fround($a) rounds to $a significant digits
3437 * only fdiv() and fsqrt() take A as (optional) paramater
b22b3e31 3438 + other operations simply create the same number (fneg etc), or more (fmul)
0716bf9b
JH
3439 of digits
3440 + rounding/truncating is only done when explicitly calling one of fround
3441 or ffround, and never for BigInt (not implemented)
b22b3e31 3442 * fsqrt() simply hands its accuracy argument over to fdiv.
0716bf9b
JH
3443 * the documentation and the comment in the code indicate two different ways
3444 on how fdiv() determines the maximum number of digits it should calculate,
3445 and the actual code does yet another thing
3446 POD:
3447 max($Math::BigFloat::div_scale,length(dividend)+length(divisor))
3448 Comment:
3449 result has at most max(scale, length(dividend), length(divisor)) digits
3450 Actual code:
3451 scale = max(scale, length(dividend)-1,length(divisor)-1);
3452 scale += length(divisior) - length(dividend);
b22b3e31 3453 So for lx = 3, ly = 9, scale = 10, scale will actually be 16 (10+9-3).
0716bf9b
JH
3454 Actually, the 'difference' added to the scale is calculated from the
3455 number of "significant digits" in dividend and divisor, which is derived
3456 by looking at the length of the mantissa. Which is wrong, since it includes
091c87b1 3457 the + sign (oops) and actually gets 2 for '+100' and 4 for '+101'. Oops
0716bf9b
JH
3458 again. Thus 124/3 with div_scale=1 will get you '41.3' based on the strange
3459 assumption that 124 has 3 significant digits, while 120/7 will get you
3460 '17', not '17.1' since 120 is thought to have 2 significant digits.
dccbb853 3461 The rounding after the division then uses the remainder and $y to determine
0716bf9b 3462 wether it must round up or down.
b22b3e31
PN
3463 ? I have no idea which is the right way. That's why I used a slightly more
3464 ? simple scheme and tweaked the few failing testcases to match it.
58cde26e 3465
0716bf9b 3466=back
5dc6f178 3467
0716bf9b 3468This is how it works now:
5dc6f178 3469
0716bf9b 3470=over 2
5dc6f178 3471
0716bf9b
JH
3472=item Setting/Accessing
3473
091c87b1
T
3474 * You can set the A global via C<< Math::BigInt->accuracy() >> or
3475 C<< Math::BigFloat->accuracy() >> or whatever class you are using.
3476 * You can also set P globally by using C<< Math::SomeClass->precision() >>
3477 likewise.
0716bf9b 3478 * Globals are classwide, and not inherited by subclasses.
091c87b1
T
3479 * to undefine A, use C<< Math::SomeCLass->accuracy(undef); >>
3480 * to undefine P, use C<< Math::SomeClass->precision(undef); >>
3481 * Setting C<< Math::SomeClass->accuracy() >> clears automatically
3482 C<< Math::SomeClass->precision() >>, and vice versa.
0716bf9b 3483 * To be valid, A must be > 0, P can have any value.
b22b3e31
PN
3484 * If P is negative, this means round to the P'th place to the right of the
3485 decimal point; positive values mean to the left of the decimal point.
3486 P of 0 means round to integer.
091c87b1
T
3487 * to find out the current global A, use C<< Math::SomeClass->accuracy() >>
3488 * to find out the current global P, use C<< Math::SomeClass->precision() >>
3489 * use C<< $x->accuracy() >> respective C<< $x->precision() >> for the local
3490 setting of C<< $x >>.
3491 * Please note that C<< $x->accuracy() >> respecive C<< $x->precision() >>
3492 return eventually defined global A or P, when C<< $x >>'s A or P is not
3493 set.
0716bf9b
JH
3494
3495=item Creating numbers
3496
b3abae2a
JH
3497 * When you create a number, you can give it's desired A or P via:
3498 $x = Math::BigInt->new($number,$A,$P);
3499 * Only one of A or P can be defined, otherwise the result is NaN
3500 * If no A or P is give ($x = Math::BigInt->new($number) form), then the
3501 globals (if set) will be used. Thus changing the global defaults later on
b22b3e31 3502 will not change the A or P of previously created numbers (i.e., A and P of
b3abae2a
JH
3503 $x will be what was in effect when $x was created)
3504 * If given undef for A and P, B<no> rounding will occur, and the globals will
3505 B<not> be used. This is used by subclasses to create numbers without
3506 suffering rounding in the parent. Thus a subclass is able to have it's own
3507 globals enforced upon creation of a number by using
091c87b1 3508 C<< $x = Math::BigInt->new($number,undef,undef) >>:
b3abae2a 3509
990fb837 3510 use Math::BigInt::SomeSubclass;
b3abae2a
JH
3511 use Math::BigInt;
3512
3513 Math::BigInt->accuracy(2);
3514 Math::BigInt::SomeSubClass->accuracy(3);
3515 $x = Math::BigInt::SomeSubClass->new(1234);
3516
3517 $x is now 1230, and not 1200. A subclass might choose to implement
3518 this otherwise, e.g. falling back to the parent's A and P.
0716bf9b
JH
3519
3520=item Usage
3521
b22b3e31 3522 * If A or P are enabled/defined, they are used to round the result of each
0716bf9b 3523 operation according to the rules below
b22b3e31
PN
3524 * Negative P is ignored in Math::BigInt, since BigInts never have digits
3525 after the decimal point
091c87b1
T
3526 * Math::BigFloat uses Math::BigInt internally, but setting A or P inside
3527 Math::BigInt as globals does not tamper with the parts of a BigFloat.
3528 A flag is used to mark all Math::BigFloat numbers as 'never round'.
0716bf9b
JH
3529
3530=item Precedence
3531
b22b3e31 3532 * It only makes sense that a number has only one of A or P at a time.
091c87b1
T
3533 If you set either A or P on one object, or globally, the other one will
3534 be automatically cleared.
b3abae2a
JH
3535 * If two objects are involved in an operation, and one of them has A in
3536 effect, and the other P, this results in an error (NaN).
091c87b1
T
3537 * A takes precendence over P (Hint: A comes before P).
3538 If neither of them is defined, nothing is used, i.e. the result will have
3539 as many digits as it can (with an exception for fdiv/fsqrt) and will not
3540 be rounded.
b22b3e31
PN
3541 * There is another setting for fdiv() (and thus for fsqrt()). If neither of
3542 A or P is defined, fdiv() will use a fallback (F) of $div_scale digits.
3543 If either the dividend's or the divisor's mantissa has more digits than
3544 the value of F, the higher value will be used instead of F.
3545 This is to limit the digits (A) of the result (just consider what would
3546 happen with unlimited A and P in the case of 1/3 :-)
b3abae2a 3547 * fdiv will calculate (at least) 4 more digits than required (determined by
0716bf9b 3548 A, P or F), and, if F is not used, round the result
b22b3e31 3549 (this will still fail in the case of a result like 0.12345000000001 with A
574bacfe 3550 or P of 5, but this can not be helped - or can it?)
091c87b1 3551 * Thus you can have the math done by on Math::Big* class in two modi:
0716bf9b
JH
3552 + never round (this is the default):
3553 This is done by setting A and P to undef. No math operation
b22b3e31 3554 will round the result, with fdiv() and fsqrt() as exceptions to guard
0716bf9b 3555 against overflows. You must explicitely call bround(), bfround() or
b22b3e31
PN
3556 round() (the latter with parameters).
3557 Note: Once you have rounded a number, the settings will 'stick' on it
3558 and 'infect' all other numbers engaged in math operations with it, since
0716bf9b
JH
3559 local settings have the highest precedence. So, to get SaferRound[tm],
3560 use a copy() before rounding like this:
3561
3562 $x = Math::BigFloat->new(12.34);
3563 $y = Math::BigFloat->new(98.76);
3564 $z = $x * $y; # 1218.6984
3565 print $x->copy()->fround(3); # 12.3 (but A is now 3!)
3566 $z = $x * $y; # still 1218.6984, without
3567 # copy would have been 1210!
3568
3569 + round after each op:
b22b3e31
PN
3570 After each single operation (except for testing like is_zero()), the
3571 method round() is called and the result is rounded appropriately. By
0716bf9b 3572 setting proper values for A and P, you can have all-the-same-A or
b22b3e31
PN
3573 all-the-same-P modes. For example, Math::Currency might set A to undef,
3574 and P to -2, globally.
0716bf9b 3575
b22b3e31
PN
3576 ?Maybe an extra option that forbids local A & P settings would be in order,
3577 ?so that intermediate rounding does not 'poison' further math?
0716bf9b
JH
3578
3579=item Overriding globals
3580
3581 * you will be able to give A, P and R as an argument to all the calculation
b22b3e31 3582 routines; the second parameter is A, the third one is P, and the fourth is
b3abae2a 3583 R (shift right by one for binary operations like badd). P is used only if
b22b3e31
PN
3584 the first parameter (A) is undefined. These three parameters override the
3585 globals in the order detailed as follows, i.e. the first defined value
0716bf9b 3586 wins:
b22b3e31 3587 (local: per object, global: global default, parameter: argument to sub)
0716bf9b
JH
3588 + parameter A
3589 + parameter P
3590 + local A (if defined on both of the operands: smaller one is taken)
b3abae2a 3591 + local P (if defined on both of the operands: bigger one is taken)
0716bf9b
JH
3592 + global A
3593 + global P
3594 + global F
b22b3e31 3595 * fsqrt() will hand its arguments to fdiv(), as it used to, only now for two
0716bf9b
JH
3596 arguments (A and P) instead of one
3597
3598=item Local settings
3599
091c87b1
T
3600 * You can set A or P locally by using C<< $x->accuracy() >> or
3601 C<< $x->precision() >>
0716bf9b 3602 and thus force different A and P for different objects/numbers.
b22b3e31 3603 * Setting A or P this way immediately rounds $x to the new value.
091c87b1 3604 * C<< $x->accuracy() >> clears C<< $x->precision() >>, and vice versa.
0716bf9b
JH
3605
3606=item Rounding
3607
b22b3e31 3608 * the rounding routines will use the respective global or local settings.
0716bf9b
JH
3609 fround()/bround() is for accuracy rounding, while ffround()/bfround()
3610 is for precision
3611 * the two rounding functions take as the second parameter one of the
3612 following rounding modes (R):
3613 'even', 'odd', '+inf', '-inf', 'zero', 'trunc'
091c87b1
T
3614 * you can set/get the global R by using C<< Math::SomeClass->round_mode() >>
3615 or by setting C<< $Math::SomeClass::round_mode >>
3616 * after each operation, C<< $result->round() >> is called, and the result may
b22b3e31
PN
3617 eventually be rounded (that is, if A or P were set either locally,
3618 globally or as parameter to the operation)
091c87b1 3619 * to manually round a number, call C<< $x->round($A,$P,$round_mode); >>
b22b3e31 3620 this will round the number by using the appropriate rounding function
0716bf9b 3621 and then normalize it.
b22b3e31 3622 * rounding modifies the local settings of the number:
0716bf9b
JH
3623
3624 $x = Math::BigFloat->new(123.456);
3625 $x->accuracy(5);
3626 $x->bround(4);
3627
3628 Here 4 takes precedence over 5, so 123.5 is the result and $x->accuracy()
3629 will be 4 from now on.
3630
3631=item Default values
3632
3633 * R: 'even'
3634 * F: 40
3635 * A: undef
3636 * P: undef
3637
3638=item Remarks
3639
3640 * The defaults are set up so that the new code gives the same results as
3641 the old code (except in a few cases on fdiv):
3642 + Both A and P are undefined and thus will not be used for rounding
3643 after each operation.
3644 + round() is thus a no-op, unless given extra parameters A and P
58cde26e
JH
3645
3646=back
3647
0716bf9b
JH
3648=head1 INTERNALS
3649
574bacfe
JH
3650The actual numbers are stored as unsigned big integers (with seperate sign).
3651You should neither care about nor depend on the internal representation; it
3652might change without notice. Use only method calls like C<< $x->sign(); >>
3653instead relying on the internal hash keys like in C<< $x->{sign}; >>.
3654
3655=head2 MATH LIBRARY
58cde26e 3656
574bacfe 3657Math with the numbers is done (by default) by a module called
091c87b1 3658C<Math::BigInt::Calc>. This is equivalent to saying:
574bacfe
JH
3659
3660 use Math::BigInt lib => 'Calc';
58cde26e 3661
0716bf9b 3662You can change this by using:
58cde26e 3663
0716bf9b 3664 use Math::BigInt lib => 'BitVect';
58cde26e 3665
574bacfe
JH
3666The following would first try to find Math::BigInt::Foo, then
3667Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
0716bf9b 3668
574bacfe 3669 use Math::BigInt lib => 'Foo,Math::BigInt::Bar';
58cde26e 3670
091c87b1
T
3671Since Math::BigInt::GMP is in almost all cases faster than Calc (especially in
3672cases involving really big numbers, where it is B<much> faster), and there is
3673no penalty if Math::BigInt::GMP is not installed, it is a good idea to always
3674use the following:
3675
3676 use Math::BigInt lib => 'GMP';
3677
3678Different low-level libraries use different formats to store the
3679numbers. You should not depend on the number having a specific format.
3680
3681See the respective math library module documentation for further details.
58cde26e 3682
574bacfe
JH
3683=head2 SIGN
3684
3685The sign is either '+', '-', 'NaN', '+inf' or '-inf' and stored seperately.
3686
3687A sign of 'NaN' is used to represent the result when input arguments are not
3688numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
3689minus infinity. You will get '+inf' when dividing a positive number by 0, and
3690'-inf' when dividing any negative number by 0.
58cde26e
JH
3691
3692=head2 mantissa(), exponent() and parts()
3693
3694C<mantissa()> and C<exponent()> return the said parts of the BigInt such
3695that:
3696
3697 $m = $x->mantissa();
3698 $e = $x->exponent();
3699 $y = $m * ( 10 ** $e );
3700 print "ok\n" if $x == $y;
3701
b22b3e31
PN
3702C<< ($m,$e) = $x->parts() >> is just a shortcut that gives you both of them
3703in one go. Both the returned mantissa and exponent have a sign.
58cde26e 3704
091c87b1
T
3705Currently, for BigInts C<$e> is always 0, except for NaN, +inf and -inf,
3706where it is C<NaN>; and for C<$x == 0>, where it is C<1> (to be compatible
3707with Math::BigFloat's internal representation of a zero as C<0E1>).
58cde26e 3708
091c87b1
T
3709C<$m> is currently just a copy of the original number. The relation between
3710C<$e> and C<$m> will stay always the same, though their real values might
3711change.
0716bf9b 3712
58cde26e
JH
3713=head1 EXAMPLES
3714
394e6ffb 3715 use Math::BigInt;
574bacfe
JH
3716
3717 sub bint { Math::BigInt->new(shift); }
3718
394e6ffb 3719 $x = Math::BigInt->bstr("1234") # string "1234"
58cde26e 3720 $x = "$x"; # same as bstr()
990fb837
RGS
3721 $x = Math::BigInt->bneg("1234"); # BigInt "-1234"
3722 $x = Math::BigInt->babs("-12345"); # BigInt "12345"
58cde26e
JH
3723 $x = Math::BigInt->bnorm("-0 00"); # BigInt "0"
3724 $x = bint(1) + bint(2); # BigInt "3"
3725 $x = bint(1) + "2"; # ditto (auto-BigIntify of "2")
3726 $x = bint(1); # BigInt "1"
3727 $x = $x + 5 / 2; # BigInt "3"
3728 $x = $x ** 3; # BigInt "27"
3729 $x *= 2; # BigInt "54"
394e6ffb 3730 $x = Math::BigInt->new(0); # BigInt "0"
58cde26e
JH
3731 $x--; # BigInt "-1"
3732 $x = Math::BigInt->badd(4,5) # BigInt "9"
58cde26e 3733 print $x->bsstr(); # 9e+0
a5f75d66 3734
0716bf9b
JH
3735Examples for rounding:
3736
3737 use Math::BigFloat;
3738 use Test;
3739
3740 $x = Math::BigFloat->new(123.4567);
3741 $y = Math::BigFloat->new(123.456789);
394e6ffb 3742 Math::BigFloat->accuracy(4); # no more A than 4
0716bf9b
JH
3743
3744 ok ($x->copy()->fround(),123.4); # even rounding
3745 print $x->copy()->fround(),"\n"; # 123.4
3746 Math::BigFloat->round_mode('odd'); # round to odd
3747 print $x->copy()->fround(),"\n"; # 123.5
394e6ffb 3748 Math::BigFloat->accuracy(5); # no more A than 5
0716bf9b
JH
3749 Math::BigFloat->round_mode('odd'); # round to odd
3750 print $x->copy()->fround(),"\n"; # 123.46
3751 $y = $x->copy()->fround(4),"\n"; # A = 4: 123.4
3752 print "$y, ",$y->accuracy(),"\n"; # 123.4, 4
3753
394e6ffb
JH
3754 Math::BigFloat->accuracy(undef); # A not important now
3755 Math::BigFloat->precision(2); # P important
3756 print $x->copy()->bnorm(),"\n"; # 123.46
3757 print $x->copy()->fround(),"\n"; # 123.46
0716bf9b 3758
bd05a461
JH
3759Examples for converting:
3760
3761 my $x = Math::BigInt->new('0b1'.'01' x 123);
3762 print "bin: ",$x->as_bin()," hex:",$x->as_hex()," dec: ",$x,"\n";
3763
b3ac6de7
IZ
3764=head1 Autocreating constants
3765
56b9c951
JH
3766After C<use Math::BigInt ':constant'> all the B<integer> decimal, hexadecimal
3767and binary constants in the given scope are converted to C<Math::BigInt>.
3768This conversion happens at compile time.
b3ac6de7 3769
b22b3e31 3770In particular,
b3ac6de7 3771
58cde26e
JH
3772 perl -MMath::BigInt=:constant -e 'print 2**100,"\n"'
3773
56b9c951 3774prints the integer value of C<2**100>. Note that without conversion of
0716bf9b 3775constants the expression 2**100 will be calculated as perl scalar.
58cde26e
JH
3776
3777Please note that strings and floating point constants are not affected,
3778so that
3779
3780 use Math::BigInt qw/:constant/;
3781
3782 $x = 1234567890123456789012345678901234567890
3783 + 123456789123456789;
b22b3e31 3784 $y = '1234567890123456789012345678901234567890'
58cde26e 3785 + '123456789123456789';
b3ac6de7 3786
b22b3e31 3787do not work. You need an explicit Math::BigInt->new() around one of the
394e6ffb
JH
3788operands. You should also quote large constants to protect loss of precision:
3789
990fb837 3790 use Math::BigInt;
394e6ffb
JH
3791
3792 $x = Math::BigInt->new('1234567889123456789123456789123456789');
3793
3794Without the quotes Perl would convert the large number to a floating point
3795constant at compile time and then hand the result to BigInt, which results in
3796an truncated result or a NaN.
58cde26e 3797
56b9c951
JH
3798This also applies to integers that look like floating point constants:
3799
3800 use Math::BigInt ':constant';
3801
3802 print ref(123e2),"\n";
3803 print ref(123.2e2),"\n";
3804
3805will print nothing but newlines. Use either L<bignum> or L<Math::BigFloat>
3806to get this to work.
3807
58cde26e
JH
3808=head1 PERFORMANCE
3809
3810Using the form $x += $y; etc over $x = $x + $y is faster, since a copy of $x
3811must be made in the second case. For long numbers, the copy can eat up to 20%
b22b3e31 3812of the work (in the case of addition/subtraction, less for
58cde26e
JH
3813multiplication/division). If $y is very small compared to $x, the form
3814$x += $y is MUCH faster than $x = $x + $y since making the copy of $x takes
3815more time then the actual addition.
3816
b22b3e31 3817With a technique called copy-on-write, the cost of copying with overload could
394e6ffb
JH
3818be minimized or even completely avoided. A test implementation of COW did show
3819performance gains for overloaded math, but introduced a performance loss due
091c87b1
T
3820to a constant overhead for all other operatons. So Math::BigInt does currently
3821not COW.
394e6ffb 3822
091c87b1
T
3823The rewritten version of this module (vs. v0.01) is slower on certain
3824operations, like C<new()>, C<bstr()> and C<numify()>. The reason are that it
3825does now more work and handles much more cases. The time spent in these
3826operations is usually gained in the other math operations so that code on
3827the average should get (much) faster. If they don't, please contact the author.
58cde26e 3828
394e6ffb 3829Some operations may be slower for small numbers, but are significantly faster
091c87b1
T
3830for big numbers. Other operations are now constant (O(1), like C<bneg()>,
3831C<babs()> etc), instead of O(N) and thus nearly always take much less time.
3832These optimizations were done on purpose.
58cde26e 3833
574bacfe
JH
3834If you find the Calc module to slow, try to install any of the replacement
3835modules and see if they help you.
b3ac6de7 3836
574bacfe 3837=head2 Alternative math libraries
0716bf9b
JH
3838
3839You can use an alternative library to drive Math::BigInt via:
3840
3841 use Math::BigInt lib => 'Module';
3842
394e6ffb 3843See L<MATH LIBRARY> for more information.
0716bf9b 3844
394e6ffb 3845For more benchmark results see L<http://bloodgate.com/perl/benchmarks.html>.
574bacfe 3846
b3abae2a
JH
3847=head2 SUBCLASSING
3848
3849=head1 Subclassing Math::BigInt
3850
3851The basic design of Math::BigInt allows simple subclasses with very little
3852work, as long as a few simple rules are followed:
3853
3854=over 2
3855
3856=item *
3857
3858The public API must remain consistent, i.e. if a sub-class is overloading
3859addition, the sub-class must use the same name, in this case badd(). The
3860reason for this is that Math::BigInt is optimized to call the object methods
3861directly.
3862
3863=item *
3864
3865The private object hash keys like C<$x->{sign}> may not be changed, but
3866additional keys can be added, like C<$x->{_custom}>.
3867
3868=item *
3869
3870Accessor functions are available for all existing object hash keys and should
3871be used instead of directly accessing the internal hash keys. The reason for
3872this is that Math::BigInt itself has a pluggable interface which permits it
3873to support different storage methods.
3874
3875=back
3876
3877More complex sub-classes may have to replicate more of the logic internal of
3878Math::BigInt if they need to change more basic behaviors. A subclass that
3879needs to merely change the output only needs to overload C<bstr()>.
3880
3881All other object methods and overloaded functions can be directly inherited
3882from the parent class.
3883
3884At the very minimum, any subclass will need to provide it's own C<new()> and can
3885store additional hash keys in the object. There are also some package globals
3886that must be defined, e.g.:
3887
3888 # Globals
3889 $accuracy = undef;
3890 $precision = -2; # round to 2 decimal places
3891 $round_mode = 'even';
3892 $div_scale = 40;
3893
3894Additionally, you might want to provide the following two globals to allow
3895auto-upgrading and auto-downgrading to work correctly:
3896
3897 $upgrade = undef;
3898 $downgrade = undef;
3899
3900This allows Math::BigInt to correctly retrieve package globals from the
3901subclass, like C<$SubClass::precision>. See t/Math/BigInt/Subclass.pm or
3902t/Math/BigFloat/SubClass.pm completely functional subclass examples.
3903
3904Don't forget to
3905
3906 use overload;
3907
3908in your subclass to automatically inherit the overloading from the parent. If
3909you like, you can change part of the overloading, look at Math::String for an
3910example.
3911
3912=head1 UPGRADING
3913
3914When used like this:
3915
3916 use Math::BigInt upgrade => 'Foo::Bar';
3917
3918certain operations will 'upgrade' their calculation and thus the result to
3919the class Foo::Bar. Usually this is used in conjunction with Math::BigFloat:
3920
3921 use Math::BigInt upgrade => 'Math::BigFloat';
3922
3923As a shortcut, you can use the module C<bignum>:
3924
3925 use bignum;
3926
3927Also good for oneliners:
3928
3929 perl -Mbignum -le 'print 2 ** 255'
3930
3931This makes it possible to mix arguments of different classes (as in 2.5 + 2)
3932as well es preserve accuracy (as in sqrt(3)).
3933
3934Beware: This feature is not fully implemented yet.
3935
3936=head2 Auto-upgrade
3937
3938The following methods upgrade themselves unconditionally; that is if upgrade
3939is in effect, they will always hand up their work:
3940
3941=over 2
3942
3943=item bsqrt()
3944
3945=item div()
3946
3947=item blog()
3948
3949=back
3950
3951Beware: This list is not complete.
3952
3953All other methods upgrade themselves only when one (or all) of their
3954arguments are of the class mentioned in $upgrade (This might change in later
3955versions to a more sophisticated scheme):
3956
a5f75d66
AD
3957=head1 BUGS
3958
58cde26e
JH
3959=over 2
3960
990fb837
RGS
3961=item broot() does not work
3962
3963The broot() function in BigInt may only work for small values. This will be
3964fixed in a later version.
3965
574bacfe 3966=item Out of Memory!
58cde26e
JH
3967
3968Under Perl prior to 5.6.0 having an C<use Math::BigInt ':constant';> and
3969C<eval()> in your code will crash with "Out of memory". This is probably an
3970overload/exporter bug. You can workaround by not having C<eval()>
574bacfe
JH
3971and ':constant' at the same time or upgrade your Perl to a newer version.
3972
3973=item Fails to load Calc on Perl prior 5.6.0
3974
3975Since eval(' use ...') can not be used in conjunction with ':constant', BigInt
3976will fall back to eval { require ... } when loading the math lib on Perls
3977prior to 5.6.0. This simple replaces '::' with '/' and thus might fail on
3978filesystems using a different seperator.
58cde26e
JH
3979
3980=back
3981
3982=head1 CAVEATS
3983
3984Some things might not work as you expect them. Below is documented what is
3985known to be troublesome:
3986
3987=over 1
3988
091c87b1 3989=item bstr(), bsstr() and 'cmp'
58cde26e 3990
091c87b1
T
3991Both C<bstr()> and C<bsstr()> as well as automated stringify via overload now
3992drop the leading '+'. The old code would return '+3', the new returns '3'.
3993This is to be consistent with Perl and to make C<cmp> (especially with
3994overloading) to work as you expect. It also solves problems with C<Test.pm>,
3995because it's C<ok()> uses 'eq' internally.
58cde26e 3996
091c87b1
T
3997Mark Biggar said, when asked about to drop the '+' altogether, or make only
3998C<cmp> work:
58cde26e
JH
3999
4000 I agree (with the first alternative), don't add the '+' on positive
4001 numbers. It's not as important anymore with the new internal
4002 form for numbers. It made doing things like abs and neg easier,
4003 but those have to be done differently now anyway.
4004
4005So, the following examples will now work all as expected:
4006
4007 use Test;
4008 BEGIN { plan tests => 1 }
4009 use Math::BigInt;
4010
4011 my $x = new Math::BigInt 3*3;
4012 my $y = new Math::BigInt 3*3;
4013
4014 ok ($x,3*3);
4015 print "$x eq 9" if $x eq $y;
4016 print "$x eq 9" if $x eq '9';
4017 print "$x eq 9" if $x eq 3*3;
4018
4019Additionally, the following still works:
4020
4021 print "$x == 9" if $x == $y;
4022 print "$x == 9" if $x == 9;
4023 print "$x == 9" if $x == 3*3;
4024
4025There is now a C<bsstr()> method to get the string in scientific notation aka
4026C<1e+2> instead of C<100>. Be advised that overloaded 'eq' always uses bstr()
4027for comparisation, but Perl will represent some numbers as 100 and others
091c87b1
T
4028as 1e+308. If in doubt, convert both arguments to Math::BigInt before
4029comparing them as strings:
58cde26e
JH
4030
4031 use Test;
4032 BEGIN { plan tests => 3 }
4033 use Math::BigInt;
4034
4035 $x = Math::BigInt->new('1e56'); $y = 1e56;
4036 ok ($x,$y); # will fail
4037 ok ($x->bsstr(),$y); # okay
4038 $y = Math::BigInt->new($y);
4039 ok ($x,$y); # okay
4040
091c87b1
T
4041Alternatively, simple use C<< <=> >> for comparisations, this will get it
4042always right. There is not yet a way to get a number automatically represented
4043as a string that matches exactly the way Perl represents it.
574bacfe 4044
58cde26e
JH
4045=item int()
4046
4047C<int()> will return (at least for Perl v5.7.1 and up) another BigInt, not a
4048Perl scalar:
4049
4050 $x = Math::BigInt->new(123);
4051 $y = int($x); # BigInt 123
4052 $x = Math::BigFloat->new(123.45);
4053 $y = int($x); # BigInt 123
4054
4055In all Perl versions you can use C<as_number()> for the same effect:
4056
4057 $x = Math::BigFloat->new(123.45);
4058 $y = $x->as_number(); # BigInt 123
4059
4060This also works for other subclasses, like Math::String.
4061
574bacfe
JH
4062It is yet unlcear whether overloaded int() should return a scalar or a BigInt.
4063
dccbb853 4064=item length
58cde26e
JH
4065
4066The following will probably not do what you expect:
4067
bd05a461
JH
4068 $c = Math::BigInt->new(123);
4069 print $c->length(),"\n"; # prints 30
4070
4071It prints both the number of digits in the number and in the fraction part
4072since print calls C<length()> in list context. Use something like:
4073
4074 print scalar $c->length(),"\n"; # prints 3
4075
4076=item bdiv
4077
4078The following will probably not do what you expect:
4079
58cde26e
JH
4080 print $c->bdiv(10000),"\n";
4081
dccbb853 4082It prints both quotient and remainder since print calls C<bdiv()> in list
58cde26e
JH
4083context. Also, C<bdiv()> will modify $c, so be carefull. You probably want
4084to use
4085
4086 print $c / 10000,"\n";
4087 print scalar $c->bdiv(10000),"\n"; # or if you want to modify $c
4088
4089instead.
4090
4091The quotient is always the greatest integer less than or equal to the
4092real-valued quotient of the two operands, and the remainder (when it is
4093nonzero) always has the same sign as the second operand; so, for
4094example,
4095
dccbb853
JH
4096 1 / 4 => ( 0, 1)
4097 1 / -4 => (-1,-3)
4098 -3 / 4 => (-1, 1)
4099 -3 / -4 => ( 0,-3)
4100 -11 / 2 => (-5,1)
4101 11 /-2 => (-5,-1)
58cde26e
JH
4102
4103As a consequence, the behavior of the operator % agrees with the
4104behavior of Perl's built-in % operator (as documented in the perlop
4105manpage), and the equation
4106
4107 $x == ($x / $y) * $y + ($x % $y)
4108
4109holds true for any $x and $y, which justifies calling the two return
dccbb853
JH
4110values of bdiv() the quotient and remainder. The only exception to this rule
4111are when $y == 0 and $x is negative, then the remainder will also be
4112negative. See below under "infinity handling" for the reasoning behing this.
58cde26e
JH
4113
4114Perl's 'use integer;' changes the behaviour of % and / for scalars, but will
4115not change BigInt's way to do things. This is because under 'use integer' Perl
4116will do what the underlying C thinks is right and this is different for each
4117system. If you need BigInt's behaving exactly like Perl's 'use integer', bug
4118the author to implement it ;)
4119
dccbb853
JH
4120=item infinity handling
4121
4122Here are some examples that explain the reasons why certain results occur while
4123handling infinity:
4124
4125The following table shows the result of the division and the remainder, so that
4126the equation above holds true. Some "ordinary" cases are strewn in to show more
4127clearly the reasoning:
4128
4129 A / B = C, R so that C * B + R = A
4130 =========================================================
4131 5 / 8 = 0, 5 0 * 8 + 5 = 5
4132 0 / 8 = 0, 0 0 * 8 + 0 = 0
4133 0 / inf = 0, 0 0 * inf + 0 = 0
4134 0 /-inf = 0, 0 0 * -inf + 0 = 0
4135 5 / inf = 0, 5 0 * inf + 5 = 5
4136 5 /-inf = 0, 5 0 * -inf + 5 = 5
4137 -5/ inf = 0, -5 0 * inf + -5 = -5
4138 -5/-inf = 0, -5 0 * -inf + -5 = -5
4139 inf/ 5 = inf, 0 inf * 5 + 0 = inf
4140 -inf/ 5 = -inf, 0 -inf * 5 + 0 = -inf
4141 inf/ -5 = -inf, 0 -inf * -5 + 0 = inf
4142 -inf/ -5 = inf, 0 inf * -5 + 0 = -inf
4143 5/ 5 = 1, 0 1 * 5 + 0 = 5
4144 -5/ -5 = 1, 0 1 * -5 + 0 = -5
4145 inf/ inf = 1, 0 1 * inf + 0 = inf
4146 -inf/-inf = 1, 0 1 * -inf + 0 = -inf
4147 inf/-inf = -1, 0 -1 * -inf + 0 = inf
4148 -inf/ inf = -1, 0 1 * -inf + 0 = -inf
4149 8/ 0 = inf, 8 inf * 0 + 8 = 8
4150 inf/ 0 = inf, inf inf * 0 + inf = inf
4151 0/ 0 = NaN
4152
4153These cases below violate the "remainder has the sign of the second of the two
4154arguments", since they wouldn't match up otherwise.
4155
4156 A / B = C, R so that C * B + R = A
4157 ========================================================
4158 -inf/ 0 = -inf, -inf -inf * 0 + inf = -inf
4159 -8/ 0 = -inf, -8 -inf * 0 + 8 = -8
4160
58cde26e
JH
4161=item Modifying and =
4162
4163Beware of:
4164
4165 $x = Math::BigFloat->new(5);
4166 $y = $x;
4167
4168It will not do what you think, e.g. making a copy of $x. Instead it just makes
4169a second reference to the B<same> object and stores it in $y. Thus anything
17baacb7
JH
4170that modifies $x (except overloaded operators) will modify $y, and vice versa.
4171Or in other words, C<=> is only safe if you modify your BigInts only via
4172overloaded math. As soon as you use a method call it breaks:
58cde26e
JH
4173
4174 $x->bmul(2);
4175 print "$x, $y\n"; # prints '10, 10'
4176
4177If you want a true copy of $x, use:
4178
4179 $y = $x->copy();
4180
17baacb7
JH
4181You can also chain the calls like this, this will make first a copy and then
4182multiply it by 2:
4183
4184 $y = $x->copy()->bmul(2);
4185
b22b3e31 4186See also the documentation for overload.pm regarding C<=>.
58cde26e
JH
4187
4188=item bpow
4189
4190C<bpow()> (and the rounding functions) now modifies the first argument and
574bacfe 4191returns it, unlike the old code which left it alone and only returned the
58cde26e
JH
4192result. This is to be consistent with C<badd()> etc. The first three will
4193modify $x, the last one won't:
4194
4195 print bpow($x,$i),"\n"; # modify $x
4196 print $x->bpow($i),"\n"; # ditto
4197 print $x **= $i,"\n"; # the same
4198 print $x ** $i,"\n"; # leave $x alone
4199
4200The form C<$x **= $y> is faster than C<$x = $x ** $y;>, though.
4201
4202=item Overloading -$x
4203
4204The following:
4205
4206 $x = -$x;
4207
4208is slower than
4209
4210 $x->bneg();
4211
4212since overload calls C<sub($x,0,1);> instead of C<neg($x)>. The first variant
4213needs to preserve $x since it does not know that it later will get overwritten.
0716bf9b 4214This makes a copy of $x and takes O(N), but $x->bneg() is O(1).
58cde26e 4215
394e6ffb
JH
4216With Copy-On-Write, this issue would be gone, but C-o-W is not implemented
4217since it is slower for all other things.
58cde26e
JH
4218
4219=item Mixing different object types
4220
4221In Perl you will get a floating point value if you do one of the following:
4222
4223 $float = 5.0 + 2;
4224 $float = 2 + 5.0;
4225 $float = 5 / 2;
4226
4227With overloaded math, only the first two variants will result in a BigFloat:
4228
4229 use Math::BigInt;
4230 use Math::BigFloat;
4231
4232 $mbf = Math::BigFloat->new(5);
4233 $mbi2 = Math::BigInteger->new(5);
4234 $mbi = Math::BigInteger->new(2);
4235
4236 # what actually gets called:
4237 $float = $mbf + $mbi; # $mbf->badd()
4238 $float = $mbf / $mbi; # $mbf->bdiv()
4239 $integer = $mbi + $mbf; # $mbi->badd()
4240 $integer = $mbi2 / $mbi; # $mbi2->bdiv()
4241 $integer = $mbi2 / $mbf; # $mbi2->bdiv()
4242
4243This is because math with overloaded operators follows the first (dominating)
394e6ffb 4244operand, and the operation of that is called and returns thus the result. So,
58cde26e
JH
4245Math::BigInt::bdiv() will always return a Math::BigInt, regardless whether
4246the result should be a Math::BigFloat or the second operant is one.
4247
4248To get a Math::BigFloat you either need to call the operation manually,
4249make sure the operands are already of the proper type or casted to that type
4250via Math::BigFloat->new():
4251
4252 $float = Math::BigFloat->new($mbi2) / $mbi; # = 2.5
4253
4254Beware of simple "casting" the entire expression, this would only convert
4255the already computed result:
4256
4257 $float = Math::BigFloat->new($mbi2 / $mbi); # = 2.0 thus wrong!
4258
0716bf9b 4259Beware also of the order of more complicated expressions like:
58cde26e
JH
4260
4261 $integer = ($mbi2 + $mbi) / $mbf; # int / float => int
4262 $integer = $mbi2 / Math::BigFloat->new($mbi); # ditto
4263
4264If in doubt, break the expression into simpler terms, or cast all operands
4265to the desired resulting type.
4266
4267Scalar values are a bit different, since:
4268
4269 $float = 2 + $mbf;
4270 $float = $mbf + 2;
4271
4272will both result in the proper type due to the way the overloaded math works.
4273
4274This section also applies to other overloaded math packages, like Math::String.
4275
990fb837
RGS
4276One solution to you problem might be autoupgrading|upgrading. See the
4277pragmas L<bignum>, L<bigint> and L<bigrat> for an easy way to do this.
b3abae2a 4278
58cde26e
JH
4279=item bsqrt()
4280
394e6ffb 4281C<bsqrt()> works only good if the result is a big integer, e.g. the square
58cde26e 4282root of 144 is 12, but from 12 the square root is 3, regardless of rounding
990fb837 4283mode. The reason is that the result is always truncated to an integer.
58cde26e
JH
4284
4285If you want a better approximation of the square root, then use:
4286
4287 $x = Math::BigFloat->new(12);
394e6ffb 4288 Math::BigFloat->precision(0);
58cde26e
JH
4289 Math::BigFloat->round_mode('even');
4290 print $x->copy->bsqrt(),"\n"; # 4
4291
394e6ffb 4292 Math::BigFloat->precision(2);
58cde26e
JH
4293 print $x->bsqrt(),"\n"; # 3.46
4294 print $x->bsqrt(3),"\n"; # 3.464
4295
b3abae2a
JH
4296=item brsft()
4297
4298For negative numbers in base see also L<brsft|brsft>.
4299
58cde26e
JH
4300=back
4301
4302=head1 LICENSE
4303
4304This program is free software; you may redistribute it and/or modify it under
4305the same terms as Perl itself.
a5f75d66 4306
0716bf9b
JH
4307=head1 SEE ALSO
4308
990fb837
RGS
4309L<Math::BigFloat>, L<Math::BigRat> and L<Math::Big> as well as
4310L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
4311
4312The pragmas L<bignum>, L<bigint> and L<bigrat> also might be of interest
4313because they solve the autoupgrading/downgrading issue, at least partly.
0716bf9b 4314
027dc388
JH
4315The package at
4316L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigInt> contains
4317more documentation including a full version history, testcases, empty
4318subclass files and benchmarks.
574bacfe 4319
58cde26e 4320=head1 AUTHORS
a5f75d66 4321
58cde26e 4322Original code by Mark Biggar, overloaded interface by Ilya Zakharevich.
ef9466ea
T
4323Completely rewritten by Tels http://bloodgate.com in late 2000, 2001 - 2003
4324and still at it in 2004.
990fb837
RGS
4325
4326Many people contributed in one or more ways to the final beast, see the file
4327CREDITS for an (uncomplete) list. If you miss your name, please drop me a
4328mail. Thank you!
a5f75d66
AD
4329
4330=cut