1 # The following hash values are used:
2 # value: unsigned int with actual value (as a Math::BigInt::Calc or similiar)
3 # sign : +,-,NaN,+inf,-inf
6 # _f : flags, used by MBF to flag parts of a float as untouchable
8 # Remember not to take shortcuts ala $xs = $x->{value}; $CALC->foo($xs); since
9 # underlying lib might change the reference!
12 my $class = "Math::BigInt";
17 @ISA = qw( Exporter );
18 @EXPORT_OK = qw( objectify _swap bgcd blcm);
19 use vars qw/$round_mode $accuracy $precision $div_scale $rnd_mode/;
20 use vars qw/$upgrade $downgrade/;
23 # Inside overload, the first arg is always an object. If the original code had
24 # it reversed (like $x = 2 * $y), then the third paramater indicates this
25 # swapping. To make it work, we use a helper routine which not only reswaps the
26 # params, but also makes a new object in this case. See _swap() for details,
27 # especially the cases of operators with different classes.
29 # For overloaded ops with only one argument we simple use $_[0]->copy() to
30 # preserve the argument.
32 # Thus inheritance of overload operators becomes possible and transparent for
33 # our subclasses without the need to repeat the entire overload section there.
36 '=' => sub { $_[0]->copy(); },
38 # '+' and '-' do not use _swap, since it is a triffle slower. If you want to
39 # override _swap (if ever), then override overload of '+' and '-', too!
40 # for sub it is a bit tricky to keep b: b-a => -a+b
41 '-' => sub { my $c = $_[0]->copy; $_[2] ?
42 $c->bneg()->badd($_[1]) :
44 '+' => sub { $_[0]->copy()->badd($_[1]); },
46 # some shortcuts for speed (assumes that reversed order of arguments is routed
47 # to normal '+' and we thus can always modify first arg. If this is changed,
48 # this breaks and must be adjusted.)
49 '+=' => sub { $_[0]->badd($_[1]); },
50 '-=' => sub { $_[0]->bsub($_[1]); },
51 '*=' => sub { $_[0]->bmul($_[1]); },
52 '/=' => sub { scalar $_[0]->bdiv($_[1]); },
53 '%=' => sub { $_[0]->bmod($_[1]); },
54 '^=' => sub { $_[0]->bxor($_[1]); },
55 '&=' => sub { $_[0]->band($_[1]); },
56 '|=' => sub { $_[0]->bior($_[1]); },
57 '**=' => sub { $_[0]->bpow($_[1]); },
59 # not supported by Perl yet
60 '..' => \&_pointpoint,
62 '<=>' => sub { $_[2] ?
63 ref($_[0])->bcmp($_[1],$_[0]) :
64 ref($_[0])->bcmp($_[0],$_[1])},
67 "$_[1]" cmp $_[0]->bstr() :
68 $_[0]->bstr() cmp "$_[1]" },
70 'log' => sub { $_[0]->copy()->blog(); },
71 'int' => sub { $_[0]->copy(); },
72 'neg' => sub { $_[0]->copy()->bneg(); },
73 'abs' => sub { $_[0]->copy()->babs(); },
74 'sqrt' => sub { $_[0]->copy()->bsqrt(); },
75 '~' => sub { $_[0]->copy()->bnot(); },
77 '*' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bmul($a[1]); },
78 '/' => sub { my @a = ref($_[0])->_swap(@_);scalar $a[0]->bdiv($a[1]);},
79 '%' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bmod($a[1]); },
80 '**' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bpow($a[1]); },
81 '<<' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->blsft($a[1]); },
82 '>>' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->brsft($a[1]); },
84 '&' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->band($a[1]); },
85 '|' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bior($a[1]); },
86 '^' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bxor($a[1]); },
88 # can modify arg of ++ and --, so avoid a new-copy for speed, but don't
89 # use $_[0]->__one(), it modifies $_[0] to be 1!
90 '++' => sub { $_[0]->binc() },
91 '--' => sub { $_[0]->bdec() },
93 # if overloaded, O(1) instead of O(N) and twice as fast for small numbers
95 # this kludge is needed for perl prior 5.6.0 since returning 0 here fails :-/
96 # v5.6.1 dumps on that: return !$_[0]->is_zero() || undef; :-(
97 my $t = !$_[0]->is_zero();
102 # the original qw() does not work with the TIESCALAR below, why?
103 # Order of arguments unsignificant
104 '""' => sub { $_[0]->bstr(); },
105 '0+' => sub { $_[0]->numify(); }
108 ##############################################################################
109 # global constants, flags and accessory
111 use constant MB_NEVER_ROUND => 0x0001;
113 my $NaNOK=1; # are NaNs ok?
114 my $nan = 'NaN'; # constants for easier life
116 my $CALC = 'Math::BigInt::Calc'; # module to do low level math
117 my $IMPORT = 0; # did import() yet?
119 $round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
124 $upgrade = undef; # default is no upgrade
125 $downgrade = undef; # default is no downgrade
127 ##############################################################################
128 # the old code had $rnd_mode, so we need to support it, too
131 sub TIESCALAR { my ($class) = @_; bless \$round_mode, $class; }
132 sub FETCH { return $round_mode; }
133 sub STORE { $rnd_mode = $_[0]->round_mode($_[1]); }
135 BEGIN { tie $rnd_mode, 'Math::BigInt'; }
137 ##############################################################################
142 # make Class->round_mode() work
144 my $class = ref($self) || $self || __PACKAGE__;
148 die "Unknown round mode $m"
149 if $m !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/;
150 return ${"${class}::round_mode"} = $m;
152 return ${"${class}::round_mode"};
158 # make Class->round_mode() work
160 my $class = ref($self) || $self || __PACKAGE__;
164 return ${"${class}::upgrade"} = $u;
166 return ${"${class}::upgrade"};
172 # make Class->round_mode() work
174 my $class = ref($self) || $self || __PACKAGE__;
177 die ('div_scale must be greater than zero') if $_[0] < 0;
178 ${"${class}::div_scale"} = shift;
180 return ${"${class}::div_scale"};
185 # $x->accuracy($a); ref($x) $a
186 # $x->accuracy(); ref($x)
187 # Class->accuracy(); class
188 # Class->accuracy($a); class $a
191 my $class = ref($x) || $x || __PACKAGE__;
194 # need to set new value?
198 die ('accuracy must not be zero') if defined $a && $a == 0;
201 # $object->accuracy() or fallback to global
202 $x->bround($a) if defined $a;
203 $x->{_a} = $a; # set/overwrite, even if not rounded
204 $x->{_p} = undef; # clear P
209 ${"${class}::accuracy"} = $a;
210 ${"${class}::precision"} = undef; # clear P
212 return $a; # shortcut
217 # $object->accuracy() or fallback to global
218 return $x->{_a} || ${"${class}::accuracy"};
220 return ${"${class}::accuracy"};
225 # $x->precision($p); ref($x) $p
226 # $x->precision(); ref($x)
227 # Class->precision(); class
228 # Class->precision($p); class $p
231 my $class = ref($x) || $x || __PACKAGE__;
234 # need to set new value?
240 # $object->precision() or fallback to global
241 $x->bfround($p) if defined $p;
242 $x->{_p} = $p; # set/overwrite, even if not rounded
243 $x->{_a} = undef; # clear A
248 ${"${class}::precision"} = $p;
249 ${"${class}::accuracy"} = undef; # clear A
251 return $p; # shortcut
256 # $object->precision() or fallback to global
257 return $x->{_p} || ${"${class}::precision"};
259 return ${"${class}::precision"};
264 # return (later set?) configuration data as hash ref
265 my $class = shift || 'Math::BigInt';
271 lib_version => ${"${lib}::VERSION"},
275 qw/upgrade downgrade precisison accuracy round_mode VERSION div_scale/)
277 $cfg->{lc($_)} = ${"${class}::$_"};
284 # select accuracy parameter based on precedence,
285 # used by bround() and bfround(), may return undef for scale (means no op)
286 my ($x,$s,$m,$scale,$mode) = @_;
287 $scale = $x->{_a} if !defined $scale;
288 $scale = $s if (!defined $scale);
289 $mode = $m if !defined $mode;
290 return ($scale,$mode);
295 # select precision parameter based on precedence,
296 # used by bround() and bfround(), may return undef for scale (means no op)
297 my ($x,$s,$m,$scale,$mode) = @_;
298 $scale = $x->{_p} if !defined $scale;
299 $scale = $s if (!defined $scale);
300 $mode = $m if !defined $mode;
301 return ($scale,$mode);
304 ##############################################################################
312 # if two arguments, the first one is the class to "swallow" subclasses
320 return unless ref($x); # only for objects
322 my $self = {}; bless $self,$c;
324 foreach my $k (keys %$x)
328 $self->{value} = $CALC->_copy($x->{value}); next;
330 if (!($r = ref($x->{$k})))
332 $self->{$k} = $x->{$k}; next;
336 $self->{$k} = \${$x->{$k}};
338 elsif ($r eq 'ARRAY')
340 $self->{$k} = [ @{$x->{$k}} ];
344 # only one level deep!
345 foreach my $h (keys %{$x->{$k}})
347 $self->{$k}->{$h} = $x->{$k}->{$h};
353 if ($xk->can('copy'))
355 $self->{$k} = $xk->copy();
359 $self->{$k} = $xk->new($xk);
368 # create a new BigInt object from a string or another BigInt object.
369 # see hash keys documented at top
371 # the argument could be an object, so avoid ||, && etc on it, this would
372 # cause costly overloaded code to be called. The only allowed ops are
375 my ($class,$wanted,$a,$p,$r) = @_;
377 # avoid numify-calls by not using || on $wanted!
378 return $class->bzero($a,$p) if !defined $wanted; # default to 0
379 return $class->copy($wanted,$a,$p,$r) if ref($wanted);
381 $class->import() if $IMPORT == 0; # make require work
383 my $self = {}; bless $self, $class;
384 # handle '+inf', '-inf' first
385 if ($wanted =~ /^[+-]?inf$/)
387 $self->{value} = $CALC->_zero();
388 $self->{sign} = $wanted; $self->{sign} = '+inf' if $self->{sign} eq 'inf';
391 # split str in m mantissa, e exponent, i integer, f fraction, v value, s sign
392 my ($mis,$miv,$mfv,$es,$ev) = _split(\$wanted);
395 die "$wanted is not a number initialized to $class" if !$NaNOK;
397 $self->{value} = $CALC->_zero();
398 $self->{sign} = $nan;
403 # _from_hex or _from_bin
404 $self->{value} = $mis->{value};
405 $self->{sign} = $mis->{sign};
406 return $self; # throw away $mis
408 # make integer from mantissa by adjusting exp, then convert to bigint
409 $self->{sign} = $$mis; # store sign
410 $self->{value} = $CALC->_zero(); # for all the NaN cases
411 my $e = int("$$es$$ev"); # exponent (avoid recursion)
414 my $diff = $e - CORE::length($$mfv);
415 if ($diff < 0) # Not integer
418 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
419 $self->{sign} = $nan;
423 # adjust fraction and add it to value
424 # print "diff > 0 $$miv\n";
425 $$miv = $$miv . ($$mfv . '0' x $diff);
430 if ($$mfv ne '') # e <= 0
432 # fraction and negative/zero E => NOI
433 #print "NOI 2 \$\$mfv '$$mfv'\n";
434 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
435 $self->{sign} = $nan;
439 # xE-y, and empty mfv
442 if ($$miv !~ s/0{$e}$//) # can strip so many zero's?
445 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
446 $self->{sign} = $nan;
450 $self->{sign} = '+' if $$miv eq '0'; # normalize -0 => +0
451 $self->{value} = $CALC->_new($miv) if $self->{sign} =~ /^[+-]$/;
452 # if any of the globals is set, use them to round and store them inside $self
453 # do not round for new($x,undef,undef) since that is used by MBF to signal
455 $self->round($a,$p,$r) unless @_ == 4 && !defined $a && !defined $p;
456 # print "mbi new $self\n";
462 # create a bigint 'NaN', if given a BigInt, set it to 'NaN'
464 $self = $class if !defined $self;
467 my $c = $self; $self = {}; bless $self, $c;
469 $self->import() if $IMPORT == 0; # make require work
470 return if $self->modify('bnan');
471 $self->{value} = $CALC->_zero();
472 $self->{sign} = $nan;
473 delete $self->{_a}; delete $self->{_p}; # rounding NaN is silly
479 # create a bigint '+-inf', if given a BigInt, set it to '+-inf'
480 # the sign is either '+', or if given, used from there
482 my $sign = shift; $sign = '+' if !defined $sign || $sign ne '-';
483 $self = $class if !defined $self;
486 my $c = $self; $self = {}; bless $self, $c;
488 $self->import() if $IMPORT == 0; # make require work
489 return if $self->modify('binf');
490 $self->{value} = $CALC->_zero();
491 $self->{sign} = $sign.'inf';
492 ($self->{_a},$self->{_p}) = @_; # take over requested rounding
498 # create a bigint '+0', if given a BigInt, set it to 0
500 $self = $class if !defined $self;
504 my $c = $self; $self = {}; bless $self, $c;
506 $self->import() if $IMPORT == 0; # make require work
507 return if $self->modify('bzero');
508 $self->{value} = $CALC->_zero();
513 if (defined $self->{_a} && defined $_[0] && $_[0] > $self->{_a});
515 if (defined $self->{_p} && defined $_[1] && $_[1] < $self->{_p});
522 # create a bigint '+1' (or -1 if given sign '-'),
523 # if given a BigInt, set it to +1 or -1, respecively
525 my $sign = shift; $sign = '+' if !defined $sign || $sign ne '-';
526 $self = $class if !defined $self;
530 my $c = $self; $self = {}; bless $self, $c;
532 $self->import() if $IMPORT == 0; # make require work
533 return if $self->modify('bone');
534 $self->{value} = $CALC->_one();
535 $self->{sign} = $sign;
539 if (defined $self->{_a} && defined $_[0] && $_[0] > $self->{_a});
541 if (defined $self->{_p} && defined $_[1] && $_[1] < $self->{_p});
546 ##############################################################################
547 # string conversation
551 # (ref to BFLOAT or num_str ) return num_str
552 # Convert number from internal format to scientific string format.
553 # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
554 my $x = shift; $class = ref($x) || $x; $x = $class->new(shift) if !ref($x);
555 # my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
557 if ($x->{sign} !~ /^[+-]$/)
559 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
562 my ($m,$e) = $x->parts();
563 # e can only be positive
565 # MBF: my $s = $e->{sign}; $s = '' if $s eq '-'; my $sep = 'e'.$s;
566 return $m->bstr().$sign.$e->bstr();
571 # make a string from bigint object
572 my $x = shift; $class = ref($x) || $x; $x = $class->new(shift) if !ref($x);
573 # my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
575 if ($x->{sign} !~ /^[+-]$/)
577 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
580 my $es = ''; $es = $x->{sign} if $x->{sign} eq '-';
581 return $es.${$CALC->_str($x->{value})};
586 # Make a "normal" scalar from a BigInt object
587 my $x = shift; $x = $class->new($x) unless ref $x;
588 return $x->{sign} if $x->{sign} !~ /^[+-]$/;
589 my $num = $CALC->_num($x->{value});
590 return -$num if $x->{sign} eq '-';
594 ##############################################################################
595 # public stuff (usually prefixed with "b")
599 # return the sign of the number: +/-/NaN
600 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
605 sub _find_round_parameters
607 # After any operation or when calling round(), the result is rounded by
608 # regarding the A & P from arguments, local parameters, or globals.
610 # This procedure finds the round parameters, but it is for speed reasons
611 # duplicated in round. Otherwise, it is tested by the testsuite and used
614 my ($self,$a,$p,$r,@args) = @_;
615 # $a accuracy, if given by caller
616 # $p precision, if given by caller
617 # $r round_mode, if given by caller
618 # @args all 'other' arguments (0 for unary, 1 for binary ops)
620 # leave bigfloat parts alone
621 return ($self) if exists $self->{_f} && $self->{_f} & MB_NEVER_ROUND != 0;
623 my $c = ref($self); # find out class of argument(s)
626 # now pick $a or $p, but only if we have got "arguments"
629 foreach ($self,@args)
631 # take the defined one, or if both defined, the one that is smaller
632 $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
637 # even if $a is defined, take $p, to signal error for both defined
638 foreach ($self,@args)
640 # take the defined one, or if both defined, the one that is bigger
642 $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
645 # if still none defined, use globals (#2)
646 $a = ${"$c\::accuracy"} unless defined $a;
647 $p = ${"$c\::precision"} unless defined $p;
650 return ($self) unless defined $a || defined $p; # early out
652 # set A and set P is an fatal error
653 return ($self->bnan()) if defined $a && defined $p;
655 $r = ${"$c\::round_mode"} unless defined $r;
656 die "Unknown round mode '$r'" if $r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/;
658 return ($self,$a,$p,$r);
663 # Round $self according to given parameters, or given second argument's
664 # parameters or global defaults
666 # for speed reasons, _find_round_parameters is embeded here:
668 my ($self,$a,$p,$r,@args) = @_;
669 # $a accuracy, if given by caller
670 # $p precision, if given by caller
671 # $r round_mode, if given by caller
672 # @args all 'other' arguments (0 for unary, 1 for binary ops)
674 # leave bigfloat parts alone
675 return ($self) if exists $self->{_f} && $self->{_f} & MB_NEVER_ROUND != 0;
677 my $c = ref($self); # find out class of argument(s)
680 # now pick $a or $p, but only if we have got "arguments"
683 foreach ($self,@args)
685 # take the defined one, or if both defined, the one that is smaller
686 $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
691 # even if $a is defined, take $p, to signal error for both defined
692 foreach ($self,@args)
694 # take the defined one, or if both defined, the one that is bigger
696 $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
699 # if still none defined, use globals (#2)
700 $a = ${"$c\::accuracy"} unless defined $a;
701 $p = ${"$c\::precision"} unless defined $p;
704 return $self unless defined $a || defined $p; # early out
706 # set A and set P is an fatal error
707 return $self->bnan() if defined $a && defined $p;
709 $r = ${"$c\::round_mode"} unless defined $r;
710 die "Unknown round mode '$r'" if $r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/;
712 # now round, by calling either fround or ffround:
715 $self->bround($a,$r) if !defined $self->{_a} || $self->{_a} >= $a;
717 else # both can't be undefined due to early out
719 $self->bfround($p,$r) if !defined $self->{_p} || $self->{_p} <= $p;
721 $self->bnorm(); # after round, normalize
726 # (numstr or BINT) return BINT
727 # Normalize number -- no-op here
728 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
734 # (BINT or num_str) return BINT
735 # make number absolute, or return absolute BINT from string
736 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
738 return $x if $x->modify('babs');
739 # post-normalized abs for internal use (does nothing for NaN)
740 $x->{sign} =~ s/^-/+/;
746 # (BINT or num_str) return BINT
747 # negate number or make a negated number from string
748 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
750 return $x if $x->modify('bneg');
752 # for +0 dont negate (to have always normalized)
753 $x->{sign} =~ tr/+-/-+/ if !$x->is_zero(); # does nothing for NaN
759 # Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort)
760 # (BINT or num_str, BINT or num_str) return cond_code
761 my ($self,$x,$y) = objectify(2,@_);
763 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
765 # handle +-inf and NaN
766 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
767 return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
768 return +1 if $x->{sign} eq '+inf';
769 return -1 if $x->{sign} eq '-inf';
770 return -1 if $y->{sign} eq '+inf';
773 # check sign for speed first
774 return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y
775 return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0
778 my $xz = $x->is_zero();
779 my $yz = $y->is_zero();
780 return 0 if $xz && $yz; # 0 <=> 0
781 return -1 if $xz && $y->{sign} eq '+'; # 0 <=> +y
782 return 1 if $yz && $x->{sign} eq '+'; # +x <=> 0
784 # post-normalized compare for internal use (honors signs)
785 if ($x->{sign} eq '+')
787 return 1 if $y->{sign} eq '-'; # 0 check handled above
788 return $CALC->_acmp($x->{value},$y->{value});
792 return -1 if $y->{sign} eq '+';
793 $CALC->_acmp($y->{value},$x->{value}); # swaped (lib does only 0,1,-1)
798 # Compares 2 values, ignoring their signs.
799 # Returns one of undef, <0, =0, >0. (suitable for sort)
800 # (BINT, BINT) return cond_code
801 my ($self,$x,$y) = objectify(2,@_);
803 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
805 # handle +-inf and NaN
806 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
807 return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
808 return +1; # inf is always bigger
810 $CALC->_acmp($x->{value},$y->{value}); # lib does only 0,1,-1
815 # add second arg (BINT or string) to first (BINT) (modifies first)
816 # return result as BINT
817 my ($self,$x,$y,@r) = objectify(2,@_);
819 return $x if $x->modify('badd');
820 # print "mbi badd ",join(' ',caller()),"\n";
821 # print "upgrade => ",$upgrade||'undef',
822 # " \$x (",ref($x),") \$y (",ref($y),")\n";
823 # return $upgrade->badd($x,$y,@r) if defined $upgrade &&
824 # ((ref($x) eq $upgrade) || (ref($y) eq $upgrade));
825 # print "still badd\n";
827 $r[3] = $y; # no push!
828 # inf and NaN handling
829 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
832 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
834 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
836 # +inf++inf or -inf+-inf => same, rest is NaN
837 return $x if $x->{sign} eq $y->{sign};
840 # +-inf + something => +inf
841 # something +-inf => +-inf
842 $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
846 my ($sx, $sy) = ( $x->{sign}, $y->{sign} ); # get signs
850 $x->{value} = $CALC->_add($x->{value},$y->{value}); # same sign, abs add
855 my $a = $CALC->_acmp ($y->{value},$x->{value}); # absolute compare
858 #print "swapped sub (a=$a)\n";
859 $x->{value} = $CALC->_sub($y->{value},$x->{value},1); # abs sub w/ swap
864 # speedup, if equal, set result to 0
865 #print "equal sub, result = 0\n";
866 $x->{value} = $CALC->_zero();
871 #print "unswapped sub (a=$a)\n";
872 $x->{value} = $CALC->_sub($x->{value}, $y->{value}); # abs sub
881 # (BINT or num_str, BINT or num_str) return num_str
882 # subtract second arg from first, modify first
883 my ($self,$x,$y,@r) = objectify(2,@_);
885 return $x if $x->modify('bsub');
886 # return $upgrade->badd($x,$y,@r) if defined $upgrade &&
887 # ((ref($x) eq $upgrade) || (ref($y) eq $upgrade));
891 return $x->round(@r);
894 $y->{sign} =~ tr/+\-/-+/; # does nothing for NaN
895 $x->badd($y,@r); # badd does not leave internal zeros
896 $y->{sign} =~ tr/+\-/-+/; # refix $y (does nothing for NaN)
897 $x; # already rounded by badd() or no round necc.
902 # increment arg by one
903 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
904 return $x if $x->modify('binc');
906 if ($x->{sign} eq '+')
908 $x->{value} = $CALC->_inc($x->{value});
909 return $x->round($a,$p,$r);
911 elsif ($x->{sign} eq '-')
913 $x->{value} = $CALC->_dec($x->{value});
914 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0
915 return $x->round($a,$p,$r);
917 # inf, nan handling etc
918 $x->badd($self->__one(),$a,$p,$r); # badd does round
923 # decrement arg by one
924 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
925 return $x if $x->modify('bdec');
927 my $zero = $CALC->_is_zero($x->{value}) && $x->{sign} eq '+';
929 if (($x->{sign} eq '-') || $zero)
931 $x->{value} = $CALC->_inc($x->{value});
932 $x->{sign} = '-' if $zero; # 0 => 1 => -1
933 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0
934 return $x->round($a,$p,$r);
937 elsif ($x->{sign} eq '+')
939 $x->{value} = $CALC->_dec($x->{value});
940 return $x->round($a,$p,$r);
942 # inf, nan handling etc
943 $x->badd($self->__one('-'),$a,$p,$r); # badd does round
948 # not implemented yet
949 my ($self,$x,$base,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
951 return $upgrade->blog($x,$base,$a,$p,$r) if defined $upgrade;
958 # (BINT or num_str, BINT or num_str) return BINT
959 # does not modify arguments, but returns new object
960 # Lowest Common Multiplicator
962 my $y = shift; my ($x);
969 $x = $class->new($y);
971 while (@_) { $x = __lcm($x,shift); }
977 # (BINT or num_str, BINT or num_str) return BINT
978 # does not modify arguments, but returns new object
979 # GCD -- Euclids algorithm, variant C (Knuth Vol 3, pg 341 ff)
982 $y = __PACKAGE__->new($y) if !ref($y);
984 my $x = $y->copy(); # keep arguments
985 if ($CALC->can('_gcd'))
989 $y = shift; $y = $self->new($y) if !ref($y);
990 next if $y->is_zero();
991 return $x->bnan() if $y->{sign} !~ /^[+-]$/; # y NaN?
992 $x->{value} = $CALC->_gcd($x->{value},$y->{value}); last if $x->is_one();
999 $y = shift; $y = $self->new($y) if !ref($y);
1000 $x = __gcd($x,$y->copy()); last if $x->is_one(); # _gcd handles NaN
1008 # (num_str or BINT) return BINT
1009 # represent ~x as twos-complement number
1010 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1011 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
1013 return $x if $x->modify('bnot');
1014 $x->bneg()->bdec(); # bdec already does round
1017 # is_foo test routines
1021 # return true if arg (BINT or num_str) is zero (array '+', '0')
1022 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1023 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1025 return 0 if $x->{sign} !~ /^\+$/; # -, NaN & +-inf aren't
1026 $CALC->_is_zero($x->{value});
1031 # return true if arg (BINT or num_str) is NaN
1032 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1034 return 1 if $x->{sign} eq $nan;
1040 # return true if arg (BINT or num_str) is +-inf
1041 my ($self,$x,$sign) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1043 $sign = '' if !defined $sign;
1044 return 0 if $sign !~ /^([+-]|)$/;
1048 return 1 if ($x->{sign} =~ /^[+-]inf$/);
1051 $sign = quotemeta($sign.'inf');
1052 return 1 if ($x->{sign} =~ /^$sign$/);
1058 # return true if arg (BINT or num_str) is +1
1059 # or -1 if sign is given
1060 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1061 my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
1063 $sign = '' if !defined $sign; $sign = '+' if $sign ne '-';
1065 return 0 if $x->{sign} ne $sign; # -1 != +1, NaN, +-inf aren't either
1066 $CALC->_is_one($x->{value});
1071 # return true when arg (BINT or num_str) is odd, false for even
1072 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1073 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1075 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
1076 $CALC->_is_odd($x->{value});
1081 # return true when arg (BINT or num_str) is even, false for odd
1082 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1083 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1085 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
1086 $CALC->_is_even($x->{value});
1091 # return true when arg (BINT or num_str) is positive (>= 0)
1092 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1093 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1095 return 1 if $x->{sign} =~ /^\+/;
1101 # return true when arg (BINT or num_str) is negative (< 0)
1102 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1103 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1105 return 1 if ($x->{sign} =~ /^-/);
1111 # return true when arg (BINT or num_str) is an integer
1112 # always true for BigInt, but different for Floats
1113 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1114 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1116 $x->{sign} =~ /^[+-]$/ ? 1 : 0; # inf/-inf/NaN aren't
1119 ###############################################################################
1123 # multiply two numbers -- stolen from Knuth Vol 2 pg 233
1124 # (BINT or num_str, BINT or num_str) return BINT
1125 my ($self,$x,$y,@r) = objectify(2,@_);
1127 return $x if $x->modify('bmul');
1129 $r[3] = $y; # no push here
1131 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
1134 if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
1136 return $x->bnan() if $x->is_zero() || $y->is_zero();
1137 # result will always be +-inf:
1138 # +inf * +/+inf => +inf, -inf * -/-inf => +inf
1139 # +inf * -/-inf => -inf, -inf * +/+inf => -inf
1140 return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
1141 return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
1142 return $x->binf('-');
1145 $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
1147 $x->{value} = $CALC->_mul($x->{value},$y->{value}); # do actual math
1148 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # no -0
1154 # helper function that handles +-inf cases for bdiv()/bmod() to reuse code
1155 my ($self,$x,$y) = @_;
1157 # NaN if x == NaN or y == NaN or x==y==0
1158 return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan()
1159 if (($x->is_nan() || $y->is_nan()) ||
1160 ($x->is_zero() && $y->is_zero()));
1162 # +-inf / +-inf == NaN, reminder also NaN
1163 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
1165 return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan();
1167 # x / +-inf => 0, remainder x (works even if x == 0)
1168 if ($y->{sign} =~ /^[+-]inf$/)
1170 my $t = $x->copy(); # binf clobbers up $x
1171 return wantarray ? ($x->bzero(),$t) : $x->bzero()
1174 # 5 / 0 => +inf, -6 / 0 => -inf
1175 # +inf / 0 = inf, inf, and -inf / 0 => -inf, -inf
1176 # exception: -8 / 0 has remainder -8, not 8
1177 # exception: -inf / 0 has remainder -inf, not inf
1180 # +-inf / 0 => special case for -inf
1181 return wantarray ? ($x,$x->copy()) : $x if $x->is_inf();
1182 if (!$x->is_zero() && !$x->is_inf())
1184 my $t = $x->copy(); # binf clobbers up $x
1186 ($x->binf($x->{sign}),$t) : $x->binf($x->{sign})
1190 # last case: +-inf / ordinary number
1192 $sign = '-inf' if substr($x->{sign},0,1) ne $y->{sign};
1194 return wantarray ? ($x,$self->bzero()) : $x;
1199 # (dividend: BINT or num_str, divisor: BINT or num_str) return
1200 # (BINT,BINT) (quo,rem) or BINT (only rem)
1201 my ($self,$x,$y,@r) = objectify(2,@_);
1203 return $x if $x->modify('bdiv');
1205 return $self->_div_inf($x,$y)
1206 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
1208 $r[3] = $y; # no push!
1212 wantarray ? ($x->round(@r),$self->bzero(@r)):$x->round(@r) if $x->is_zero();
1214 # Is $x in the interval [0, $y) (aka $x <= $y) ?
1215 my $cmp = $CALC->_acmp($x->{value},$y->{value});
1216 if (($cmp < 0) and (($x->{sign} eq $y->{sign}) or !wantarray))
1218 return $upgrade->bdiv($x,$y,@r) if defined $upgrade;
1220 return $x->bzero()->round(@r) unless wantarray;
1221 my $t = $x->copy(); # make copy first, because $x->bzero() clobbers $x
1222 return ($x->bzero()->round(@r),$t);
1226 # shortcut, both are the same, so set to +/- 1
1227 $x->__one( ($x->{sign} ne $y->{sign} ? '-' : '+') );
1228 return $x unless wantarray;
1229 return ($x->round(@r),$self->bzero(@r));
1232 # calc new sign and in case $y == +/- 1, return $x
1233 my $xsign = $x->{sign}; # keep
1234 $x->{sign} = ($x->{sign} ne $y->{sign} ? '-' : '+');
1235 # check for / +-1 (cant use $y->is_one due to '-'
1236 if ($CALC->_is_one($y->{value}))
1238 return wantarray ? ($x->round(@r),$self->bzero(@r)) : $x->round(@r);
1244 my $rem = $self->bzero();
1245 ($x->{value},$rem->{value}) = $CALC->_div($x->{value},$y->{value});
1246 $x->{sign} = '+' if $CALC->_is_zero($x->{value});
1248 if (! $CALC->_is_zero($rem->{value}))
1250 $rem->{sign} = $y->{sign};
1251 $rem = $y-$rem if $xsign ne $y->{sign}; # one of them '-'
1255 $rem->{sign} = '+'; # dont leave -0
1261 $x->{value} = $CALC->_div($x->{value},$y->{value});
1262 $x->{sign} = '+' if $CALC->_is_zero($x->{value});
1269 # modulus (or remainder)
1270 # (BINT or num_str, BINT or num_str) return BINT
1271 my ($self,$x,$y,@r) = objectify(2,@_);
1273 return $x if $x->modify('bmod');
1274 $r[3] = $y; # no push!
1275 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero())
1277 my ($d,$r) = $self->_div_inf($x,$y);
1278 return $r->round(@r);
1281 if ($CALC->can('_mod'))
1283 # calc new sign and in case $y == +/- 1, return $x
1284 $x->{value} = $CALC->_mod($x->{value},$y->{value});
1285 if (!$CALC->_is_zero($x->{value}))
1287 my $xsign = $x->{sign};
1288 $x->{sign} = $y->{sign};
1289 $x = $y-$x if $xsign ne $y->{sign}; # one of them '-'
1293 $x->{sign} = '+'; # dont leave -0
1295 return $x->round(@r);
1297 my ($t,$rem) = $self->bdiv($x->copy(),$y,@r); # slow way (also rounds)
1299 foreach (qw/value sign _a _p/)
1301 $x->{$_} = $rem->{$_};
1308 # (BINT or num_str, BINT or num_str) return BINT
1309 # compute factorial numbers
1310 # modifies first argument
1311 my ($self,$x,@r) = objectify(1,@_);
1313 return $x if $x->modify('bfac');
1315 return $x->bnan() if $x->{sign} ne '+'; # inf, NnN, <0 etc => NaN
1316 return $x->bone(@r) if $x->is_zero() || $x->is_one(); # 0 or 1 => 1
1318 if ($CALC->can('_fac'))
1320 $x->{value} = $CALC->_fac($x->{value});
1321 return $x->round(@r);
1326 my $f = $self->new(2);
1327 while ($f->bacmp($n) < 0)
1329 $x->bmul($f); $f->binc();
1331 $x->bmul($f); # last step
1332 $x->round(@r); # round
1337 # (BINT or num_str, BINT or num_str) return BINT
1338 # compute power of two numbers -- stolen from Knuth Vol 2 pg 233
1339 # modifies first argument
1340 my ($self,$x,$y,@r) = objectify(2,@_);
1342 return $x if $x->modify('bpow');
1344 $r[3] = $y; # no push!
1345 return $x if $x->{sign} =~ /^[+-]inf$/; # -inf/+inf ** x
1346 return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
1347 return $x->bone(@r) if $y->is_zero();
1348 return $x->round(@r) if $x->is_one() || $y->is_one();
1349 if ($x->{sign} eq '-' && $CALC->_is_one($x->{value}))
1351 # if $x == -1 and odd/even y => +1/-1
1352 return $y->is_odd() ? $x->round(@r) : $x->babs()->round(@r);
1353 # my Casio FX-5500L has a bug here: -1 ** 2 is -1, but -1 * -1 is 1;
1355 # 1 ** -y => 1 / (1 ** |y|)
1356 # so do test for negative $y after above's clause
1357 return $x->bnan() if $y->{sign} eq '-';
1358 return $x->round(@r) if $x->is_zero(); # 0**y => 0 (if not y <= 0)
1360 if ($CALC->can('_pow'))
1362 $x->{value} = $CALC->_pow($x->{value},$y->{value});
1363 return $x->round(@r);
1366 # based on the assumption that shifting in base 10 is fast, and that mul
1367 # works faster if numbers are small: we count trailing zeros (this step is
1368 # O(1)..O(N), but in case of O(N) we save much more time due to this),
1369 # stripping them out of the multiplication, and add $count * $y zeros
1370 # afterwards like this:
1371 # 300 ** 3 == 300*300*300 == 3*3*3 . '0' x 2 * 3 == 27 . '0' x 6
1372 # creates deep recursion?
1373 # my $zeros = $x->_trailing_zeros();
1376 # $x->brsft($zeros,10); # remove zeros
1377 # $x->bpow($y); # recursion (will not branch into here again)
1378 # $zeros = $y * $zeros; # real number of zeros to add
1379 # $x->blsft($zeros,10);
1380 # return $x->round($a,$p,$r);
1383 my $pow2 = $self->__one();
1384 my $y1 = $class->new($y);
1385 my $two = $self->new(2);
1386 while (!$y1->is_one())
1388 $pow2->bmul($x) if $y1->is_odd();
1392 $x->bmul($pow2) unless $pow2->is_one();
1393 return $x->round(@r);
1398 # (BINT or num_str, BINT or num_str) return BINT
1399 # compute x << y, base n, y >= 0
1400 my ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
1402 return $x if $x->modify('blsft');
1403 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1404 return $x->round($a,$p,$r) if $y->is_zero();
1406 $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
1408 my $t; $t = $CALC->_lsft($x->{value},$y->{value},$n) if $CALC->can('_lsft');
1411 $x->{value} = $t; return $x->round($a,$p,$r);
1414 return $x->bmul( $self->bpow($n, $y, $a, $p, $r), $a, $p, $r );
1419 # (BINT or num_str, BINT or num_str) return BINT
1420 # compute x >> y, base n, y >= 0
1421 my ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
1423 return $x if $x->modify('brsft');
1424 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1425 return $x->round($a,$p,$r) if $y->is_zero();
1426 return $x->bzero($a,$p,$r) if $x->is_zero(); # 0 => 0
1428 $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
1430 # this only works for negative numbers when shifting in base 2
1431 if (($x->{sign} eq '-') && ($n == 2))
1433 return $x->round($a,$p,$r) if $x->is_one('-'); # -1 => -1
1436 # although this is O(N*N) in calc (as_bin!) it is O(N) in Pari et al
1437 # but perhaps there is a better emulation for two's complement shift...
1438 # if $y != 1, we must simulate it by doing:
1439 # convert to bin, flip all bits, shift, and be done
1440 $x->binc(); # -3 => -2
1441 my $bin = $x->as_bin();
1442 $bin =~ s/^-0b//; # strip '-0b' prefix
1443 $bin =~ tr/10/01/; # flip bits
1445 if (length($bin) <= $y)
1447 $bin = '0'; # shifting to far right creates -1
1448 # 0, because later increment makes
1449 # that 1, attached '-' makes it '-1'
1450 # because -1 >> x == -1 !
1454 $bin =~ s/.{$y}$//; # cut off at the right side
1455 $bin = '1' . $bin; # extend left side by one dummy '1'
1456 $bin =~ tr/10/01/; # flip bits back
1458 my $res = $self->new('0b'.$bin); # add prefix and convert back
1459 $res->binc(); # remember to increment
1460 $x->{value} = $res->{value}; # take over value
1461 return $x->round($a,$p,$r); # we are done now, magic, isn't?
1463 $x->bdec(); # n == 2, but $y == 1: this fixes it
1466 my $t; $t = $CALC->_rsft($x->{value},$y->{value},$n) if $CALC->can('_rsft');
1470 return $x->round($a,$p,$r);
1473 $x->bdiv($self->bpow($n,$y, $a,$p,$r), $a,$p,$r);
1479 #(BINT or num_str, BINT or num_str) return BINT
1481 my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1483 return $x if $x->modify('band');
1485 local $Math::BigInt::upgrade = undef;
1487 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1488 return $x->bzero() if $y->is_zero() || $x->is_zero();
1490 my $sign = 0; # sign of result
1491 $sign = 1 if ($x->{sign} eq '-') && ($y->{sign} eq '-');
1492 my $sx = 1; $sx = -1 if $x->{sign} eq '-';
1493 my $sy = 1; $sy = -1 if $y->{sign} eq '-';
1495 if ($CALC->can('_and') && $sx == 1 && $sy == 1)
1497 $x->{value} = $CALC->_and($x->{value},$y->{value});
1498 return $x->round($a,$p,$r);
1501 my $m = $self->bone(); my ($xr,$yr);
1502 my $x10000 = $self->new (0x1000);
1503 my $y1 = copy(ref($x),$y); # make copy
1504 $y1->babs(); # and positive
1505 my $x1 = $x->copy()->babs(); $x->bzero(); # modify x in place!
1506 use integer; # need this for negative bools
1507 while (!$x1->is_zero() && !$y1->is_zero())
1509 ($x1, $xr) = bdiv($x1, $x10000);
1510 ($y1, $yr) = bdiv($y1, $x10000);
1511 # make both op's numbers!
1512 $x->badd( bmul( $class->new(
1513 abs($sx*int($xr->numify()) & $sy*int($yr->numify()))),
1517 $x->bneg() if $sign;
1518 return $x->round($a,$p,$r);
1523 #(BINT or num_str, BINT or num_str) return BINT
1525 my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1527 return $x if $x->modify('bior');
1529 local $Math::BigInt::upgrade = undef;
1531 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1532 return $x if $y->is_zero();
1534 my $sign = 0; # sign of result
1535 $sign = 1 if ($x->{sign} eq '-') || ($y->{sign} eq '-');
1536 my $sx = 1; $sx = -1 if $x->{sign} eq '-';
1537 my $sy = 1; $sy = -1 if $y->{sign} eq '-';
1539 # don't use lib for negative values
1540 if ($CALC->can('_or') && $sx == 1 && $sy == 1)
1542 $x->{value} = $CALC->_or($x->{value},$y->{value});
1543 return $x->round($a,$p,$r);
1546 my $m = $self->bone(); my ($xr,$yr);
1547 my $x10000 = $self->new(0x10000);
1548 my $y1 = copy(ref($x),$y); # make copy
1549 $y1->babs(); # and positive
1550 my $x1 = $x->copy()->babs(); $x->bzero(); # modify x in place!
1551 use integer; # need this for negative bools
1552 while (!$x1->is_zero() || !$y1->is_zero())
1554 ($x1, $xr) = bdiv($x1,$x10000);
1555 ($y1, $yr) = bdiv($y1,$x10000);
1556 # make both op's numbers!
1557 $x->badd( bmul( $class->new(
1558 abs($sx*int($xr->numify()) | $sy*int($yr->numify()))),
1562 $x->bneg() if $sign;
1563 return $x->round($a,$p,$r);
1568 #(BINT or num_str, BINT or num_str) return BINT
1570 my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1572 return $x if $x->modify('bxor');
1574 local $Math::BigInt::upgrade = undef;
1576 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1577 return $x if $y->is_zero();
1579 my $sign = 0; # sign of result
1580 $sign = 1 if $x->{sign} ne $y->{sign};
1581 my $sx = 1; $sx = -1 if $x->{sign} eq '-';
1582 my $sy = 1; $sy = -1 if $y->{sign} eq '-';
1584 # don't use lib for negative values
1585 if ($CALC->can('_xor') && $sx == 1 && $sy == 1)
1587 $x->{value} = $CALC->_xor($x->{value},$y->{value});
1588 return $x->round($a,$p,$r);
1591 my $m = $self->bone(); my ($xr,$yr);
1592 my $x10000 = $self->new(0x10000);
1593 my $y1 = copy(ref($x),$y); # make copy
1594 $y1->babs(); # and positive
1595 my $x1 = $x->copy()->babs(); $x->bzero(); # modify x in place!
1596 use integer; # need this for negative bools
1597 while (!$x1->is_zero() || !$y1->is_zero())
1599 ($x1, $xr) = bdiv($x1, $x10000);
1600 ($y1, $yr) = bdiv($y1, $x10000);
1601 # make both op's numbers!
1602 $x->badd( bmul( $class->new(
1603 abs($sx*int($xr->numify()) ^ $sy*int($yr->numify()))),
1607 $x->bneg() if $sign;
1608 return $x->round($a,$p,$r);
1613 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1615 my $e = $CALC->_len($x->{value});
1616 return wantarray ? ($e,0) : $e;
1621 # return the nth decimal digit, negative values count backward, 0 is right
1625 return $CALC->_digit($x->{value},$n);
1630 # return the amount of trailing zeros in $x
1632 $x = $class->new($x) unless ref $x;
1634 return 0 if $x->is_zero() || $x->is_odd() || $x->{sign} !~ /^[+-]$/;
1636 return $CALC->_zeros($x->{value}) if $CALC->can('_zeros');
1638 # if not: since we do not know underlying internal representation:
1639 my $es = "$x"; $es =~ /([0]*)$/;
1640 return 0 if !defined $1; # no zeros
1641 return CORE::length("$1"); # as string, not as +0!
1646 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1648 return $x if $x->modify('bsqrt');
1650 return $x->bnan() if $x->{sign} ne '+'; # -x or inf or NaN => NaN
1651 return $x->bzero($a,$p) if $x->is_zero(); # 0 => 0
1652 return $x->round($a,$p,$r) if $x->is_one(); # 1 => 1
1654 return $upgrade->bsqrt($x,$a,$p,$r) if defined $upgrade;
1656 if ($CALC->can('_sqrt'))
1658 $x->{value} = $CALC->_sqrt($x->{value});
1659 return $x->round($a,$p,$r);
1662 return $x->bone($a,$p) if $x < 4; # 2,3 => 1
1664 my $l = int($x->length()/2);
1666 $x->bone(); # keep ref($x), but modify it
1669 my $last = $self->bzero();
1670 my $two = $self->new(2);
1671 my $lastlast = $x+$two;
1672 while ($last != $x && $lastlast != $x)
1674 $lastlast = $last; $last = $x;
1678 $x-- if $x * $x > $y; # overshot?
1679 $x->round($a,$p,$r);
1684 # return a copy of the exponent (here always 0, NaN or 1 for $m == 0)
1685 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1687 if ($x->{sign} !~ /^[+-]$/)
1689 my $s = $x->{sign}; $s =~ s/^[+-]//;
1690 return $self->new($s); # -inf,+inf => inf
1692 my $e = $class->bzero();
1693 return $e->binc() if $x->is_zero();
1694 $e += $x->_trailing_zeros();
1700 # return the mantissa (compatible to Math::BigFloat, e.g. reduced)
1701 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1703 if ($x->{sign} !~ /^[+-]$/)
1705 my $s = $x->{sign}; $s =~ s/^[+]//;
1706 return $self->new($s); # +inf => inf
1709 # that's inefficient
1710 my $zeros = $m->_trailing_zeros();
1711 $m /= 10 ** $zeros if $zeros != 0;
1717 # return a copy of both the exponent and the mantissa
1718 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1720 return ($x->mantissa(),$x->exponent());
1723 ##############################################################################
1724 # rounding functions
1728 # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
1729 # $n == 0 || $n == 1 => round to integer
1730 my $x = shift; $x = $class->new($x) unless ref $x;
1731 my ($scale,$mode) = $x->_scale_p($x->precision(),$x->round_mode(),@_);
1732 return $x if !defined $scale; # no-op
1733 return $x if $x->modify('bfround');
1735 # no-op for BigInts if $n <= 0
1738 $x->{_a} = undef; # clear an eventual set A
1739 $x->{_p} = $scale; return $x;
1742 $x->bround( $x->length()-$scale, $mode);
1743 $x->{_a} = undef; # bround sets {_a}
1744 $x->{_p} = $scale; # so correct it
1748 sub _scan_for_nonzero
1754 my $len = $x->length();
1755 return 0 if $len == 1; # '5' is trailed by invisible zeros
1756 my $follow = $pad - 1;
1757 return 0 if $follow > $len || $follow < 1;
1759 # since we do not know underlying represention of $x, use decimal string
1760 #my $r = substr ($$xs,-$follow);
1761 my $r = substr ("$x",-$follow);
1762 return 1 if $r =~ /[^0]/; return 0;
1767 # to make life easier for switch between MBF and MBI (autoload fxxx()
1768 # like MBF does for bxxx()?)
1770 return $x->bround(@_);
1775 # accuracy: +$n preserve $n digits from left,
1776 # -$n preserve $n digits from right (f.i. for 0.1234 style in MBF)
1778 # and overwrite the rest with 0's, return normalized number
1779 # do not return $x->bnorm(), but $x
1781 my $x = shift; $x = $class->new($x) unless ref $x;
1782 my ($scale,$mode) = $x->_scale_a($x->accuracy(),$x->round_mode(),@_);
1783 return $x if !defined $scale; # no-op
1784 return $x if $x->modify('bround');
1786 if ($x->is_zero() || $scale == 0)
1788 $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
1791 return $x if $x->{sign} !~ /^[+-]$/; # inf, NaN
1793 # we have fewer digits than we want to scale to
1794 my $len = $x->length();
1795 # scale < 0, but > -len (not >=!)
1796 if (($scale < 0 && $scale < -$len-1) || ($scale >= $len))
1798 $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
1802 # count of 0's to pad, from left (+) or right (-): 9 - +6 => 3, or |-6| => 6
1803 my ($pad,$digit_round,$digit_after);
1804 $pad = $len - $scale;
1805 $pad = abs($scale-1) if $scale < 0;
1807 # do not use digit(), it is costly for binary => decimal
1809 my $xs = $CALC->_str($x->{value});
1812 # pad: 123: 0 => -1, at 1 => -2, at 2 => -3, at 3 => -4
1813 # pad+1: 123: 0 => 0, at 1 => -1, at 2 => -2, at 3 => -3
1814 $digit_round = '0'; $digit_round = substr($$xs,$pl,1) if $pad <= $len;
1815 $pl++; $pl ++ if $pad >= $len;
1816 $digit_after = '0'; $digit_after = substr($$xs,$pl,1) if $pad > 0;
1818 # print "$pad $pl $$xs dr $digit_round da $digit_after\n";
1820 # in case of 01234 we round down, for 6789 up, and only in case 5 we look
1821 # closer at the remaining digits of the original $x, remember decision
1822 my $round_up = 1; # default round up
1824 ($mode eq 'trunc') || # trunc by round down
1825 ($digit_after =~ /[01234]/) || # round down anyway,
1827 ($digit_after eq '5') && # not 5000...0000
1828 ($x->_scan_for_nonzero($pad,$xs) == 0) &&
1830 ($mode eq 'even') && ($digit_round =~ /[24680]/) ||
1831 ($mode eq 'odd') && ($digit_round =~ /[13579]/) ||
1832 ($mode eq '+inf') && ($x->{sign} eq '-') ||
1833 ($mode eq '-inf') && ($x->{sign} eq '+') ||
1834 ($mode eq 'zero') # round down if zero, sign adjusted below
1836 my $put_back = 0; # not yet modified
1838 # old code, depend on internal representation
1839 # split mantissa at $pad and then pad with zeros
1840 #my $s5 = int($pad / 5);
1844 # $x->{value}->[$i++] = 0; # replace with 5 x 0
1846 #$x->{value}->[$s5] = '00000'.$x->{value}->[$s5]; # pad with 0
1847 #my $rem = $pad % 5; # so much left over
1850 # #print "remainder $rem\n";
1851 ## #print "elem $x->{value}->[$s5]\n";
1852 # substr($x->{value}->[$s5],-$rem,$rem) = '0' x $rem; # stamp w/ '0'
1854 #$x->{value}->[$s5] = int ($x->{value}->[$s5]); # str '05' => int '5'
1855 #print ${$CALC->_str($pad->{value})}," $len\n";
1857 if (($pad > 0) && ($pad <= $len))
1859 substr($$xs,-$pad,$pad) = '0' x $pad;
1864 $x->bzero(); # round to '0'
1867 if ($round_up) # what gave test above?
1870 $pad = $len, $$xs = '0'x$pad if $scale < 0; # tlr: whack 0.51=>1.0
1872 # we modify directly the string variant instead of creating a number and
1874 my $c = 0; $pad ++; # for $pad == $len case
1875 while ($pad <= $len)
1877 $c = substr($$xs,-$pad,1) + 1; $c = '0' if $c eq '10';
1878 substr($$xs,-$pad,1) = $c; $pad++;
1879 last if $c != 0; # no overflow => early out
1881 $$xs = '1'.$$xs if $c == 0;
1883 # $x->badd( Math::BigInt->new($x->{sign}.'1'. '0' x $pad) );
1885 $x->{value} = $CALC->_new($xs) if $put_back == 1; # put back in
1887 $x->{_a} = $scale if $scale >= 0;
1890 $x->{_a} = $len+$scale;
1891 $x->{_a} = 0 if $scale < -$len;
1898 # return integer less or equal then number, since it is already integer,
1899 # always returns $self
1900 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1902 # not needed: return $x if $x->modify('bfloor');
1903 return $x->round($a,$p,$r);
1908 # return integer greater or equal then number, since it is already integer,
1909 # always returns $self
1910 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1912 # not needed: return $x if $x->modify('bceil');
1913 return $x->round($a,$p,$r);
1916 ##############################################################################
1917 # private stuff (internal use only)
1921 # internal speedup, set argument to 1, or create a +/- 1
1923 my $x = $self->bone(); # $x->{value} = $CALC->_one();
1924 $x->{sign} = shift || '+';
1930 # Overload will swap params if first one is no object ref so that the first
1931 # one is always an object ref. In this case, third param is true.
1932 # This routine is to overcome the effect of scalar,$object creating an object
1933 # of the class of this package, instead of the second param $object. This
1934 # happens inside overload, when the overload section of this package is
1935 # inherited by sub classes.
1936 # For overload cases (and this is used only there), we need to preserve the
1937 # args, hence the copy().
1938 # You can override this method in a subclass, the overload section will call
1939 # $object->_swap() to make sure it arrives at the proper subclass, with some
1940 # exceptions like '+' and '-'. To make '+' and '-' work, you also need to
1941 # specify your own overload for them.
1943 # object, (object|scalar) => preserve first and make copy
1944 # scalar, object => swapped, re-swap and create new from first
1945 # (using class of second object, not $class!!)
1946 my $self = shift; # for override in subclass
1949 my $c = ref ($_[0]) || $class; # fallback $class should not happen
1950 return ( $c->new($_[1]), $_[0] );
1952 return ( $_[0]->copy(), $_[1] );
1957 # check for strings, if yes, return objects instead
1959 # the first argument is number of args objectify() should look at it will
1960 # return $count+1 elements, the first will be a classname. This is because
1961 # overloaded '""' calls bstr($object,undef,undef) and this would result in
1962 # useless objects beeing created and thrown away. So we cannot simple loop
1963 # over @_. If the given count is 0, all arguments will be used.
1965 # If the second arg is a ref, use it as class.
1966 # If not, try to use it as classname, unless undef, then use $class
1967 # (aka Math::BigInt). The latter shouldn't happen,though.
1970 # $x->badd(1); => ref x, scalar y
1971 # Class->badd(1,2); => classname x (scalar), scalar x, scalar y
1972 # Class->badd( Class->(1),2); => classname x (scalar), ref x, scalar y
1973 # Math::BigInt::badd(1,2); => scalar x, scalar y
1974 # In the last case we check number of arguments to turn it silently into
1975 # $class,1,2. (We can not take '1' as class ;o)
1976 # badd($class,1) is not supported (it should, eventually, try to add undef)
1977 # currently it tries 'Math::BigInt' + 1, which will not work.
1979 # some shortcut for the common cases
1982 return (ref($_[1]),$_[1]) if (@_ == 2) && ($_[0]||0 == 1) && ref($_[1]);
1983 # $x->binary_op($y);
1984 #return (ref($_[1]),$_[1],$_[2]) if (@_ == 3) && ($_[0]||0 == 2)
1985 # && ref($_[1]) && ref($_[2]);
1987 my $count = abs(shift || 0);
1989 my @a; # resulting array
1992 # okay, got object as first
1997 # nope, got 1,2 (Class->xxx(1) => Class,1 and not supported)
1999 $a[0] = shift if $_[0] =~ /^[A-Z].*::/; # classname as first?
2001 # print "Now in objectify, my class is today $a[0]\n";
2010 $k = $a[0]->new($k);
2012 elsif (ref($k) ne $a[0])
2014 # foreign object, try to convert to integer
2015 $k->can('as_number') ? $k = $k->as_number() : $k = $a[0]->new($k);
2028 $k = $a[0]->new($k);
2030 elsif (ref($k) ne $a[0])
2032 # foreign object, try to convert to integer
2033 $k->can('as_number') ? $k = $k->as_number() : $k = $a[0]->new($k);
2037 push @a,@_; # return other params, too
2039 die "$class objectify needs list context" unless wantarray;
2048 my @a = @_; my $l = scalar @_; my $j = 0;
2049 for ( my $i = 0; $i < $l ; $i++,$j++ )
2051 if ($_[$i] eq ':constant')
2053 # this causes overlord er load to step in
2054 overload::constant integer => sub { $self->new(shift) };
2055 splice @a, $j, 1; $j --;
2057 elsif ($_[$i] eq 'upgrade')
2059 # this causes upgrading
2060 $upgrade = $_[$i+1]; # or undef to disable
2061 my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
2062 splice @a, $j, $s; $j -= $s;
2064 elsif ($_[$i] =~ /^lib$/i)
2066 # this causes a different low lib to take care...
2067 $CALC = $_[$i+1] || '';
2068 my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
2069 splice @a, $j, $s; $j -= $s;
2072 # any non :constant stuff is handled by our parent, Exporter
2073 # even if @_ is empty, to give it a chance
2074 $self->SUPER::import(@a); # need it for subclasses
2075 $self->export_to_level(1,$self,@a); # need it for MBF
2077 # try to load core math lib
2078 my @c = split /\s*,\s*/,$CALC;
2079 push @c,'Calc'; # if all fail, try this
2080 $CALC = ''; # signal error
2081 foreach my $lib (@c)
2083 $lib = 'Math::BigInt::'.$lib if $lib !~ /^Math::BigInt/i;
2087 # Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is
2088 # used in the same script, or eval inside import().
2089 (my $mod = $lib . '.pm') =~ s!::!/!g;
2090 # require does not automatically :: => /, so portability problems arise
2091 eval { require $mod; $lib->import( @c ); }
2095 eval "use $lib qw/@c/;";
2097 $CALC = $lib, last if $@ eq ''; # no error in loading lib?
2099 die "Couldn't load any math lib, not even the default" if $CALC eq '';
2104 # convert a (ref to) big hex string to BigInt, return undef for error
2107 my $x = Math::BigInt->bzero();
2110 $$hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;
2111 $$hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;
2113 return $x->bnan() if $$hs !~ /^[\-\+]?0x[0-9A-Fa-f]+$/;
2115 my $sign = '+'; $sign = '-' if ($$hs =~ /^-/);
2117 $$hs =~ s/^[+-]//; # strip sign
2118 if ($CALC->can('_from_hex'))
2120 $x->{value} = $CALC->_from_hex($hs);
2124 # fallback to pure perl
2125 my $mul = Math::BigInt->bzero(); $mul++;
2126 my $x65536 = Math::BigInt->new(65536);
2127 my $len = CORE::length($$hs)-2;
2128 $len = int($len/4); # 4-digit parts, w/o '0x'
2129 my $val; my $i = -4;
2132 $val = substr($$hs,$i,4);
2133 $val =~ s/^[+-]?0x// if $len == 0; # for last part only because
2134 $val = hex($val); # hex does not like wrong chars
2136 $x += $mul * $val if $val != 0;
2137 $mul *= $x65536 if $len >= 0; # skip last mul
2140 $x->{sign} = $sign if !$x->is_zero(); # no '-0'
2146 # convert a (ref to) big binary string to BigInt, return undef for error
2149 my $x = Math::BigInt->bzero();
2151 $$bs =~ s/([01])_([01])/$1$2/g;
2152 $$bs =~ s/([01])_([01])/$1$2/g;
2153 return $x->bnan() if $$bs !~ /^[+-]?0b[01]+$/;
2155 my $mul = Math::BigInt->bzero(); $mul++;
2156 my $x256 = Math::BigInt->new(256);
2158 my $sign = '+'; $sign = '-' if ($$bs =~ /^\-/);
2159 $$bs =~ s/^[+-]//; # strip sign
2160 if ($CALC->can('_from_bin'))
2162 $x->{value} = $CALC->_from_bin($bs);
2166 my $len = CORE::length($$bs)-2;
2167 $len = int($len/8); # 8-digit parts, w/o '0b'
2168 my $val; my $i = -8;
2171 $val = substr($$bs,$i,8);
2172 $val =~ s/^[+-]?0b// if $len == 0; # for last part only
2173 #$val = oct('0b'.$val); # does not work on Perl prior to 5.6.0
2175 # $val = ('0' x (8-CORE::length($val))).$val if CORE::length($val) < 8;
2176 $val = ord(pack('B8',substr('00000000'.$val,-8,8)));
2178 $x += $mul * $val if $val != 0;
2179 $mul *= $x256 if $len >= 0; # skip last mul
2182 $x->{sign} = $sign if !$x->is_zero();
2188 # (ref to num_str) return num_str
2189 # internal, take apart a string and return the pieces
2190 # strip leading/trailing whitespace, leading zeros, underscore and reject
2194 # strip white space at front, also extranous leading zeros
2195 $$x =~ s/^\s*([-]?)0*([0-9])/$1$2/g; # will not strip ' .2'
2196 $$x =~ s/^\s+//; # but this will
2197 $$x =~ s/\s+$//g; # strip white space at end
2199 # shortcut, if nothing to split, return early
2200 if ($$x =~ /^[+-]?\d+$/)
2202 $$x =~ s/^([+-])0*([0-9])/$2/; my $sign = $1 || '+';
2203 return (\$sign, $x, \'', \'', \0);
2206 # invalid starting char?
2207 return if $$x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/;
2209 return __from_hex($x) if $$x =~ /^[\-\+]?0x/; # hex string
2210 return __from_bin($x) if $$x =~ /^[\-\+]?0b/; # binary string
2212 # strip underscores between digits
2213 $$x =~ s/(\d)_(\d)/$1$2/g;
2214 $$x =~ s/(\d)_(\d)/$1$2/g; # do twice for 1_2_3
2216 # some possible inputs:
2217 # 2.1234 # 0.12 # 1 # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2
2218 # .2 # 1_2_3.4_5_6 # 1.4E1_2_3 # 1e3 # +.2
2220 return if $$x =~ /[Ee].*[Ee]/; # more than one E => error
2222 my ($m,$e) = split /[Ee]/,$$x;
2223 $e = '0' if !defined $e || $e eq "";
2224 # sign,value for exponent,mantint,mantfrac
2225 my ($es,$ev,$mis,$miv,$mfv);
2227 if ($e =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
2231 return if $m eq '.' || $m eq '';
2232 my ($mi,$mf) = split /\./,$m;
2233 $mi = '0' if !defined $mi;
2234 $mi .= '0' if $mi =~ /^[\-\+]?$/;
2235 $mf = '0' if !defined $mf || $mf eq '';
2236 if ($mi =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
2238 $mis = $1||'+'; $miv = $2;
2239 return unless ($mf =~ /^(\d*?)0*$/); # strip trailing zeros
2241 return (\$mis,\$miv,\$mfv,\$es,\$ev);
2244 return; # NaN, not a number
2249 # an object might be asked to return itself as bigint on certain overloaded
2250 # operations, this does exactly this, so that sub classes can simple inherit
2251 # it or override with their own integer conversion routine
2259 # return as hex string, with prefixed 0x
2260 my $x = shift; $x = $class->new($x) if !ref($x);
2262 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2263 return '0x0' if $x->is_zero();
2265 my $es = ''; my $s = '';
2266 $s = $x->{sign} if $x->{sign} eq '-';
2267 if ($CALC->can('_as_hex'))
2269 $es = ${$CALC->_as_hex($x->{value})};
2273 my $x1 = $x->copy()->babs(); my $xr;
2274 my $x10000 = Math::BigInt->new (0x10000);
2275 while (!$x1->is_zero())
2277 ($x1, $xr) = bdiv($x1,$x10000);
2278 $es .= unpack('h4',pack('v',$xr->numify()));
2281 $es =~ s/^[0]+//; # strip leading zeros
2289 # return as binary string, with prefixed 0b
2290 my $x = shift; $x = $class->new($x) if !ref($x);
2292 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2293 return '0b0' if $x->is_zero();
2295 my $es = ''; my $s = '';
2296 $s = $x->{sign} if $x->{sign} eq '-';
2297 if ($CALC->can('_as_bin'))
2299 $es = ${$CALC->_as_bin($x->{value})};
2303 my $x1 = $x->copy()->babs(); my $xr;
2304 my $x10000 = Math::BigInt->new (0x10000);
2305 while (!$x1->is_zero())
2307 ($x1, $xr) = bdiv($x1,$x10000);
2308 $es .= unpack('b16',pack('v',$xr->numify()));
2311 $es =~ s/^[0]+//; # strip leading zeros
2317 ##############################################################################
2318 # internal calculation routines (others are in Math::BigInt::Calc etc)
2322 # (BINT or num_str, BINT or num_str) return BINT
2323 # does modify first argument
2326 my $x = shift; my $ty = shift;
2327 return $x->bnan() if ($x->{sign} eq $nan) || ($ty->{sign} eq $nan);
2328 return $x * $ty / bgcd($x,$ty);
2333 # (BINT or num_str, BINT or num_str) return BINT
2334 # does modify both arguments
2335 # GCD -- Euclids algorithm E, Knuth Vol 2 pg 296
2338 return $x->bnan() if $x->{sign} !~ /^[+-]$/ || $ty->{sign} !~ /^[+-]$/;
2340 while (!$ty->is_zero())
2342 ($x, $ty) = ($ty,bmod($x,$ty));
2347 ###############################################################################
2348 # this method return 0 if the object can be modified, or 1 for not
2349 # We use a fast use constant statement here, to avoid costly calls. Subclasses
2350 # may override it with special code (f.i. Math::BigInt::Constant does so)
2352 sub modify () { 0; }
2359 Math::BigInt - Arbitrary size integer math package
2366 $x = Math::BigInt->new($str); # defaults to 0
2367 $nan = Math::BigInt->bnan(); # create a NotANumber
2368 $zero = Math::BigInt->bzero(); # create a +0
2369 $inf = Math::BigInt->binf(); # create a +inf
2370 $inf = Math::BigInt->binf('-'); # create a -inf
2371 $one = Math::BigInt->bone(); # create a +1
2372 $one = Math::BigInt->bone('-'); # create a -1
2375 $x->is_zero(); # true if arg is +0
2376 $x->is_nan(); # true if arg is NaN
2377 $x->is_one(); # true if arg is +1
2378 $x->is_one('-'); # true if arg is -1
2379 $x->is_odd(); # true if odd, false for even
2380 $x->is_even(); # true if even, false for odd
2381 $x->is_positive(); # true if >= 0
2382 $x->is_negative(); # true if < 0
2383 $x->is_inf(sign); # true if +inf, or -inf (sign is default '+')
2384 $x->is_int(); # true if $x is an integer (not a float)
2386 $x->bcmp($y); # compare numbers (undef,<0,=0,>0)
2387 $x->bacmp($y); # compare absolutely (undef,<0,=0,>0)
2388 $x->sign(); # return the sign, either +,- or NaN
2389 $x->digit($n); # return the nth digit, counting from right
2390 $x->digit(-$n); # return the nth digit, counting from left
2392 # The following all modify their first argument:
2395 $x->bzero(); # set $x to 0
2396 $x->bnan(); # set $x to NaN
2397 $x->bone(); # set $x to +1
2398 $x->bone('-'); # set $x to -1
2399 $x->binf(); # set $x to inf
2400 $x->binf('-'); # set $x to -inf
2402 $x->bneg(); # negation
2403 $x->babs(); # absolute value
2404 $x->bnorm(); # normalize (no-op)
2405 $x->bnot(); # two's complement (bit wise not)
2406 $x->binc(); # increment x by 1
2407 $x->bdec(); # decrement x by 1
2409 $x->badd($y); # addition (add $y to $x)
2410 $x->bsub($y); # subtraction (subtract $y from $x)
2411 $x->bmul($y); # multiplication (multiply $x by $y)
2412 $x->bdiv($y); # divide, set $x to quotient
2413 # return (quo,rem) or quo if scalar
2415 $x->bmod($y); # modulus (x % y)
2416 $x->bpow($y); # power of arguments (x ** y)
2417 $x->blsft($y); # left shift
2418 $x->brsft($y); # right shift
2419 $x->blsft($y,$n); # left shift, by base $n (like 10)
2420 $x->brsft($y,$n); # right shift, by base $n (like 10)
2422 $x->band($y); # bitwise and
2423 $x->bior($y); # bitwise inclusive or
2424 $x->bxor($y); # bitwise exclusive or
2425 $x->bnot(); # bitwise not (two's complement)
2427 $x->bsqrt(); # calculate square-root
2428 $x->bfac(); # factorial of $x (1*2*3*4*..$x)
2430 $x->round($A,$P,$round_mode); # round to accuracy or precision using mode $r
2431 $x->bround($N); # accuracy: preserve $N digits
2432 $x->bfround($N); # round to $Nth digit, no-op for BigInts
2434 # The following do not modify their arguments in BigInt, but do in BigFloat:
2435 $x->bfloor(); # return integer less or equal than $x
2436 $x->bceil(); # return integer greater or equal than $x
2438 # The following do not modify their arguments:
2440 bgcd(@values); # greatest common divisor (no OO style)
2441 blcm(@values); # lowest common multiplicator (no OO style)
2443 $x->length(); # return number of digits in number
2444 ($x,$f) = $x->length(); # length of number and length of fraction part,
2445 # latter is always 0 digits long for BigInt's
2447 $x->exponent(); # return exponent as BigInt
2448 $x->mantissa(); # return (signed) mantissa as BigInt
2449 $x->parts(); # return (mantissa,exponent) as BigInt
2450 $x->copy(); # make a true copy of $x (unlike $y = $x;)
2451 $x->as_number(); # return as BigInt (in BigInt: same as copy())
2453 # conversation to string
2454 $x->bstr(); # normalized string
2455 $x->bsstr(); # normalized string in scientific notation
2456 $x->as_hex(); # as signed hexadecimal string with prefixed 0x
2457 $x->as_bin(); # as signed binary string with prefixed 0b
2461 All operators (inlcuding basic math operations) are overloaded if you
2462 declare your big integers as
2464 $i = new Math::BigInt '123_456_789_123_456_789';
2466 Operations with overloaded operators preserve the arguments which is
2467 exactly what you expect.
2471 =item Canonical notation
2473 Big integer values are strings of the form C</^[+-]\d+$/> with leading
2476 '-0' canonical value '-0', normalized '0'
2477 ' -123_123_123' canonical value '-123123123'
2478 '1_23_456_7890' canonical value '1234567890'
2482 Input values to these routines may be either Math::BigInt objects or
2483 strings of the form C</^\s*[+-]?[\d]+\.?[\d]*E?[+-]?[\d]*$/>.
2485 You can include one underscore between any two digits.
2487 This means integer values like 1.01E2 or even 1000E-2 are also accepted.
2488 Non integer values result in NaN.
2490 Math::BigInt::new() defaults to 0, while Math::BigInt::new('') results
2493 bnorm() on a BigInt object is now effectively a no-op, since the numbers
2494 are always stored in normalized form. On a string, it creates a BigInt
2499 Output values are BigInt objects (normalized), except for bstr(), which
2500 returns a string in normalized form.
2501 Some routines (C<is_odd()>, C<is_even()>, C<is_zero()>, C<is_one()>,
2502 C<is_nan()>) return true or false, while others (C<bcmp()>, C<bacmp()>)
2503 return either undef, <0, 0 or >0 and are suited for sort.
2509 Each of the methods below accepts three additional parameters. These arguments
2510 $A, $P and $R are accuracy, precision and round_mode. Please see more in the
2511 section about ACCURACY and ROUNDIND.
2517 Shifts $x right by $y in base $n. Default is base 2, used are usually 10 and
2518 2, but others work, too.
2520 Right shifting usually amounts to dividing $x by $n ** $y and truncating the
2524 $x = Math::BigInt->new(10);
2525 $x->brsft(1); # same as $x >> 1: 5
2526 $x = Math::BigInt->new(1234);
2527 $x->brsft(2,10); # result 12
2529 There is one exception, and that is base 2 with negative $x:
2532 $x = Math::BigInt->new(-5);
2535 This will print -3, not -2 (as it would if you divide -5 by 2 and truncate the
2540 $x = Math::BigInt->new($str,$A,$P,$R);
2542 Creates a new BigInt object from a string or another BigInt object. The
2543 input is accepted as decimal, hex (with leading '0x') or binary (with leading
2548 $x = Math::BigInt->bnan();
2550 Creates a new BigInt object representing NaN (Not A Number).
2551 If used on an object, it will set it to NaN:
2557 $x = Math::BigInt->bzero();
2559 Creates a new BigInt object representing zero.
2560 If used on an object, it will set it to zero:
2566 $x = Math::BigInt->binf($sign);
2568 Creates a new BigInt object representing infinity. The optional argument is
2569 either '-' or '+', indicating whether you want infinity or minus infinity.
2570 If used on an object, it will set it to infinity:
2577 $x = Math::BigInt->binf($sign);
2579 Creates a new BigInt object representing one. The optional argument is
2580 either '-' or '+', indicating whether you want one or minus one.
2581 If used on an object, it will set it to one:
2586 =head2 is_one()/is_zero()/is_nan()/is_positive()/is_negative()/is_inf()/is_odd()/is_even()/is_int()
2588 $x->is_zero(); # true if arg is +0
2589 $x->is_nan(); # true if arg is NaN
2590 $x->is_one(); # true if arg is +1
2591 $x->is_one('-'); # true if arg is -1
2592 $x->is_odd(); # true if odd, false for even
2593 $x->is_even(); # true if even, false for odd
2594 $x->is_positive(); # true if >= 0
2595 $x->is_negative(); # true if < 0
2596 $x->is_inf(); # true if +inf
2597 $x->is_inf('-'); # true if -inf (sign is default '+')
2598 $x->is_int(); # true if $x is an integer
2600 These methods all test the BigInt for one condition and return true or false
2601 depending on the input.
2605 $x->bcmp($y); # compare numbers (undef,<0,=0,>0)
2609 $x->bacmp($y); # compare absolutely (undef,<0,=0,>0)
2613 $x->sign(); # return the sign, either +,- or NaN
2617 $x->digit($n); # return the nth digit, counting from right
2623 Negate the number, e.g. change the sign between '+' and '-', or between '+inf'
2624 and '-inf', respectively. Does nothing for NaN or zero.
2630 Set the number to it's absolute value, e.g. change the sign from '-' to '+'
2631 and from '-inf' to '+inf', respectively. Does nothing for NaN or positive
2636 $x->bnorm(); # normalize (no-op)
2640 $x->bnot(); # two's complement (bit wise not)
2644 $x->binc(); # increment x by 1
2648 $x->bdec(); # decrement x by 1
2652 $x->badd($y); # addition (add $y to $x)
2656 $x->bsub($y); # subtraction (subtract $y from $x)
2660 $x->bmul($y); # multiplication (multiply $x by $y)
2664 $x->bdiv($y); # divide, set $x to quotient
2665 # return (quo,rem) or quo if scalar
2669 $x->bmod($y); # modulus (x % y)
2673 $x->bpow($y); # power of arguments (x ** y)
2677 $x->blsft($y); # left shift
2678 $x->blsft($y,$n); # left shift, by base $n (like 10)
2682 $x->brsft($y); # right shift
2683 $x->brsft($y,$n); # right shift, by base $n (like 10)
2687 $x->band($y); # bitwise and
2691 $x->bior($y); # bitwise inclusive or
2695 $x->bxor($y); # bitwise exclusive or
2699 $x->bnot(); # bitwise not (two's complement)
2703 $x->bsqrt(); # calculate square-root
2707 $x->bfac(); # factorial of $x (1*2*3*4*..$x)
2711 $x->round($A,$P,$round_mode); # round to accuracy or precision using mode $r
2715 $x->bround($N); # accuracy: preserve $N digits
2719 $x->bfround($N); # round to $Nth digit, no-op for BigInts
2725 Set $x to the integer less or equal than $x. This is a no-op in BigInt, but
2726 does change $x in BigFloat.
2732 Set $x to the integer greater or equal than $x. This is a no-op in BigInt, but
2733 does change $x in BigFloat.
2737 bgcd(@values); # greatest common divisor (no OO style)
2741 blcm(@values); # lowest common multiplicator (no OO style)
2746 ($xl,$fl) = $x->length();
2748 Returns the number of digits in the decimal representation of the number.
2749 In list context, returns the length of the integer and fraction part. For
2750 BigInt's, the length of the fraction part will always be 0.
2756 Return the exponent of $x as BigInt.
2762 Return the signed mantissa of $x as BigInt.
2766 $x->parts(); # return (mantissa,exponent) as BigInt
2770 $x->copy(); # make a true copy of $x (unlike $y = $x;)
2774 $x->as_number(); # return as BigInt (in BigInt: same as copy())
2778 $x->bstr(); # normalized string
2782 $x->bsstr(); # normalized string in scientific notation
2786 $x->as_hex(); # as signed hexadecimal string with prefixed 0x
2790 $x->as_bin(); # as signed binary string with prefixed 0b
2792 =head1 ACCURACY and PRECISION
2794 Since version v1.33, Math::BigInt and Math::BigFloat have full support for
2795 accuracy and precision based rounding, both automatically after every
2796 operation as well as manually.
2798 This section describes the accuracy/precision handling in Math::Big* as it
2799 used to be and as it is now, complete with an explanation of all terms and
2802 Not yet implemented things (but with correct description) are marked with '!',
2803 things that need to be answered are marked with '?'.
2805 In the next paragraph follows a short description of terms used here (because
2806 these may differ from terms used by others people or documentation).
2808 During the rest of this document, the shortcuts A (for accuracy), P (for
2809 precision), F (fallback) and R (rounding mode) will be used.
2813 A fixed number of digits before (positive) or after (negative)
2814 the decimal point. For example, 123.45 has a precision of -2. 0 means an
2815 integer like 123 (or 120). A precision of 2 means two digits to the left
2816 of the decimal point are zero, so 123 with P = 1 becomes 120. Note that
2817 numbers with zeros before the decimal point may have different precisions,
2818 because 1200 can have p = 0, 1 or 2 (depending on what the inital value
2819 was). It could also have p < 0, when the digits after the decimal point
2822 The string output (of floating point numbers) will be padded with zeros:
2824 Initial value P A Result String
2825 ------------------------------------------------------------
2826 1234.01 -3 1000 1000
2829 1234.001 1 1234 1234.0
2831 1234.01 2 1234.01 1234.01
2832 1234.01 5 1234.01 1234.01000
2834 For BigInts, no padding occurs.
2838 Number of significant digits. Leading zeros are not counted. A
2839 number may have an accuracy greater than the non-zero digits
2840 when there are zeros in it or trailing zeros. For example, 123.456 has
2841 A of 6, 10203 has 5, 123.0506 has 7, 123.450000 has 8 and 0.000123 has 3.
2843 The string output (of floating point numbers) will be padded with zeros:
2845 Initial value P A Result String
2846 ------------------------------------------------------------
2848 1234.01 6 1234.01 1234.01
2849 1234.1 8 1234.1 1234.1000
2851 For BigInts, no padding occurs.
2855 When both A and P are undefined, this is used as a fallback accuracy when
2858 =head2 Rounding mode R
2860 When rounding a number, different 'styles' or 'kinds'
2861 of rounding are possible. (Note that random rounding, as in
2862 Math::Round, is not implemented.)
2868 truncation invariably removes all digits following the
2869 rounding place, replacing them with zeros. Thus, 987.65 rounded
2870 to tens (P=1) becomes 980, and rounded to the fourth sigdig
2871 becomes 987.6 (A=4). 123.456 rounded to the second place after the
2872 decimal point (P=-2) becomes 123.46.
2874 All other implemented styles of rounding attempt to round to the
2875 "nearest digit." If the digit D immediately to the right of the
2876 rounding place (skipping the decimal point) is greater than 5, the
2877 number is incremented at the rounding place (possibly causing a
2878 cascade of incrementation): e.g. when rounding to units, 0.9 rounds
2879 to 1, and -19.9 rounds to -20. If D < 5, the number is similarly
2880 truncated at the rounding place: e.g. when rounding to units, 0.4
2881 rounds to 0, and -19.4 rounds to -19.
2883 However the results of other styles of rounding differ if the
2884 digit immediately to the right of the rounding place (skipping the
2885 decimal point) is 5 and if there are no digits, or no digits other
2886 than 0, after that 5. In such cases:
2890 rounds the digit at the rounding place to 0, 2, 4, 6, or 8
2891 if it is not already. E.g., when rounding to the first sigdig, 0.45
2892 becomes 0.4, -0.55 becomes -0.6, but 0.4501 becomes 0.5.
2896 rounds the digit at the rounding place to 1, 3, 5, 7, or 9 if
2897 it is not already. E.g., when rounding to the first sigdig, 0.45
2898 becomes 0.5, -0.55 becomes -0.5, but 0.5501 becomes 0.6.
2902 round to plus infinity, i.e. always round up. E.g., when
2903 rounding to the first sigdig, 0.45 becomes 0.5, -0.55 becomes -0.5,
2904 and 0.4501 also becomes 0.5.
2908 round to minus infinity, i.e. always round down. E.g., when
2909 rounding to the first sigdig, 0.45 becomes 0.4, -0.55 becomes -0.6,
2910 but 0.4501 becomes 0.5.
2914 round to zero, i.e. positive numbers down, negative ones up.
2915 E.g., when rounding to the first sigdig, 0.45 becomes 0.4, -0.55
2916 becomes -0.5, but 0.4501 becomes 0.5.
2920 The handling of A & P in MBI/MBF (the old core code shipped with Perl
2921 versions <= 5.7.2) is like this:
2927 * ffround($p) is able to round to $p number of digits after the decimal
2929 * otherwise P is unused
2931 =item Accuracy (significant digits)
2933 * fround($a) rounds to $a significant digits
2934 * only fdiv() and fsqrt() take A as (optional) paramater
2935 + other operations simply create the same number (fneg etc), or more (fmul)
2937 + rounding/truncating is only done when explicitly calling one of fround
2938 or ffround, and never for BigInt (not implemented)
2939 * fsqrt() simply hands its accuracy argument over to fdiv.
2940 * the documentation and the comment in the code indicate two different ways
2941 on how fdiv() determines the maximum number of digits it should calculate,
2942 and the actual code does yet another thing
2944 max($Math::BigFloat::div_scale,length(dividend)+length(divisor))
2946 result has at most max(scale, length(dividend), length(divisor)) digits
2948 scale = max(scale, length(dividend)-1,length(divisor)-1);
2949 scale += length(divisior) - length(dividend);
2950 So for lx = 3, ly = 9, scale = 10, scale will actually be 16 (10+9-3).
2951 Actually, the 'difference' added to the scale is calculated from the
2952 number of "significant digits" in dividend and divisor, which is derived
2953 by looking at the length of the mantissa. Which is wrong, since it includes
2954 the + sign (oups) and actually gets 2 for '+100' and 4 for '+101'. Oups
2955 again. Thus 124/3 with div_scale=1 will get you '41.3' based on the strange
2956 assumption that 124 has 3 significant digits, while 120/7 will get you
2957 '17', not '17.1' since 120 is thought to have 2 significant digits.
2958 The rounding after the division then uses the remainder and $y to determine
2959 wether it must round up or down.
2960 ? I have no idea which is the right way. That's why I used a slightly more
2961 ? simple scheme and tweaked the few failing testcases to match it.
2965 This is how it works now:
2969 =item Setting/Accessing
2971 * You can set the A global via Math::BigInt->accuracy() or
2972 Math::BigFloat->accuracy() or whatever class you are using.
2973 * You can also set P globally by using Math::SomeClass->precision() likewise.
2974 * Globals are classwide, and not inherited by subclasses.
2975 * to undefine A, use Math::SomeCLass->accuracy(undef);
2976 * to undefine P, use Math::SomeClass->precision(undef);
2977 * Setting Math::SomeClass->accuracy() clears automatically
2978 Math::SomeClass->precision(), and vice versa.
2979 * To be valid, A must be > 0, P can have any value.
2980 * If P is negative, this means round to the P'th place to the right of the
2981 decimal point; positive values mean to the left of the decimal point.
2982 P of 0 means round to integer.
2983 * to find out the current global A, take Math::SomeClass->accuracy()
2984 * to find out the current global P, take Math::SomeClass->precision()
2985 * use $x->accuracy() respective $x->precision() for the local setting of $x.
2986 * Please note that $x->accuracy() respecive $x->precision() fall back to the
2987 defined globals, when $x's A or P is not set.
2989 =item Creating numbers
2991 * When you create a number, you can give it's desired A or P via:
2992 $x = Math::BigInt->new($number,$A,$P);
2993 * Only one of A or P can be defined, otherwise the result is NaN
2994 * If no A or P is give ($x = Math::BigInt->new($number) form), then the
2995 globals (if set) will be used. Thus changing the global defaults later on
2996 will not change the A or P of previously created numbers (i.e., A and P of
2997 $x will be what was in effect when $x was created)
2998 * If given undef for A and P, B<no> rounding will occur, and the globals will
2999 B<not> be used. This is used by subclasses to create numbers without
3000 suffering rounding in the parent. Thus a subclass is able to have it's own
3001 globals enforced upon creation of a number by using
3002 $x = Math::BigInt->new($number,undef,undef):
3004 use Math::Bigint::SomeSubclass;
3007 Math::BigInt->accuracy(2);
3008 Math::BigInt::SomeSubClass->accuracy(3);
3009 $x = Math::BigInt::SomeSubClass->new(1234);
3011 $x is now 1230, and not 1200. A subclass might choose to implement
3012 this otherwise, e.g. falling back to the parent's A and P.
3016 * If A or P are enabled/defined, they are used to round the result of each
3017 operation according to the rules below
3018 * Negative P is ignored in Math::BigInt, since BigInts never have digits
3019 after the decimal point
3020 * Math::BigFloat uses Math::BigInts internally, but setting A or P inside
3021 Math::BigInt as globals should not tamper with the parts of a BigFloat.
3022 Thus a flag is used to mark all Math::BigFloat numbers as 'never round'
3026 * It only makes sense that a number has only one of A or P at a time.
3027 Since you can set/get both A and P, there is a rule that will practically
3028 enforce only A or P to be in effect at a time, even if both are set.
3029 This is called precedence.
3030 * If two objects are involved in an operation, and one of them has A in
3031 effect, and the other P, this results in an error (NaN).
3032 * A takes precendence over P (Hint: A comes before P). If A is defined, it
3033 is used, otherwise P is used. If neither of them is defined, nothing is
3034 used, i.e. the result will have as many digits as it can (with an
3035 exception for fdiv/fsqrt) and will not be rounded.
3036 * There is another setting for fdiv() (and thus for fsqrt()). If neither of
3037 A or P is defined, fdiv() will use a fallback (F) of $div_scale digits.
3038 If either the dividend's or the divisor's mantissa has more digits than
3039 the value of F, the higher value will be used instead of F.
3040 This is to limit the digits (A) of the result (just consider what would
3041 happen with unlimited A and P in the case of 1/3 :-)
3042 * fdiv will calculate (at least) 4 more digits than required (determined by
3043 A, P or F), and, if F is not used, round the result
3044 (this will still fail in the case of a result like 0.12345000000001 with A
3045 or P of 5, but this can not be helped - or can it?)
3046 * Thus you can have the math done by on Math::Big* class in three modes:
3047 + never round (this is the default):
3048 This is done by setting A and P to undef. No math operation
3049 will round the result, with fdiv() and fsqrt() as exceptions to guard
3050 against overflows. You must explicitely call bround(), bfround() or
3051 round() (the latter with parameters).
3052 Note: Once you have rounded a number, the settings will 'stick' on it
3053 and 'infect' all other numbers engaged in math operations with it, since
3054 local settings have the highest precedence. So, to get SaferRound[tm],
3055 use a copy() before rounding like this:
3057 $x = Math::BigFloat->new(12.34);
3058 $y = Math::BigFloat->new(98.76);
3059 $z = $x * $y; # 1218.6984
3060 print $x->copy()->fround(3); # 12.3 (but A is now 3!)
3061 $z = $x * $y; # still 1218.6984, without
3062 # copy would have been 1210!
3064 + round after each op:
3065 After each single operation (except for testing like is_zero()), the
3066 method round() is called and the result is rounded appropriately. By
3067 setting proper values for A and P, you can have all-the-same-A or
3068 all-the-same-P modes. For example, Math::Currency might set A to undef,
3069 and P to -2, globally.
3071 ?Maybe an extra option that forbids local A & P settings would be in order,
3072 ?so that intermediate rounding does not 'poison' further math?
3074 =item Overriding globals
3076 * you will be able to give A, P and R as an argument to all the calculation
3077 routines; the second parameter is A, the third one is P, and the fourth is
3078 R (shift right by one for binary operations like badd). P is used only if
3079 the first parameter (A) is undefined. These three parameters override the
3080 globals in the order detailed as follows, i.e. the first defined value
3082 (local: per object, global: global default, parameter: argument to sub)
3085 + local A (if defined on both of the operands: smaller one is taken)
3086 + local P (if defined on both of the operands: bigger one is taken)
3090 * fsqrt() will hand its arguments to fdiv(), as it used to, only now for two
3091 arguments (A and P) instead of one
3093 =item Local settings
3095 * You can set A and P locally by using $x->accuracy() and $x->precision()
3096 and thus force different A and P for different objects/numbers.
3097 * Setting A or P this way immediately rounds $x to the new value.
3098 * $x->accuracy() clears $x->precision(), and vice versa.
3102 * the rounding routines will use the respective global or local settings.
3103 fround()/bround() is for accuracy rounding, while ffround()/bfround()
3105 * the two rounding functions take as the second parameter one of the
3106 following rounding modes (R):
3107 'even', 'odd', '+inf', '-inf', 'zero', 'trunc'
3108 * you can set and get the global R by using Math::SomeClass->round_mode()
3109 or by setting $Math::SomeClass::round_mode
3110 * after each operation, $result->round() is called, and the result may
3111 eventually be rounded (that is, if A or P were set either locally,
3112 globally or as parameter to the operation)
3113 * to manually round a number, call $x->round($A,$P,$round_mode);
3114 this will round the number by using the appropriate rounding function
3115 and then normalize it.
3116 * rounding modifies the local settings of the number:
3118 $x = Math::BigFloat->new(123.456);
3122 Here 4 takes precedence over 5, so 123.5 is the result and $x->accuracy()
3123 will be 4 from now on.
3125 =item Default values
3134 * The defaults are set up so that the new code gives the same results as
3135 the old code (except in a few cases on fdiv):
3136 + Both A and P are undefined and thus will not be used for rounding
3137 after each operation.
3138 + round() is thus a no-op, unless given extra parameters A and P
3144 The actual numbers are stored as unsigned big integers (with seperate sign).
3145 You should neither care about nor depend on the internal representation; it
3146 might change without notice. Use only method calls like C<< $x->sign(); >>
3147 instead relying on the internal hash keys like in C<< $x->{sign}; >>.
3151 Math with the numbers is done (by default) by a module called
3152 Math::BigInt::Calc. This is equivalent to saying:
3154 use Math::BigInt lib => 'Calc';
3156 You can change this by using:
3158 use Math::BigInt lib => 'BitVect';
3160 The following would first try to find Math::BigInt::Foo, then
3161 Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
3163 use Math::BigInt lib => 'Foo,Math::BigInt::Bar';
3165 Calc.pm uses as internal format an array of elements of some decimal base
3166 (usually 1e5 or 1e7) with the least significant digit first, while BitVect.pm
3167 uses a bit vector of base 2, most significant bit first. Other modules might
3168 use even different means of representing the numbers. See the respective
3169 module documentation for further details.
3173 The sign is either '+', '-', 'NaN', '+inf' or '-inf' and stored seperately.
3175 A sign of 'NaN' is used to represent the result when input arguments are not
3176 numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
3177 minus infinity. You will get '+inf' when dividing a positive number by 0, and
3178 '-inf' when dividing any negative number by 0.
3180 =head2 mantissa(), exponent() and parts()
3182 C<mantissa()> and C<exponent()> return the said parts of the BigInt such
3185 $m = $x->mantissa();
3186 $e = $x->exponent();
3187 $y = $m * ( 10 ** $e );
3188 print "ok\n" if $x == $y;
3190 C<< ($m,$e) = $x->parts() >> is just a shortcut that gives you both of them
3191 in one go. Both the returned mantissa and exponent have a sign.
3193 Currently, for BigInts C<$e> will be always 0, except for NaN, +inf and -inf,
3194 where it will be NaN; and for $x == 0, where it will be 1
3195 (to be compatible with Math::BigFloat's internal representation of a zero as
3198 C<$m> will always be a copy of the original number. The relation between $e
3199 and $m might change in the future, but will always be equivalent in a
3200 numerical sense, e.g. $m might get minimized.
3206 sub bint { Math::BigInt->new(shift); }
3208 $x = Math::BigInt->bstr("1234") # string "1234"
3209 $x = "$x"; # same as bstr()
3210 $x = Math::BigInt->bneg("1234"); # Bigint "-1234"
3211 $x = Math::BigInt->babs("-12345"); # Bigint "12345"
3212 $x = Math::BigInt->bnorm("-0 00"); # BigInt "0"
3213 $x = bint(1) + bint(2); # BigInt "3"
3214 $x = bint(1) + "2"; # ditto (auto-BigIntify of "2")
3215 $x = bint(1); # BigInt "1"
3216 $x = $x + 5 / 2; # BigInt "3"
3217 $x = $x ** 3; # BigInt "27"
3218 $x *= 2; # BigInt "54"
3219 $x = Math::BigInt->new(0); # BigInt "0"
3221 $x = Math::BigInt->badd(4,5) # BigInt "9"
3222 print $x->bsstr(); # 9e+0
3224 Examples for rounding:
3229 $x = Math::BigFloat->new(123.4567);
3230 $y = Math::BigFloat->new(123.456789);
3231 Math::BigFloat->accuracy(4); # no more A than 4
3233 ok ($x->copy()->fround(),123.4); # even rounding
3234 print $x->copy()->fround(),"\n"; # 123.4
3235 Math::BigFloat->round_mode('odd'); # round to odd
3236 print $x->copy()->fround(),"\n"; # 123.5
3237 Math::BigFloat->accuracy(5); # no more A than 5
3238 Math::BigFloat->round_mode('odd'); # round to odd
3239 print $x->copy()->fround(),"\n"; # 123.46
3240 $y = $x->copy()->fround(4),"\n"; # A = 4: 123.4
3241 print "$y, ",$y->accuracy(),"\n"; # 123.4, 4
3243 Math::BigFloat->accuracy(undef); # A not important now
3244 Math::BigFloat->precision(2); # P important
3245 print $x->copy()->bnorm(),"\n"; # 123.46
3246 print $x->copy()->fround(),"\n"; # 123.46
3248 Examples for converting:
3250 my $x = Math::BigInt->new('0b1'.'01' x 123);
3251 print "bin: ",$x->as_bin()," hex:",$x->as_hex()," dec: ",$x,"\n";
3253 =head1 Autocreating constants
3255 After C<use Math::BigInt ':constant'> all the B<integer> decimal constants
3256 in the given scope are converted to C<Math::BigInt>. This conversion
3257 happens at compile time.
3261 perl -MMath::BigInt=:constant -e 'print 2**100,"\n"'
3263 prints the integer value of C<2**100>. Note that without conversion of
3264 constants the expression 2**100 will be calculated as perl scalar.
3266 Please note that strings and floating point constants are not affected,
3269 use Math::BigInt qw/:constant/;
3271 $x = 1234567890123456789012345678901234567890
3272 + 123456789123456789;
3273 $y = '1234567890123456789012345678901234567890'
3274 + '123456789123456789';
3276 do not work. You need an explicit Math::BigInt->new() around one of the
3277 operands. You should also quote large constants to protect loss of precision:
3281 $x = Math::BigInt->new('1234567889123456789123456789123456789');
3283 Without the quotes Perl would convert the large number to a floating point
3284 constant at compile time and then hand the result to BigInt, which results in
3285 an truncated result or a NaN.
3289 Using the form $x += $y; etc over $x = $x + $y is faster, since a copy of $x
3290 must be made in the second case. For long numbers, the copy can eat up to 20%
3291 of the work (in the case of addition/subtraction, less for
3292 multiplication/division). If $y is very small compared to $x, the form
3293 $x += $y is MUCH faster than $x = $x + $y since making the copy of $x takes
3294 more time then the actual addition.
3296 With a technique called copy-on-write, the cost of copying with overload could
3297 be minimized or even completely avoided. A test implementation of COW did show
3298 performance gains for overloaded math, but introduced a performance loss due
3299 to a constant overhead for all other operatons.
3301 The rewritten version of this module is slower on certain operations, like
3302 new(), bstr() and numify(). The reason are that it does now more work and
3303 handles more cases. The time spent in these operations is usually gained in
3304 the other operations so that programs on the average should get faster. If
3305 they don't, please contect the author.
3307 Some operations may be slower for small numbers, but are significantly faster
3308 for big numbers. Other operations are now constant (O(1), like bneg(), babs()
3309 etc), instead of O(N) and thus nearly always take much less time. These
3310 optimizations were done on purpose.
3312 If you find the Calc module to slow, try to install any of the replacement
3313 modules and see if they help you.
3315 =head2 Alternative math libraries
3317 You can use an alternative library to drive Math::BigInt via:
3319 use Math::BigInt lib => 'Module';
3321 See L<MATH LIBRARY> for more information.
3323 For more benchmark results see L<http://bloodgate.com/perl/benchmarks.html>.
3327 =head1 Subclassing Math::BigInt
3329 The basic design of Math::BigInt allows simple subclasses with very little
3330 work, as long as a few simple rules are followed:
3336 The public API must remain consistent, i.e. if a sub-class is overloading
3337 addition, the sub-class must use the same name, in this case badd(). The
3338 reason for this is that Math::BigInt is optimized to call the object methods
3343 The private object hash keys like C<$x->{sign}> may not be changed, but
3344 additional keys can be added, like C<$x->{_custom}>.
3348 Accessor functions are available for all existing object hash keys and should
3349 be used instead of directly accessing the internal hash keys. The reason for
3350 this is that Math::BigInt itself has a pluggable interface which permits it
3351 to support different storage methods.
3355 More complex sub-classes may have to replicate more of the logic internal of
3356 Math::BigInt if they need to change more basic behaviors. A subclass that
3357 needs to merely change the output only needs to overload C<bstr()>.
3359 All other object methods and overloaded functions can be directly inherited
3360 from the parent class.
3362 At the very minimum, any subclass will need to provide it's own C<new()> and can
3363 store additional hash keys in the object. There are also some package globals
3364 that must be defined, e.g.:
3368 $precision = -2; # round to 2 decimal places
3369 $round_mode = 'even';
3372 Additionally, you might want to provide the following two globals to allow
3373 auto-upgrading and auto-downgrading to work correctly:
3378 This allows Math::BigInt to correctly retrieve package globals from the
3379 subclass, like C<$SubClass::precision>. See t/Math/BigInt/Subclass.pm or
3380 t/Math/BigFloat/SubClass.pm completely functional subclass examples.
3386 in your subclass to automatically inherit the overloading from the parent. If
3387 you like, you can change part of the overloading, look at Math::String for an
3392 When used like this:
3394 use Math::BigInt upgrade => 'Foo::Bar';
3396 certain operations will 'upgrade' their calculation and thus the result to
3397 the class Foo::Bar. Usually this is used in conjunction with Math::BigFloat:
3399 use Math::BigInt upgrade => 'Math::BigFloat';
3401 As a shortcut, you can use the module C<bignum>:
3405 Also good for oneliners:
3407 perl -Mbignum -le 'print 2 ** 255'
3409 This makes it possible to mix arguments of different classes (as in 2.5 + 2)
3410 as well es preserve accuracy (as in sqrt(3)).
3412 Beware: This feature is not fully implemented yet.
3416 The following methods upgrade themselves unconditionally; that is if upgrade
3417 is in effect, they will always hand up their work:
3429 Beware: This list is not complete.
3431 All other methods upgrade themselves only when one (or all) of their
3432 arguments are of the class mentioned in $upgrade (This might change in later
3433 versions to a more sophisticated scheme):
3439 =item Out of Memory!
3441 Under Perl prior to 5.6.0 having an C<use Math::BigInt ':constant';> and
3442 C<eval()> in your code will crash with "Out of memory". This is probably an
3443 overload/exporter bug. You can workaround by not having C<eval()>
3444 and ':constant' at the same time or upgrade your Perl to a newer version.
3446 =item Fails to load Calc on Perl prior 5.6.0
3448 Since eval(' use ...') can not be used in conjunction with ':constant', BigInt
3449 will fall back to eval { require ... } when loading the math lib on Perls
3450 prior to 5.6.0. This simple replaces '::' with '/' and thus might fail on
3451 filesystems using a different seperator.
3457 Some things might not work as you expect them. Below is documented what is
3458 known to be troublesome:
3462 =item stringify, bstr(), bsstr() and 'cmp'
3464 Both stringify and bstr() now drop the leading '+'. The old code would return
3465 '+3', the new returns '3'. This is to be consistent with Perl and to make
3466 cmp (especially with overloading) to work as you expect. It also solves
3467 problems with Test.pm, it's ok() uses 'eq' internally.
3469 Mark said, when asked about to drop the '+' altogether, or make only cmp work:
3471 I agree (with the first alternative), don't add the '+' on positive
3472 numbers. It's not as important anymore with the new internal
3473 form for numbers. It made doing things like abs and neg easier,
3474 but those have to be done differently now anyway.
3476 So, the following examples will now work all as expected:
3479 BEGIN { plan tests => 1 }
3482 my $x = new Math::BigInt 3*3;
3483 my $y = new Math::BigInt 3*3;
3486 print "$x eq 9" if $x eq $y;
3487 print "$x eq 9" if $x eq '9';
3488 print "$x eq 9" if $x eq 3*3;
3490 Additionally, the following still works:
3492 print "$x == 9" if $x == $y;
3493 print "$x == 9" if $x == 9;
3494 print "$x == 9" if $x == 3*3;
3496 There is now a C<bsstr()> method to get the string in scientific notation aka
3497 C<1e+2> instead of C<100>. Be advised that overloaded 'eq' always uses bstr()
3498 for comparisation, but Perl will represent some numbers as 100 and others
3499 as 1e+308. If in doubt, convert both arguments to Math::BigInt before doing eq:
3502 BEGIN { plan tests => 3 }
3505 $x = Math::BigInt->new('1e56'); $y = 1e56;
3506 ok ($x,$y); # will fail
3507 ok ($x->bsstr(),$y); # okay
3508 $y = Math::BigInt->new($y);
3511 Alternatively, simple use <=> for comparisations, that will get it always
3512 right. There is not yet a way to get a number automatically represented as
3513 a string that matches exactly the way Perl represents it.
3517 C<int()> will return (at least for Perl v5.7.1 and up) another BigInt, not a
3520 $x = Math::BigInt->new(123);
3521 $y = int($x); # BigInt 123
3522 $x = Math::BigFloat->new(123.45);
3523 $y = int($x); # BigInt 123
3525 In all Perl versions you can use C<as_number()> for the same effect:
3527 $x = Math::BigFloat->new(123.45);
3528 $y = $x->as_number(); # BigInt 123
3530 This also works for other subclasses, like Math::String.
3532 It is yet unlcear whether overloaded int() should return a scalar or a BigInt.
3536 The following will probably not do what you expect:
3538 $c = Math::BigInt->new(123);
3539 print $c->length(),"\n"; # prints 30
3541 It prints both the number of digits in the number and in the fraction part
3542 since print calls C<length()> in list context. Use something like:
3544 print scalar $c->length(),"\n"; # prints 3
3548 The following will probably not do what you expect:
3550 print $c->bdiv(10000),"\n";
3552 It prints both quotient and remainder since print calls C<bdiv()> in list
3553 context. Also, C<bdiv()> will modify $c, so be carefull. You probably want
3556 print $c / 10000,"\n";
3557 print scalar $c->bdiv(10000),"\n"; # or if you want to modify $c
3561 The quotient is always the greatest integer less than or equal to the
3562 real-valued quotient of the two operands, and the remainder (when it is
3563 nonzero) always has the same sign as the second operand; so, for
3573 As a consequence, the behavior of the operator % agrees with the
3574 behavior of Perl's built-in % operator (as documented in the perlop
3575 manpage), and the equation
3577 $x == ($x / $y) * $y + ($x % $y)
3579 holds true for any $x and $y, which justifies calling the two return
3580 values of bdiv() the quotient and remainder. The only exception to this rule
3581 are when $y == 0 and $x is negative, then the remainder will also be
3582 negative. See below under "infinity handling" for the reasoning behing this.
3584 Perl's 'use integer;' changes the behaviour of % and / for scalars, but will
3585 not change BigInt's way to do things. This is because under 'use integer' Perl
3586 will do what the underlying C thinks is right and this is different for each
3587 system. If you need BigInt's behaving exactly like Perl's 'use integer', bug
3588 the author to implement it ;)
3590 =item infinity handling
3592 Here are some examples that explain the reasons why certain results occur while
3595 The following table shows the result of the division and the remainder, so that
3596 the equation above holds true. Some "ordinary" cases are strewn in to show more
3597 clearly the reasoning:
3599 A / B = C, R so that C * B + R = A
3600 =========================================================
3601 5 / 8 = 0, 5 0 * 8 + 5 = 5
3602 0 / 8 = 0, 0 0 * 8 + 0 = 0
3603 0 / inf = 0, 0 0 * inf + 0 = 0
3604 0 /-inf = 0, 0 0 * -inf + 0 = 0
3605 5 / inf = 0, 5 0 * inf + 5 = 5
3606 5 /-inf = 0, 5 0 * -inf + 5 = 5
3607 -5/ inf = 0, -5 0 * inf + -5 = -5
3608 -5/-inf = 0, -5 0 * -inf + -5 = -5
3609 inf/ 5 = inf, 0 inf * 5 + 0 = inf
3610 -inf/ 5 = -inf, 0 -inf * 5 + 0 = -inf
3611 inf/ -5 = -inf, 0 -inf * -5 + 0 = inf
3612 -inf/ -5 = inf, 0 inf * -5 + 0 = -inf
3613 5/ 5 = 1, 0 1 * 5 + 0 = 5
3614 -5/ -5 = 1, 0 1 * -5 + 0 = -5
3615 inf/ inf = 1, 0 1 * inf + 0 = inf
3616 -inf/-inf = 1, 0 1 * -inf + 0 = -inf
3617 inf/-inf = -1, 0 -1 * -inf + 0 = inf
3618 -inf/ inf = -1, 0 1 * -inf + 0 = -inf
3619 8/ 0 = inf, 8 inf * 0 + 8 = 8
3620 inf/ 0 = inf, inf inf * 0 + inf = inf
3623 These cases below violate the "remainder has the sign of the second of the two
3624 arguments", since they wouldn't match up otherwise.
3626 A / B = C, R so that C * B + R = A
3627 ========================================================
3628 -inf/ 0 = -inf, -inf -inf * 0 + inf = -inf
3629 -8/ 0 = -inf, -8 -inf * 0 + 8 = -8
3631 =item Modifying and =
3635 $x = Math::BigFloat->new(5);
3638 It will not do what you think, e.g. making a copy of $x. Instead it just makes
3639 a second reference to the B<same> object and stores it in $y. Thus anything
3640 that modifies $x (except overloaded operators) will modify $y, and vice versa.
3641 Or in other words, C<=> is only safe if you modify your BigInts only via
3642 overloaded math. As soon as you use a method call it breaks:
3645 print "$x, $y\n"; # prints '10, 10'
3647 If you want a true copy of $x, use:
3651 You can also chain the calls like this, this will make first a copy and then
3654 $y = $x->copy()->bmul(2);
3656 See also the documentation for overload.pm regarding C<=>.
3660 C<bpow()> (and the rounding functions) now modifies the first argument and
3661 returns it, unlike the old code which left it alone and only returned the
3662 result. This is to be consistent with C<badd()> etc. The first three will
3663 modify $x, the last one won't:
3665 print bpow($x,$i),"\n"; # modify $x
3666 print $x->bpow($i),"\n"; # ditto
3667 print $x **= $i,"\n"; # the same
3668 print $x ** $i,"\n"; # leave $x alone
3670 The form C<$x **= $y> is faster than C<$x = $x ** $y;>, though.
3672 =item Overloading -$x
3682 since overload calls C<sub($x,0,1);> instead of C<neg($x)>. The first variant
3683 needs to preserve $x since it does not know that it later will get overwritten.
3684 This makes a copy of $x and takes O(N), but $x->bneg() is O(1).
3686 With Copy-On-Write, this issue would be gone, but C-o-W is not implemented
3687 since it is slower for all other things.
3689 =item Mixing different object types
3691 In Perl you will get a floating point value if you do one of the following:
3697 With overloaded math, only the first two variants will result in a BigFloat:
3702 $mbf = Math::BigFloat->new(5);
3703 $mbi2 = Math::BigInteger->new(5);
3704 $mbi = Math::BigInteger->new(2);
3706 # what actually gets called:
3707 $float = $mbf + $mbi; # $mbf->badd()
3708 $float = $mbf / $mbi; # $mbf->bdiv()
3709 $integer = $mbi + $mbf; # $mbi->badd()
3710 $integer = $mbi2 / $mbi; # $mbi2->bdiv()
3711 $integer = $mbi2 / $mbf; # $mbi2->bdiv()
3713 This is because math with overloaded operators follows the first (dominating)
3714 operand, and the operation of that is called and returns thus the result. So,
3715 Math::BigInt::bdiv() will always return a Math::BigInt, regardless whether
3716 the result should be a Math::BigFloat or the second operant is one.
3718 To get a Math::BigFloat you either need to call the operation manually,
3719 make sure the operands are already of the proper type or casted to that type
3720 via Math::BigFloat->new():
3722 $float = Math::BigFloat->new($mbi2) / $mbi; # = 2.5
3724 Beware of simple "casting" the entire expression, this would only convert
3725 the already computed result:
3727 $float = Math::BigFloat->new($mbi2 / $mbi); # = 2.0 thus wrong!
3729 Beware also of the order of more complicated expressions like:
3731 $integer = ($mbi2 + $mbi) / $mbf; # int / float => int
3732 $integer = $mbi2 / Math::BigFloat->new($mbi); # ditto
3734 If in doubt, break the expression into simpler terms, or cast all operands
3735 to the desired resulting type.
3737 Scalar values are a bit different, since:
3742 will both result in the proper type due to the way the overloaded math works.
3744 This section also applies to other overloaded math packages, like Math::String.
3746 One solution to you problem might be L<autoupgrading|upgrading>.
3750 C<bsqrt()> works only good if the result is a big integer, e.g. the square
3751 root of 144 is 12, but from 12 the square root is 3, regardless of rounding
3754 If you want a better approximation of the square root, then use:
3756 $x = Math::BigFloat->new(12);
3757 Math::BigFloat->precision(0);
3758 Math::BigFloat->round_mode('even');
3759 print $x->copy->bsqrt(),"\n"; # 4
3761 Math::BigFloat->precision(2);
3762 print $x->bsqrt(),"\n"; # 3.46
3763 print $x->bsqrt(3),"\n"; # 3.464
3767 For negative numbers in base see also L<brsft|brsft>.
3773 This program is free software; you may redistribute it and/or modify it under
3774 the same terms as Perl itself.
3778 L<Math::BigFloat> and L<Math::Big> as well as L<Math::BigInt::BitVect>,
3779 L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
3782 L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigInt> contains
3783 more documentation including a full version history, testcases, empty
3784 subclass files and benchmarks.
3788 Original code by Mark Biggar, overloaded interface by Ilya Zakharevich.
3789 Completely rewritten by Tels http://bloodgate.com in late 2000, 2001.