4 # "Mike had an infinite amount to do and a negative amount of time in which
5 # to do it." - Before and After
8 # The following hash values are used:
9 # value: unsigned int with actual value (as a Math::BigInt::Calc or similiar)
10 # sign : +,-,NaN,+inf,-inf
13 # _f : flags, used by MBF to flag parts of a float as untouchable
15 # Remember not to take shortcuts ala $xs = $x->{value}; $CALC->foo($xs); since
16 # underlying lib might change the reference!
18 my $class = "Math::BigInt";
23 @ISA = qw( Exporter );
24 @EXPORT_OK = qw( objectify _swap bgcd blcm);
25 use vars qw/$round_mode $accuracy $precision $div_scale $rnd_mode/;
26 use vars qw/$upgrade $downgrade/;
29 # Inside overload, the first arg is always an object. If the original code had
30 # it reversed (like $x = 2 * $y), then the third paramater indicates this
31 # swapping. To make it work, we use a helper routine which not only reswaps the
32 # params, but also makes a new object in this case. See _swap() for details,
33 # especially the cases of operators with different classes.
35 # For overloaded ops with only one argument we simple use $_[0]->copy() to
36 # preserve the argument.
38 # Thus inheritance of overload operators becomes possible and transparent for
39 # our subclasses without the need to repeat the entire overload section there.
42 '=' => sub { $_[0]->copy(); },
44 # '+' and '-' do not use _swap, since it is a triffle slower. If you want to
45 # override _swap (if ever), then override overload of '+' and '-', too!
46 # for sub it is a bit tricky to keep b: b-a => -a+b
47 '-' => sub { my $c = $_[0]->copy; $_[2] ?
48 $c->bneg()->badd($_[1]) :
50 '+' => sub { $_[0]->copy()->badd($_[1]); },
52 # some shortcuts for speed (assumes that reversed order of arguments is routed
53 # to normal '+' and we thus can always modify first arg. If this is changed,
54 # this breaks and must be adjusted.)
55 '+=' => sub { $_[0]->badd($_[1]); },
56 '-=' => sub { $_[0]->bsub($_[1]); },
57 '*=' => sub { $_[0]->bmul($_[1]); },
58 '/=' => sub { scalar $_[0]->bdiv($_[1]); },
59 '%=' => sub { $_[0]->bmod($_[1]); },
60 '^=' => sub { $_[0]->bxor($_[1]); },
61 '&=' => sub { $_[0]->band($_[1]); },
62 '|=' => sub { $_[0]->bior($_[1]); },
63 '**=' => sub { $_[0]->bpow($_[1]); },
65 # not supported by Perl yet
66 '..' => \&_pointpoint,
68 '<=>' => sub { $_[2] ?
69 ref($_[0])->bcmp($_[1],$_[0]) :
70 ref($_[0])->bcmp($_[0],$_[1])},
73 "$_[1]" cmp $_[0]->bstr() :
74 $_[0]->bstr() cmp "$_[1]" },
76 'log' => sub { $_[0]->copy()->blog(); },
77 'int' => sub { $_[0]->copy(); },
78 'neg' => sub { $_[0]->copy()->bneg(); },
79 'abs' => sub { $_[0]->copy()->babs(); },
80 'sqrt' => sub { $_[0]->copy()->bsqrt(); },
81 '~' => sub { $_[0]->copy()->bnot(); },
83 '*' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bmul($a[1]); },
84 '/' => sub { my @a = ref($_[0])->_swap(@_);scalar $a[0]->bdiv($a[1]);},
85 '%' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bmod($a[1]); },
86 '**' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bpow($a[1]); },
87 '<<' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->blsft($a[1]); },
88 '>>' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->brsft($a[1]); },
90 '&' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->band($a[1]); },
91 '|' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bior($a[1]); },
92 '^' => sub { my @a = ref($_[0])->_swap(@_); $a[0]->bxor($a[1]); },
94 # can modify arg of ++ and --, so avoid a new-copy for speed, but don't
95 # use $_[0]->__one(), it modifies $_[0] to be 1!
96 '++' => sub { $_[0]->binc() },
97 '--' => sub { $_[0]->bdec() },
99 # if overloaded, O(1) instead of O(N) and twice as fast for small numbers
101 # this kludge is needed for perl prior 5.6.0 since returning 0 here fails :-/
102 # v5.6.1 dumps on that: return !$_[0]->is_zero() || undef; :-(
103 my $t = !$_[0]->is_zero();
108 # the original qw() does not work with the TIESCALAR below, why?
109 # Order of arguments unsignificant
110 '""' => sub { $_[0]->bstr(); },
111 '0+' => sub { $_[0]->numify(); }
114 ##############################################################################
115 # global constants, flags and accessory
117 use constant MB_NEVER_ROUND => 0x0001;
119 my $NaNOK=1; # are NaNs ok?
120 my $nan = 'NaN'; # constants for easier life
122 my $CALC = 'Math::BigInt::Calc'; # module to do low level math
123 my $IMPORT = 0; # did import() yet?
125 $round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
130 $upgrade = undef; # default is no upgrade
131 $downgrade = undef; # default is no downgrade
133 ##############################################################################
134 # the old code had $rnd_mode, so we need to support it, too
137 sub TIESCALAR { my ($class) = @_; bless \$round_mode, $class; }
138 sub FETCH { return $round_mode; }
139 sub STORE { $rnd_mode = $_[0]->round_mode($_[1]); }
141 BEGIN { tie $rnd_mode, 'Math::BigInt'; }
143 ##############################################################################
148 # make Class->round_mode() work
150 my $class = ref($self) || $self || __PACKAGE__;
154 die "Unknown round mode $m"
155 if $m !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/;
156 return ${"${class}::round_mode"} = $m;
158 return ${"${class}::round_mode"};
164 # make Class->upgrade() work
166 my $class = ref($self) || $self || __PACKAGE__;
167 # need to set new value?
171 return ${"${class}::upgrade"} = $u;
173 return ${"${class}::upgrade"};
179 # make Class->downgrade() work
181 my $class = ref($self) || $self || __PACKAGE__;
182 # need to set new value?
186 return ${"${class}::downgrade"} = $u;
188 return ${"${class}::downgrade"};
194 # make Class->round_mode() work
196 my $class = ref($self) || $self || __PACKAGE__;
199 die ('div_scale must be greater than zero') if $_[0] < 0;
200 ${"${class}::div_scale"} = shift;
202 return ${"${class}::div_scale"};
207 # $x->accuracy($a); ref($x) $a
208 # $x->accuracy(); ref($x)
209 # Class->accuracy(); class
210 # Class->accuracy($a); class $a
213 my $class = ref($x) || $x || __PACKAGE__;
216 # need to set new value?
220 die ('accuracy must not be zero') if defined $a && $a == 0;
223 # $object->accuracy() or fallback to global
224 $x->bround($a) if defined $a;
225 $x->{_a} = $a; # set/overwrite, even if not rounded
226 $x->{_p} = undef; # clear P
231 ${"${class}::accuracy"} = $a;
232 ${"${class}::precision"} = undef; # clear P
234 return $a; # shortcut
239 # $object->accuracy() or fallback to global
240 return $x->{_a} || ${"${class}::accuracy"};
242 return ${"${class}::accuracy"};
247 # $x->precision($p); ref($x) $p
248 # $x->precision(); ref($x)
249 # Class->precision(); class
250 # Class->precision($p); class $p
253 my $class = ref($x) || $x || __PACKAGE__;
256 # need to set new value?
262 # $object->precision() or fallback to global
263 $x->bfround($p) if defined $p;
264 $x->{_p} = $p; # set/overwrite, even if not rounded
265 $x->{_a} = undef; # clear A
270 ${"${class}::precision"} = $p;
271 ${"${class}::accuracy"} = undef; # clear A
273 return $p; # shortcut
278 # $object->precision() or fallback to global
279 return $x->{_p} || ${"${class}::precision"};
281 return ${"${class}::precision"};
286 # return (later set?) configuration data as hash ref
287 my $class = shift || 'Math::BigInt';
293 lib_version => ${"${lib}::VERSION"},
297 qw/upgrade downgrade precision accuracy round_mode VERSION div_scale/)
299 $cfg->{lc($_)} = ${"${class}::$_"};
306 # select accuracy parameter based on precedence,
307 # used by bround() and bfround(), may return undef for scale (means no op)
308 my ($x,$s,$m,$scale,$mode) = @_;
309 $scale = $x->{_a} if !defined $scale;
310 $scale = $s if (!defined $scale);
311 $mode = $m if !defined $mode;
312 return ($scale,$mode);
317 # select precision parameter based on precedence,
318 # used by bround() and bfround(), may return undef for scale (means no op)
319 my ($x,$s,$m,$scale,$mode) = @_;
320 $scale = $x->{_p} if !defined $scale;
321 $scale = $s if (!defined $scale);
322 $mode = $m if !defined $mode;
323 return ($scale,$mode);
326 ##############################################################################
334 # if two arguments, the first one is the class to "swallow" subclasses
342 return unless ref($x); # only for objects
344 my $self = {}; bless $self,$c;
346 foreach my $k (keys %$x)
350 $self->{value} = $CALC->_copy($x->{value}); next;
352 if (!($r = ref($x->{$k})))
354 $self->{$k} = $x->{$k}; next;
358 $self->{$k} = \${$x->{$k}};
360 elsif ($r eq 'ARRAY')
362 $self->{$k} = [ @{$x->{$k}} ];
366 # only one level deep!
367 foreach my $h (keys %{$x->{$k}})
369 $self->{$k}->{$h} = $x->{$k}->{$h};
375 if ($xk->can('copy'))
377 $self->{$k} = $xk->copy();
381 $self->{$k} = $xk->new($xk);
390 # create a new BigInt object from a string or another BigInt object.
391 # see hash keys documented at top
393 # the argument could be an object, so avoid ||, && etc on it, this would
394 # cause costly overloaded code to be called. The only allowed ops are
397 my ($class,$wanted,$a,$p,$r) = @_;
399 # avoid numify-calls by not using || on $wanted!
400 return $class->bzero($a,$p) if !defined $wanted; # default to 0
401 return $class->copy($wanted,$a,$p,$r)
402 if ref($wanted) && $wanted->isa($class); # MBI or subclass
404 $class->import() if $IMPORT == 0; # make require work
406 my $self = bless {}, $class;
408 # shortcut for "normal" numbers
409 if ((!ref $wanted) && ($wanted =~ /^([+-]?)[1-9][0-9]*$/))
411 $self->{sign} = $1 || '+';
413 if ($wanted =~ /^[+-]/)
415 # remove sign without touching wanted
416 my $t = $wanted; $t =~ s/^[+-]//; $ref = \$t;
418 $self->{value} = $CALC->_new($ref);
420 if ( (defined $a) || (defined $p)
421 || (defined ${"${class}::precision"})
422 || (defined ${"${class}::accuracy"})
425 $self->round($a,$p,$r) unless (@_ == 4 && !defined $a && !defined $p);
430 # handle '+inf', '-inf' first
431 if ($wanted =~ /^[+-]?inf$/)
433 $self->{value} = $CALC->_zero();
434 $self->{sign} = $wanted; $self->{sign} = '+inf' if $self->{sign} eq 'inf';
437 # split str in m mantissa, e exponent, i integer, f fraction, v value, s sign
438 my ($mis,$miv,$mfv,$es,$ev) = _split(\$wanted);
441 die "$wanted is not a number initialized to $class" if !$NaNOK;
443 $self->{value} = $CALC->_zero();
444 $self->{sign} = $nan;
449 # _from_hex or _from_bin
450 $self->{value} = $mis->{value};
451 $self->{sign} = $mis->{sign};
452 return $self; # throw away $mis
454 # make integer from mantissa by adjusting exp, then convert to bigint
455 $self->{sign} = $$mis; # store sign
456 $self->{value} = $CALC->_zero(); # for all the NaN cases
457 my $e = int("$$es$$ev"); # exponent (avoid recursion)
460 my $diff = $e - CORE::length($$mfv);
461 if ($diff < 0) # Not integer
464 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
465 $self->{sign} = $nan;
469 # adjust fraction and add it to value
470 # print "diff > 0 $$miv\n";
471 $$miv = $$miv . ($$mfv . '0' x $diff);
476 if ($$mfv ne '') # e <= 0
478 # fraction and negative/zero E => NOI
479 #print "NOI 2 \$\$mfv '$$mfv'\n";
480 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
481 $self->{sign} = $nan;
485 # xE-y, and empty mfv
488 if ($$miv !~ s/0{$e}$//) # can strip so many zero's?
491 return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
492 $self->{sign} = $nan;
496 $self->{sign} = '+' if $$miv eq '0'; # normalize -0 => +0
497 $self->{value} = $CALC->_new($miv) if $self->{sign} =~ /^[+-]$/;
498 # if any of the globals is set, use them to round and store them inside $self
499 # do not round for new($x,undef,undef) since that is used by MBF to signal
501 $self->round($a,$p,$r) unless @_ == 4 && !defined $a && !defined $p;
507 # create a bigint 'NaN', if given a BigInt, set it to 'NaN'
509 $self = $class if !defined $self;
512 my $c = $self; $self = {}; bless $self, $c;
514 $self->import() if $IMPORT == 0; # make require work
515 return if $self->modify('bnan');
517 if ($self->can('_bnan'))
519 # use subclass to initialize
524 # otherwise do our own thing
525 $self->{value} = $CALC->_zero();
527 $self->{value} = $CALC->_zero();
528 $self->{sign} = $nan;
529 delete $self->{_a}; delete $self->{_p}; # rounding NaN is silly
535 # create a bigint '+-inf', if given a BigInt, set it to '+-inf'
536 # the sign is either '+', or if given, used from there
538 my $sign = shift; $sign = '+' if !defined $sign || $sign !~ /^-(inf)?$/;
539 $self = $class if !defined $self;
542 my $c = $self; $self = {}; bless $self, $c;
544 $self->import() if $IMPORT == 0; # make require work
545 return if $self->modify('binf');
547 if ($self->can('_binf'))
549 # use subclass to initialize
554 # otherwise do our own thing
555 $self->{value} = $CALC->_zero();
557 $sign = $sign . 'inf' if $sign !~ /inf$/; # - => -inf
558 $self->{sign} = $sign;
559 ($self->{_a},$self->{_p}) = @_; # take over requested rounding
565 # create a bigint '+0', if given a BigInt, set it to 0
567 $self = $class if !defined $self;
571 my $c = $self; $self = {}; bless $self, $c;
573 $self->import() if $IMPORT == 0; # make require work
574 return if $self->modify('bzero');
576 if ($self->can('_bzero'))
578 # use subclass to initialize
583 # otherwise do our own thing
584 $self->{value} = $CALC->_zero();
590 if (defined $self->{_a} && defined $_[0] && $_[0] > $self->{_a});
592 if (defined $self->{_p} && defined $_[1] && $_[1] < $self->{_p});
599 # create a bigint '+1' (or -1 if given sign '-'),
600 # if given a BigInt, set it to +1 or -1, respecively
602 my $sign = shift; $sign = '+' if !defined $sign || $sign ne '-';
603 $self = $class if !defined $self;
607 my $c = $self; $self = {}; bless $self, $c;
609 $self->import() if $IMPORT == 0; # make require work
610 return if $self->modify('bone');
612 if ($self->can('_bone'))
614 # use subclass to initialize
619 # otherwise do our own thing
620 $self->{value} = $CALC->_one();
622 $self->{sign} = $sign;
626 if (defined $self->{_a} && defined $_[0] && $_[0] > $self->{_a});
628 if (defined $self->{_p} && defined $_[1] && $_[1] < $self->{_p});
633 ##############################################################################
634 # string conversation
638 # (ref to BFLOAT or num_str ) return num_str
639 # Convert number from internal format to scientific string format.
640 # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
641 my $x = shift; $class = ref($x) || $x; $x = $class->new(shift) if !ref($x);
642 # my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
644 if ($x->{sign} !~ /^[+-]$/)
646 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
649 my ($m,$e) = $x->parts();
650 # e can only be positive
652 # MBF: my $s = $e->{sign}; $s = '' if $s eq '-'; my $sep = 'e'.$s;
653 return $m->bstr().$sign.$e->bstr();
658 # make a string from bigint object
659 my $x = shift; $class = ref($x) || $x; $x = $class->new(shift) if !ref($x);
660 # my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
662 if ($x->{sign} !~ /^[+-]$/)
664 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
667 my $es = ''; $es = $x->{sign} if $x->{sign} eq '-';
668 return $es.${$CALC->_str($x->{value})};
673 # Make a "normal" scalar from a BigInt object
674 my $x = shift; $x = $class->new($x) unless ref $x;
675 return $x->{sign} if $x->{sign} !~ /^[+-]$/;
676 my $num = $CALC->_num($x->{value});
677 return -$num if $x->{sign} eq '-';
681 ##############################################################################
682 # public stuff (usually prefixed with "b")
686 # return the sign of the number: +/-/-inf/+inf/NaN
687 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
692 sub _find_round_parameters
694 # After any operation or when calling round(), the result is rounded by
695 # regarding the A & P from arguments, local parameters, or globals.
697 # This procedure finds the round parameters, but it is for speed reasons
698 # duplicated in round. Otherwise, it is tested by the testsuite and used
701 my ($self,$a,$p,$r,@args) = @_;
702 # $a accuracy, if given by caller
703 # $p precision, if given by caller
704 # $r round_mode, if given by caller
705 # @args all 'other' arguments (0 for unary, 1 for binary ops)
707 # leave bigfloat parts alone
708 return ($self) if exists $self->{_f} && $self->{_f} & MB_NEVER_ROUND != 0;
710 my $c = ref($self); # find out class of argument(s)
713 # now pick $a or $p, but only if we have got "arguments"
716 foreach ($self,@args)
718 # take the defined one, or if both defined, the one that is smaller
719 $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
724 # even if $a is defined, take $p, to signal error for both defined
725 foreach ($self,@args)
727 # take the defined one, or if both defined, the one that is bigger
729 $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
732 # if still none defined, use globals (#2)
733 $a = ${"$c\::accuracy"} unless defined $a;
734 $p = ${"$c\::precision"} unless defined $p;
737 return ($self) unless defined $a || defined $p; # early out
739 # set A and set P is an fatal error
740 return ($self->bnan()) if defined $a && defined $p;
742 $r = ${"$c\::round_mode"} unless defined $r;
743 die "Unknown round mode '$r'" if $r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/;
745 return ($self,$a,$p,$r);
750 # Round $self according to given parameters, or given second argument's
751 # parameters or global defaults
753 # for speed reasons, _find_round_parameters is embeded here:
755 my ($self,$a,$p,$r,@args) = @_;
756 # $a accuracy, if given by caller
757 # $p precision, if given by caller
758 # $r round_mode, if given by caller
759 # @args all 'other' arguments (0 for unary, 1 for binary ops)
761 # leave bigfloat parts alone
762 return ($self) if exists $self->{_f} && $self->{_f} & MB_NEVER_ROUND != 0;
764 my $c = ref($self); # find out class of argument(s)
767 # now pick $a or $p, but only if we have got "arguments"
770 foreach ($self,@args)
772 # take the defined one, or if both defined, the one that is smaller
773 $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
778 # even if $a is defined, take $p, to signal error for both defined
779 foreach ($self,@args)
781 # take the defined one, or if both defined, the one that is bigger
783 $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
786 # if still none defined, use globals (#2)
787 $a = ${"$c\::accuracy"} unless defined $a;
788 $p = ${"$c\::precision"} unless defined $p;
791 return $self unless defined $a || defined $p; # early out
793 # set A and set P is an fatal error
794 return $self->bnan() if defined $a && defined $p;
796 $r = ${"$c\::round_mode"} unless defined $r;
797 die "Unknown round mode '$r'" if $r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/;
799 # now round, by calling either fround or ffround:
802 $self->bround($a,$r) if !defined $self->{_a} || $self->{_a} >= $a;
804 else # both can't be undefined due to early out
806 $self->bfround($p,$r) if !defined $self->{_p} || $self->{_p} <= $p;
808 $self->bnorm(); # after round, normalize
813 # (numstr or BINT) return BINT
814 # Normalize number -- no-op here
815 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
821 # (BINT or num_str) return BINT
822 # make number absolute, or return absolute BINT from string
823 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
825 return $x if $x->modify('babs');
826 # post-normalized abs for internal use (does nothing for NaN)
827 $x->{sign} =~ s/^-/+/;
833 # (BINT or num_str) return BINT
834 # negate number or make a negated number from string
835 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
837 return $x if $x->modify('bneg');
839 # for +0 dont negate (to have always normalized)
840 $x->{sign} =~ tr/+-/-+/ if !$x->is_zero(); # does nothing for NaN
846 # Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort)
847 # (BINT or num_str, BINT or num_str) return cond_code
848 my ($self,$x,$y) = objectify(2,@_);
850 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
852 # handle +-inf and NaN
853 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
854 return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
855 return +1 if $x->{sign} eq '+inf';
856 return -1 if $x->{sign} eq '-inf';
857 return -1 if $y->{sign} eq '+inf';
860 # check sign for speed first
861 return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y
862 return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0
865 my $xz = $x->is_zero();
866 my $yz = $y->is_zero();
867 return 0 if $xz && $yz; # 0 <=> 0
868 return -1 if $xz && $y->{sign} eq '+'; # 0 <=> +y
869 return 1 if $yz && $x->{sign} eq '+'; # +x <=> 0
871 # post-normalized compare for internal use (honors signs)
872 if ($x->{sign} eq '+')
875 return $CALC->_acmp($x->{value},$y->{value});
879 $CALC->_acmp($y->{value},$x->{value}); # swaped (lib does only 0,1,-1)
884 # Compares 2 values, ignoring their signs.
885 # Returns one of undef, <0, =0, >0. (suitable for sort)
886 # (BINT, BINT) return cond_code
887 my ($self,$x,$y) = objectify(2,@_);
889 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
891 # handle +-inf and NaN
892 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
893 return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
894 return +1; # inf is always bigger
896 $CALC->_acmp($x->{value},$y->{value}); # lib does only 0,1,-1
901 # add second arg (BINT or string) to first (BINT) (modifies first)
902 # return result as BINT
903 my ($self,$x,$y,@r) = objectify(2,@_);
905 return $x if $x->modify('badd');
906 # print "mbi badd ",join(' ',caller()),"\n";
907 # print "upgrade => ",$upgrade||'undef',
908 # " \$x (",ref($x),") \$y (",ref($y),")\n";
909 return $upgrade->badd($x,$y,@r) if defined $upgrade &&
910 ((ref($x) eq $upgrade) || (ref($y) eq $upgrade));
911 # print "still badd\n";
913 $r[3] = $y; # no push!
914 # inf and NaN handling
915 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
918 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
920 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
922 # +inf++inf or -inf+-inf => same, rest is NaN
923 return $x if $x->{sign} eq $y->{sign};
926 # +-inf + something => +inf
927 # something +-inf => +-inf
928 $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
932 my ($sx, $sy) = ( $x->{sign}, $y->{sign} ); # get signs
936 $x->{value} = $CALC->_add($x->{value},$y->{value}); # same sign, abs add
941 my $a = $CALC->_acmp ($y->{value},$x->{value}); # absolute compare
944 #print "swapped sub (a=$a)\n";
945 $x->{value} = $CALC->_sub($y->{value},$x->{value},1); # abs sub w/ swap
950 # speedup, if equal, set result to 0
951 #print "equal sub, result = 0\n";
952 $x->{value} = $CALC->_zero();
957 #print "unswapped sub (a=$a)\n";
958 $x->{value} = $CALC->_sub($x->{value}, $y->{value}); # abs sub
967 # (BINT or num_str, BINT or num_str) return num_str
968 # subtract second arg from first, modify first
969 my ($self,$x,$y,@r) = objectify(2,@_);
971 return $x if $x->modify('bsub');
972 # return $upgrade->badd($x,$y,@r) if defined $upgrade &&
973 # ((ref($x) eq $upgrade) || (ref($y) eq $upgrade));
977 return $x->round(@r);
980 $y->{sign} =~ tr/+\-/-+/; # does nothing for NaN
981 $x->badd($y,@r); # badd does not leave internal zeros
982 $y->{sign} =~ tr/+\-/-+/; # refix $y (does nothing for NaN)
983 $x; # already rounded by badd() or no round necc.
988 # increment arg by one
989 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
990 return $x if $x->modify('binc');
992 if ($x->{sign} eq '+')
994 $x->{value} = $CALC->_inc($x->{value});
995 return $x->round($a,$p,$r);
997 elsif ($x->{sign} eq '-')
999 $x->{value} = $CALC->_dec($x->{value});
1000 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0
1001 return $x->round($a,$p,$r);
1003 # inf, nan handling etc
1004 $x->badd($self->__one(),$a,$p,$r); # badd does round
1009 # decrement arg by one
1010 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1011 return $x if $x->modify('bdec');
1013 my $zero = $CALC->_is_zero($x->{value}) && $x->{sign} eq '+';
1015 if (($x->{sign} eq '-') || $zero)
1017 $x->{value} = $CALC->_inc($x->{value});
1018 $x->{sign} = '-' if $zero; # 0 => 1 => -1
1019 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0
1020 return $x->round($a,$p,$r);
1023 elsif ($x->{sign} eq '+')
1025 $x->{value} = $CALC->_dec($x->{value});
1026 return $x->round($a,$p,$r);
1028 # inf, nan handling etc
1029 $x->badd($self->__one('-'),$a,$p,$r); # badd does round
1034 # not implemented yet
1035 my ($self,$x,$base,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1037 return $upgrade->blog($x,$base,$a,$p,$r) if defined $upgrade;
1044 # (BINT or num_str, BINT or num_str) return BINT
1045 # does not modify arguments, but returns new object
1046 # Lowest Common Multiplicator
1048 my $y = shift; my ($x);
1055 $x = $class->new($y);
1057 while (@_) { $x = __lcm($x,shift); }
1063 # (BINT or num_str, BINT or num_str) return BINT
1064 # does not modify arguments, but returns new object
1065 # GCD -- Euclids algorithm, variant C (Knuth Vol 3, pg 341 ff)
1068 $y = __PACKAGE__->new($y) if !ref($y);
1070 my $x = $y->copy(); # keep arguments
1071 if ($CALC->can('_gcd'))
1075 $y = shift; $y = $self->new($y) if !ref($y);
1076 next if $y->is_zero();
1077 return $x->bnan() if $y->{sign} !~ /^[+-]$/; # y NaN?
1078 $x->{value} = $CALC->_gcd($x->{value},$y->{value}); last if $x->is_one();
1085 $y = shift; $y = $self->new($y) if !ref($y);
1086 $x = __gcd($x,$y->copy()); last if $x->is_one(); # _gcd handles NaN
1094 # (num_str or BINT) return BINT
1095 # represent ~x as twos-complement number
1096 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1097 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
1099 return $x if $x->modify('bnot');
1100 $x->bneg()->bdec(); # bdec already does round
1103 # is_foo test routines
1107 # return true if arg (BINT or num_str) is zero (array '+', '0')
1108 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1109 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1111 return 0 if $x->{sign} !~ /^\+$/; # -, NaN & +-inf aren't
1112 $CALC->_is_zero($x->{value});
1117 # return true if arg (BINT or num_str) is NaN
1118 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1120 return 1 if $x->{sign} eq $nan;
1126 # return true if arg (BINT or num_str) is +-inf
1127 my ($self,$x,$sign) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1129 $sign = '' if !defined $sign;
1130 return 1 if $sign eq $x->{sign}; # match ("+inf" eq "+inf")
1131 return 0 if $sign !~ /^([+-]|)$/;
1135 return 1 if ($x->{sign} =~ /^[+-]inf$/);
1138 $sign = quotemeta($sign.'inf');
1139 return 1 if ($x->{sign} =~ /^$sign$/);
1145 # return true if arg (BINT or num_str) is +1
1146 # or -1 if sign is given
1147 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1148 my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
1150 $sign = '' if !defined $sign; $sign = '+' if $sign ne '-';
1152 return 0 if $x->{sign} ne $sign; # -1 != +1, NaN, +-inf aren't either
1153 $CALC->_is_one($x->{value});
1158 # return true when arg (BINT or num_str) is odd, false for even
1159 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1160 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1162 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
1163 $CALC->_is_odd($x->{value});
1168 # return true when arg (BINT or num_str) is even, false for odd
1169 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1170 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1172 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
1173 $CALC->_is_even($x->{value});
1178 # return true when arg (BINT or num_str) is positive (>= 0)
1179 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1180 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1182 return 1 if $x->{sign} =~ /^\+/;
1188 # return true when arg (BINT or num_str) is negative (< 0)
1189 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1190 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1192 return 1 if ($x->{sign} =~ /^-/);
1198 # return true when arg (BINT or num_str) is an integer
1199 # always true for BigInt, but different for Floats
1200 # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
1201 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1203 $x->{sign} =~ /^[+-]$/ ? 1 : 0; # inf/-inf/NaN aren't
1206 ###############################################################################
1210 # multiply two numbers -- stolen from Knuth Vol 2 pg 233
1211 # (BINT or num_str, BINT or num_str) return BINT
1212 my ($self,$x,$y,@r) = objectify(2,@_);
1214 return $x if $x->modify('bmul');
1216 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
1219 if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
1221 return $x->bnan() if $x->is_zero() || $y->is_zero();
1222 # result will always be +-inf:
1223 # +inf * +/+inf => +inf, -inf * -/-inf => +inf
1224 # +inf * -/-inf => -inf, -inf * +/+inf => -inf
1225 return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
1226 return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
1227 return $x->binf('-');
1230 return $upgrade->bmul($x,$y,@r)
1231 if defined $upgrade && $y->isa($upgrade);
1233 $r[3] = $y; # no push here
1235 $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
1237 $x->{value} = $CALC->_mul($x->{value},$y->{value}); # do actual math
1238 $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # no -0
1244 # helper function that handles +-inf cases for bdiv()/bmod() to reuse code
1245 my ($self,$x,$y) = @_;
1247 # NaN if x == NaN or y == NaN or x==y==0
1248 return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan()
1249 if (($x->is_nan() || $y->is_nan()) ||
1250 ($x->is_zero() && $y->is_zero()));
1252 # +-inf / +-inf == NaN, reminder also NaN
1253 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
1255 return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan();
1257 # x / +-inf => 0, remainder x (works even if x == 0)
1258 if ($y->{sign} =~ /^[+-]inf$/)
1260 my $t = $x->copy(); # binf clobbers up $x
1261 return wantarray ? ($x->bzero(),$t) : $x->bzero()
1264 # 5 / 0 => +inf, -6 / 0 => -inf
1265 # +inf / 0 = inf, inf, and -inf / 0 => -inf, -inf
1266 # exception: -8 / 0 has remainder -8, not 8
1267 # exception: -inf / 0 has remainder -inf, not inf
1270 # +-inf / 0 => special case for -inf
1271 return wantarray ? ($x,$x->copy()) : $x if $x->is_inf();
1272 if (!$x->is_zero() && !$x->is_inf())
1274 my $t = $x->copy(); # binf clobbers up $x
1276 ($x->binf($x->{sign}),$t) : $x->binf($x->{sign})
1280 # last case: +-inf / ordinary number
1282 $sign = '-inf' if substr($x->{sign},0,1) ne $y->{sign};
1284 return wantarray ? ($x,$self->bzero()) : $x;
1289 # (dividend: BINT or num_str, divisor: BINT or num_str) return
1290 # (BINT,BINT) (quo,rem) or BINT (only rem)
1291 my ($self,$x,$y,@r) = objectify(2,@_);
1293 return $x if $x->modify('bdiv');
1295 return $self->_div_inf($x,$y)
1296 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
1298 return $upgrade->bdiv($upgrade->new($x),$y,@r)
1299 if defined $upgrade && $y->isa($upgrade);
1301 $r[3] = $y; # no push!
1305 wantarray ? ($x->round(@r),$self->bzero(@r)):$x->round(@r) if $x->is_zero();
1307 # Is $x in the interval [0, $y) (aka $x <= $y) ?
1308 my $cmp = $CALC->_acmp($x->{value},$y->{value});
1309 if (($cmp < 0) and (($x->{sign} eq $y->{sign}) or !wantarray))
1311 return $upgrade->bdiv($upgrade->new($x),$upgrade->new($y),@r)
1312 if defined $upgrade;
1314 return $x->bzero()->round(@r) unless wantarray;
1315 my $t = $x->copy(); # make copy first, because $x->bzero() clobbers $x
1316 return ($x->bzero()->round(@r),$t);
1320 # shortcut, both are the same, so set to +/- 1
1321 $x->__one( ($x->{sign} ne $y->{sign} ? '-' : '+') );
1322 return $x unless wantarray;
1323 return ($x->round(@r),$self->bzero(@r));
1325 return $upgrade->bdiv($upgrade->new($x),$upgrade->new($y),@r)
1326 if defined $upgrade;
1328 # calc new sign and in case $y == +/- 1, return $x
1329 my $xsign = $x->{sign}; # keep
1330 $x->{sign} = ($x->{sign} ne $y->{sign} ? '-' : '+');
1331 # check for / +-1 (cant use $y->is_one due to '-'
1332 if ($CALC->_is_one($y->{value}))
1334 return wantarray ? ($x->round(@r),$self->bzero(@r)) : $x->round(@r);
1339 my $rem = $self->bzero();
1340 ($x->{value},$rem->{value}) = $CALC->_div($x->{value},$y->{value});
1341 $x->{sign} = '+' if $CALC->_is_zero($x->{value});
1343 if (! $CALC->_is_zero($rem->{value}))
1345 $rem->{sign} = $y->{sign};
1346 $rem = $y-$rem if $xsign ne $y->{sign}; # one of them '-'
1350 $rem->{sign} = '+'; # dont leave -0
1356 $x->{value} = $CALC->_div($x->{value},$y->{value});
1357 $x->{sign} = '+' if $CALC->_is_zero($x->{value});
1363 # modulus (or remainder)
1364 # (BINT or num_str, BINT or num_str) return BINT
1365 my ($self,$x,$y,@r) = objectify(2,@_);
1367 return $x if $x->modify('bmod');
1368 $r[3] = $y; # no push!
1369 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero())
1371 my ($d,$r) = $self->_div_inf($x,$y);
1372 return $r->round(@r);
1375 if ($CALC->can('_mod'))
1377 # calc new sign and in case $y == +/- 1, return $x
1378 $x->{value} = $CALC->_mod($x->{value},$y->{value});
1379 if (!$CALC->_is_zero($x->{value}))
1381 my $xsign = $x->{sign};
1382 $x->{sign} = $y->{sign};
1383 $x = $y-$x if $xsign ne $y->{sign}; # one of them '-'
1387 $x->{sign} = '+'; # dont leave -0
1389 return $x->round(@r);
1391 my ($t,$rem) = $self->bdiv($x->copy(),$y,@r); # slow way (also rounds)
1393 foreach (qw/value sign _a _p/)
1395 $x->{$_} = $rem->{$_};
1402 # (BINT or num_str, BINT or num_str) return BINT
1403 # compute factorial numbers
1404 # modifies first argument
1405 my ($self,$x,@r) = objectify(1,@_);
1407 return $x if $x->modify('bfac');
1409 return $x->bnan() if $x->{sign} ne '+'; # inf, NnN, <0 etc => NaN
1410 return $x->bone(@r) if $x->is_zero() || $x->is_one(); # 0 or 1 => 1
1412 if ($CALC->can('_fac'))
1414 $x->{value} = $CALC->_fac($x->{value});
1415 return $x->round(@r);
1420 my $f = $self->new(2);
1421 while ($f->bacmp($n) < 0)
1423 $x->bmul($f); $f->binc();
1425 $x->bmul($f); # last step
1426 $x->round(@r); # round
1431 # (BINT or num_str, BINT or num_str) return BINT
1432 # compute power of two numbers -- stolen from Knuth Vol 2 pg 233
1433 # modifies first argument
1434 my ($self,$x,$y,@r) = objectify(2,@_);
1436 return $x if $x->modify('bpow');
1438 return $upgrade->bpow($upgrade->new($x),$y,@r)
1439 if defined $upgrade && $y->isa($upgrade);
1441 $r[3] = $y; # no push!
1442 return $x if $x->{sign} =~ /^[+-]inf$/; # -inf/+inf ** x
1443 return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
1444 return $x->bone(@r) if $y->is_zero();
1445 return $x->round(@r) if $x->is_one() || $y->is_one();
1446 if ($x->{sign} eq '-' && $CALC->_is_one($x->{value}))
1448 # if $x == -1 and odd/even y => +1/-1
1449 return $y->is_odd() ? $x->round(@r) : $x->babs()->round(@r);
1450 # my Casio FX-5500L has a bug here: -1 ** 2 is -1, but -1 * -1 is 1;
1452 # 1 ** -y => 1 / (1 ** |y|)
1453 # so do test for negative $y after above's clause
1454 return $x->bnan() if $y->{sign} eq '-';
1455 return $x->round(@r) if $x->is_zero(); # 0**y => 0 (if not y <= 0)
1457 if ($CALC->can('_pow'))
1459 $x->{value} = $CALC->_pow($x->{value},$y->{value});
1460 return $x->round(@r);
1463 # based on the assumption that shifting in base 10 is fast, and that mul
1464 # works faster if numbers are small: we count trailing zeros (this step is
1465 # O(1)..O(N), but in case of O(N) we save much more time due to this),
1466 # stripping them out of the multiplication, and add $count * $y zeros
1467 # afterwards like this:
1468 # 300 ** 3 == 300*300*300 == 3*3*3 . '0' x 2 * 3 == 27 . '0' x 6
1469 # creates deep recursion?
1470 # my $zeros = $x->_trailing_zeros();
1473 # $x->brsft($zeros,10); # remove zeros
1474 # $x->bpow($y); # recursion (will not branch into here again)
1475 # $zeros = $y * $zeros; # real number of zeros to add
1476 # $x->blsft($zeros,10);
1477 # return $x->round($a,$p,$r);
1480 my $pow2 = $self->__one();
1481 my $y1 = $class->new($y);
1482 my $two = $self->new(2);
1483 while (!$y1->is_one())
1485 $pow2->bmul($x) if $y1->is_odd();
1489 $x->bmul($pow2) unless $pow2->is_one();
1495 # (BINT or num_str, BINT or num_str) return BINT
1496 # compute x << y, base n, y >= 0
1497 my ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
1499 return $x if $x->modify('blsft');
1500 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1501 return $x->round($a,$p,$r) if $y->is_zero();
1503 $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
1505 my $t; $t = $CALC->_lsft($x->{value},$y->{value},$n) if $CALC->can('_lsft');
1508 $x->{value} = $t; return $x->round($a,$p,$r);
1511 return $x->bmul( $self->bpow($n, $y, $a, $p, $r), $a, $p, $r );
1516 # (BINT or num_str, BINT or num_str) return BINT
1517 # compute x >> y, base n, y >= 0
1518 my ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
1520 return $x if $x->modify('brsft');
1521 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1522 return $x->round($a,$p,$r) if $y->is_zero();
1523 return $x->bzero($a,$p,$r) if $x->is_zero(); # 0 => 0
1525 $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
1527 # this only works for negative numbers when shifting in base 2
1528 if (($x->{sign} eq '-') && ($n == 2))
1530 return $x->round($a,$p,$r) if $x->is_one('-'); # -1 => -1
1533 # although this is O(N*N) in calc (as_bin!) it is O(N) in Pari et al
1534 # but perhaps there is a better emulation for two's complement shift...
1535 # if $y != 1, we must simulate it by doing:
1536 # convert to bin, flip all bits, shift, and be done
1537 $x->binc(); # -3 => -2
1538 my $bin = $x->as_bin();
1539 $bin =~ s/^-0b//; # strip '-0b' prefix
1540 $bin =~ tr/10/01/; # flip bits
1542 if (length($bin) <= $y)
1544 $bin = '0'; # shifting to far right creates -1
1545 # 0, because later increment makes
1546 # that 1, attached '-' makes it '-1'
1547 # because -1 >> x == -1 !
1551 $bin =~ s/.{$y}$//; # cut off at the right side
1552 $bin = '1' . $bin; # extend left side by one dummy '1'
1553 $bin =~ tr/10/01/; # flip bits back
1555 my $res = $self->new('0b'.$bin); # add prefix and convert back
1556 $res->binc(); # remember to increment
1557 $x->{value} = $res->{value}; # take over value
1558 return $x->round($a,$p,$r); # we are done now, magic, isn't?
1560 $x->bdec(); # n == 2, but $y == 1: this fixes it
1563 my $t; $t = $CALC->_rsft($x->{value},$y->{value},$n) if $CALC->can('_rsft');
1567 return $x->round($a,$p,$r);
1570 $x->bdiv($self->bpow($n,$y, $a,$p,$r), $a,$p,$r);
1576 #(BINT or num_str, BINT or num_str) return BINT
1578 my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1580 return $x if $x->modify('band');
1582 local $Math::BigInt::upgrade = undef;
1584 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1585 return $x->bzero() if $y->is_zero() || $x->is_zero();
1587 my $sign = 0; # sign of result
1588 $sign = 1 if ($x->{sign} eq '-') && ($y->{sign} eq '-');
1589 my $sx = 1; $sx = -1 if $x->{sign} eq '-';
1590 my $sy = 1; $sy = -1 if $y->{sign} eq '-';
1592 if ($CALC->can('_and') && $sx == 1 && $sy == 1)
1594 $x->{value} = $CALC->_and($x->{value},$y->{value});
1595 return $x->round($a,$p,$r);
1598 my $m = $self->bone(); my ($xr,$yr);
1599 my $x10000 = $self->new (0x1000);
1600 my $y1 = copy(ref($x),$y); # make copy
1601 $y1->babs(); # and positive
1602 my $x1 = $x->copy()->babs(); $x->bzero(); # modify x in place!
1603 use integer; # need this for negative bools
1604 while (!$x1->is_zero() && !$y1->is_zero())
1606 ($x1, $xr) = bdiv($x1, $x10000);
1607 ($y1, $yr) = bdiv($y1, $x10000);
1608 # make both op's numbers!
1609 $x->badd( bmul( $class->new(
1610 abs($sx*int($xr->numify()) & $sy*int($yr->numify()))),
1614 $x->bneg() if $sign;
1615 return $x->round($a,$p,$r);
1620 #(BINT or num_str, BINT or num_str) return BINT
1622 my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1624 return $x if $x->modify('bior');
1626 local $Math::BigInt::upgrade = undef;
1628 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1629 return $x if $y->is_zero();
1631 my $sign = 0; # sign of result
1632 $sign = 1 if ($x->{sign} eq '-') || ($y->{sign} eq '-');
1633 my $sx = 1; $sx = -1 if $x->{sign} eq '-';
1634 my $sy = 1; $sy = -1 if $y->{sign} eq '-';
1636 # don't use lib for negative values
1637 if ($CALC->can('_or') && $sx == 1 && $sy == 1)
1639 $x->{value} = $CALC->_or($x->{value},$y->{value});
1640 return $x->round($a,$p,$r);
1643 my $m = $self->bone(); my ($xr,$yr);
1644 my $x10000 = $self->new(0x10000);
1645 my $y1 = copy(ref($x),$y); # make copy
1646 $y1->babs(); # and positive
1647 my $x1 = $x->copy()->babs(); $x->bzero(); # modify x in place!
1648 use integer; # need this for negative bools
1649 while (!$x1->is_zero() || !$y1->is_zero())
1651 ($x1, $xr) = bdiv($x1,$x10000);
1652 ($y1, $yr) = bdiv($y1,$x10000);
1653 # make both op's numbers!
1654 $x->badd( bmul( $class->new(
1655 abs($sx*int($xr->numify()) | $sy*int($yr->numify()))),
1659 $x->bneg() if $sign;
1660 return $x->round($a,$p,$r);
1665 #(BINT or num_str, BINT or num_str) return BINT
1667 my ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1669 return $x if $x->modify('bxor');
1671 local $Math::BigInt::upgrade = undef;
1673 return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
1674 return $x if $y->is_zero();
1676 my $sign = 0; # sign of result
1677 $sign = 1 if $x->{sign} ne $y->{sign};
1678 my $sx = 1; $sx = -1 if $x->{sign} eq '-';
1679 my $sy = 1; $sy = -1 if $y->{sign} eq '-';
1681 # don't use lib for negative values
1682 if ($CALC->can('_xor') && $sx == 1 && $sy == 1)
1684 $x->{value} = $CALC->_xor($x->{value},$y->{value});
1685 return $x->round($a,$p,$r);
1688 my $m = $self->bone(); my ($xr,$yr);
1689 my $x10000 = $self->new(0x10000);
1690 my $y1 = copy(ref($x),$y); # make copy
1691 $y1->babs(); # and positive
1692 my $x1 = $x->copy()->babs(); $x->bzero(); # modify x in place!
1693 use integer; # need this for negative bools
1694 while (!$x1->is_zero() || !$y1->is_zero())
1696 ($x1, $xr) = bdiv($x1, $x10000);
1697 ($y1, $yr) = bdiv($y1, $x10000);
1698 # make both op's numbers!
1699 $x->badd( bmul( $class->new(
1700 abs($sx*int($xr->numify()) ^ $sy*int($yr->numify()))),
1704 $x->bneg() if $sign;
1705 return $x->round($a,$p,$r);
1710 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1712 my $e = $CALC->_len($x->{value});
1713 return wantarray ? ($e,0) : $e;
1718 # return the nth decimal digit, negative values count backward, 0 is right
1719 my ($self,$x,$n) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1720 $n = 0 if !defined $n;
1722 $CALC->_digit($x->{value},$n);
1727 # return the amount of trailing zeros in $x
1729 $x = $class->new($x) unless ref $x;
1731 return 0 if $x->is_zero() || $x->is_odd() || $x->{sign} !~ /^[+-]$/;
1733 return $CALC->_zeros($x->{value}) if $CALC->can('_zeros');
1735 # if not: since we do not know underlying internal representation:
1736 my $es = "$x"; $es =~ /([0]*)$/;
1737 return 0 if !defined $1; # no zeros
1738 return CORE::length("$1"); # as string, not as +0!
1743 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1745 return $x if $x->modify('bsqrt');
1747 return $x->bnan() if $x->{sign} ne '+'; # -x or inf or NaN => NaN
1748 return $x->bzero($a,$p) if $x->is_zero(); # 0 => 0
1749 return $x->round($a,$p,$r) if $x->is_one(); # 1 => 1
1751 return $upgrade->bsqrt($x,$a,$p,$r) if defined $upgrade;
1753 if ($CALC->can('_sqrt'))
1755 $x->{value} = $CALC->_sqrt($x->{value});
1756 return $x->round($a,$p,$r);
1759 return $x->bone($a,$p) if $x < 4; # 2,3 => 1
1761 my $l = int($x->length()/2);
1763 $x->bone(); # keep ref($x), but modify it
1766 my $last = $self->bzero();
1767 my $two = $self->new(2);
1768 my $lastlast = $x+$two;
1769 while ($last != $x && $lastlast != $x)
1771 $lastlast = $last; $last = $x;
1775 $x-- if $x * $x > $y; # overshot?
1776 $x->round($a,$p,$r);
1781 # return a copy of the exponent (here always 0, NaN or 1 for $m == 0)
1782 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1784 if ($x->{sign} !~ /^[+-]$/)
1786 my $s = $x->{sign}; $s =~ s/^[+-]//;
1787 return $self->new($s); # -inf,+inf => inf
1789 my $e = $class->bzero();
1790 return $e->binc() if $x->is_zero();
1791 $e += $x->_trailing_zeros();
1797 # return the mantissa (compatible to Math::BigFloat, e.g. reduced)
1798 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1800 if ($x->{sign} !~ /^[+-]$/)
1802 return $self->new($x->{sign}); # keep + or - sign
1805 # that's inefficient
1806 my $zeros = $m->_trailing_zeros();
1807 $m->brsft($zeros,10) if $zeros != 0;
1808 # $m /= 10 ** $zeros if $zeros != 0;
1814 # return a copy of both the exponent and the mantissa
1815 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
1817 return ($x->mantissa(),$x->exponent());
1820 ##############################################################################
1821 # rounding functions
1825 # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
1826 # $n == 0 || $n == 1 => round to integer
1827 my $x = shift; $x = $class->new($x) unless ref $x;
1828 my ($scale,$mode) = $x->_scale_p($x->precision(),$x->round_mode(),@_);
1829 return $x if !defined $scale; # no-op
1830 return $x if $x->modify('bfround');
1832 # no-op for BigInts if $n <= 0
1835 $x->{_a} = undef; # clear an eventual set A
1836 $x->{_p} = $scale; return $x;
1839 $x->bround( $x->length()-$scale, $mode);
1840 $x->{_a} = undef; # bround sets {_a}
1841 $x->{_p} = $scale; # so correct it
1845 sub _scan_for_nonzero
1851 my $len = $x->length();
1852 return 0 if $len == 1; # '5' is trailed by invisible zeros
1853 my $follow = $pad - 1;
1854 return 0 if $follow > $len || $follow < 1;
1856 # since we do not know underlying represention of $x, use decimal string
1857 #my $r = substr ($$xs,-$follow);
1858 my $r = substr ("$x",-$follow);
1859 return 1 if $r =~ /[^0]/; return 0;
1864 # to make life easier for switch between MBF and MBI (autoload fxxx()
1865 # like MBF does for bxxx()?)
1867 return $x->bround(@_);
1872 # accuracy: +$n preserve $n digits from left,
1873 # -$n preserve $n digits from right (f.i. for 0.1234 style in MBF)
1875 # and overwrite the rest with 0's, return normalized number
1876 # do not return $x->bnorm(), but $x
1878 my $x = shift; $x = $class->new($x) unless ref $x;
1879 my ($scale,$mode) = $x->_scale_a($x->accuracy(),$x->round_mode(),@_);
1880 return $x if !defined $scale; # no-op
1881 return $x if $x->modify('bround');
1883 if ($x->is_zero() || $scale == 0)
1885 $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
1888 return $x if $x->{sign} !~ /^[+-]$/; # inf, NaN
1890 # we have fewer digits than we want to scale to
1891 my $len = $x->length();
1892 # scale < 0, but > -len (not >=!)
1893 if (($scale < 0 && $scale < -$len-1) || ($scale >= $len))
1895 $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
1899 # count of 0's to pad, from left (+) or right (-): 9 - +6 => 3, or |-6| => 6
1900 my ($pad,$digit_round,$digit_after);
1901 $pad = $len - $scale;
1902 $pad = abs($scale-1) if $scale < 0;
1904 # do not use digit(), it is costly for binary => decimal
1906 my $xs = $CALC->_str($x->{value});
1909 # pad: 123: 0 => -1, at 1 => -2, at 2 => -3, at 3 => -4
1910 # pad+1: 123: 0 => 0, at 1 => -1, at 2 => -2, at 3 => -3
1911 $digit_round = '0'; $digit_round = substr($$xs,$pl,1) if $pad <= $len;
1912 $pl++; $pl ++ if $pad >= $len;
1913 $digit_after = '0'; $digit_after = substr($$xs,$pl,1) if $pad > 0;
1915 # print "$pad $pl $$xs dr $digit_round da $digit_after\n";
1917 # in case of 01234 we round down, for 6789 up, and only in case 5 we look
1918 # closer at the remaining digits of the original $x, remember decision
1919 my $round_up = 1; # default round up
1921 ($mode eq 'trunc') || # trunc by round down
1922 ($digit_after =~ /[01234]/) || # round down anyway,
1924 ($digit_after eq '5') && # not 5000...0000
1925 ($x->_scan_for_nonzero($pad,$xs) == 0) &&
1927 ($mode eq 'even') && ($digit_round =~ /[24680]/) ||
1928 ($mode eq 'odd') && ($digit_round =~ /[13579]/) ||
1929 ($mode eq '+inf') && ($x->{sign} eq '-') ||
1930 ($mode eq '-inf') && ($x->{sign} eq '+') ||
1931 ($mode eq 'zero') # round down if zero, sign adjusted below
1933 my $put_back = 0; # not yet modified
1935 # old code, depend on internal representation
1936 # split mantissa at $pad and then pad with zeros
1937 #my $s5 = int($pad / 5);
1941 # $x->{value}->[$i++] = 0; # replace with 5 x 0
1943 #$x->{value}->[$s5] = '00000'.$x->{value}->[$s5]; # pad with 0
1944 #my $rem = $pad % 5; # so much left over
1947 # #print "remainder $rem\n";
1948 ## #print "elem $x->{value}->[$s5]\n";
1949 # substr($x->{value}->[$s5],-$rem,$rem) = '0' x $rem; # stamp w/ '0'
1951 #$x->{value}->[$s5] = int ($x->{value}->[$s5]); # str '05' => int '5'
1952 #print ${$CALC->_str($pad->{value})}," $len\n";
1954 if (($pad > 0) && ($pad <= $len))
1956 substr($$xs,-$pad,$pad) = '0' x $pad;
1961 $x->bzero(); # round to '0'
1964 if ($round_up) # what gave test above?
1967 $pad = $len, $$xs = '0'x$pad if $scale < 0; # tlr: whack 0.51=>1.0
1969 # we modify directly the string variant instead of creating a number and
1971 my $c = 0; $pad ++; # for $pad == $len case
1972 while ($pad <= $len)
1974 $c = substr($$xs,-$pad,1) + 1; $c = '0' if $c eq '10';
1975 substr($$xs,-$pad,1) = $c; $pad++;
1976 last if $c != 0; # no overflow => early out
1978 $$xs = '1'.$$xs if $c == 0;
1980 # $x->badd( Math::BigInt->new($x->{sign}.'1'. '0' x $pad) );
1982 $x->{value} = $CALC->_new($xs) if $put_back == 1; # put back in
1984 $x->{_a} = $scale if $scale >= 0;
1987 $x->{_a} = $len+$scale;
1988 $x->{_a} = 0 if $scale < -$len;
1995 # return integer less or equal then number, since it is already integer,
1996 # always returns $self
1997 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1999 # not needed: return $x if $x->modify('bfloor');
2000 return $x->round($a,$p,$r);
2005 # return integer greater or equal then number, since it is already integer,
2006 # always returns $self
2007 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
2009 # not needed: return $x if $x->modify('bceil');
2010 return $x->round($a,$p,$r);
2013 ##############################################################################
2014 # private stuff (internal use only)
2018 # internal speedup, set argument to 1, or create a +/- 1
2020 my $x = $self->bone(); # $x->{value} = $CALC->_one();
2021 $x->{sign} = shift || '+';
2027 # Overload will swap params if first one is no object ref so that the first
2028 # one is always an object ref. In this case, third param is true.
2029 # This routine is to overcome the effect of scalar,$object creating an object
2030 # of the class of this package, instead of the second param $object. This
2031 # happens inside overload, when the overload section of this package is
2032 # inherited by sub classes.
2033 # For overload cases (and this is used only there), we need to preserve the
2034 # args, hence the copy().
2035 # You can override this method in a subclass, the overload section will call
2036 # $object->_swap() to make sure it arrives at the proper subclass, with some
2037 # exceptions like '+' and '-'. To make '+' and '-' work, you also need to
2038 # specify your own overload for them.
2040 # object, (object|scalar) => preserve first and make copy
2041 # scalar, object => swapped, re-swap and create new from first
2042 # (using class of second object, not $class!!)
2043 my $self = shift; # for override in subclass
2046 my $c = ref ($_[0]) || $class; # fallback $class should not happen
2047 return ( $c->new($_[1]), $_[0] );
2049 return ( $_[0]->copy(), $_[1] );
2054 # check for strings, if yes, return objects instead
2056 # the first argument is number of args objectify() should look at it will
2057 # return $count+1 elements, the first will be a classname. This is because
2058 # overloaded '""' calls bstr($object,undef,undef) and this would result in
2059 # useless objects beeing created and thrown away. So we cannot simple loop
2060 # over @_. If the given count is 0, all arguments will be used.
2062 # If the second arg is a ref, use it as class.
2063 # If not, try to use it as classname, unless undef, then use $class
2064 # (aka Math::BigInt). The latter shouldn't happen,though.
2067 # $x->badd(1); => ref x, scalar y
2068 # Class->badd(1,2); => classname x (scalar), scalar x, scalar y
2069 # Class->badd( Class->(1),2); => classname x (scalar), ref x, scalar y
2070 # Math::BigInt::badd(1,2); => scalar x, scalar y
2071 # In the last case we check number of arguments to turn it silently into
2072 # $class,1,2. (We can not take '1' as class ;o)
2073 # badd($class,1) is not supported (it should, eventually, try to add undef)
2074 # currently it tries 'Math::BigInt' + 1, which will not work.
2076 # some shortcut for the common cases
2079 return (ref($_[1]),$_[1]) if (@_ == 2) && ($_[0]||0 == 1) && ref($_[1]);
2081 my $count = abs(shift || 0);
2083 my (@a,$k,$d); # resulting array, temp, and downgrade
2086 # okay, got object as first
2091 # nope, got 1,2 (Class->xxx(1) => Class,1 and not supported)
2093 $a[0] = shift if $_[0] =~ /^[A-Z].*::/; # classname as first?
2096 # disable downgrading, because Math::BigFLoat->foo('1.0','2.0') needs floats
2097 if (defined ${"$a[0]::downgrade"})
2099 $d = ${"$a[0]::downgrade"};
2100 ${"$a[0]::downgrade"} = undef;
2103 # print "Now in objectify, my class is today $a[0]\n";
2111 $k = $a[0]->new($k);
2113 elsif (ref($k) ne $a[0])
2115 # foreign object, try to convert to integer
2116 $k->can('as_number') ? $k = $k->as_number() : $k = $a[0]->new($k);
2129 $k = $a[0]->new($k);
2131 elsif (ref($k) ne $a[0])
2133 # foreign object, try to convert to integer
2134 $k->can('as_number') ? $k = $k->as_number() : $k = $a[0]->new($k);
2138 push @a,@_; # return other params, too
2140 die "$class objectify needs list context" unless wantarray;
2141 ${"$a[0]::downgrade"} = $d;
2150 my @a = @_; my $l = scalar @_; my $j = 0;
2151 for ( my $i = 0; $i < $l ; $i++,$j++ )
2153 if ($_[$i] eq ':constant')
2155 # this causes overlord er load to step in
2156 overload::constant integer => sub { $self->new(shift) };
2157 overload::constant binary => sub { $self->new(shift) };
2158 splice @a, $j, 1; $j --;
2160 elsif ($_[$i] eq 'upgrade')
2162 # this causes upgrading
2163 $upgrade = $_[$i+1]; # or undef to disable
2164 my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
2165 splice @a, $j, $s; $j -= $s;
2167 elsif ($_[$i] =~ /^lib$/i)
2169 # this causes a different low lib to take care...
2170 $CALC = $_[$i+1] || '';
2171 my $s = 2; $s = 1 if @a-$j < 2; # avoid "can not modify non-existant..."
2172 splice @a, $j, $s; $j -= $s;
2175 # any non :constant stuff is handled by our parent, Exporter
2176 # even if @_ is empty, to give it a chance
2177 $self->SUPER::import(@a); # need it for subclasses
2178 $self->export_to_level(1,$self,@a); # need it for MBF
2180 # try to load core math lib
2181 my @c = split /\s*,\s*/,$CALC;
2182 push @c,'Calc'; # if all fail, try this
2183 $CALC = ''; # signal error
2184 foreach my $lib (@c)
2186 $lib = 'Math::BigInt::'.$lib if $lib !~ /^Math::BigInt/i;
2190 # Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is
2191 # used in the same script, or eval inside import().
2192 (my $mod = $lib . '.pm') =~ s!::!/!g;
2193 # require does not automatically :: => /, so portability problems arise
2194 eval { require $mod; $lib->import( @c ); }
2198 eval "use $lib qw/@c/;";
2200 $CALC = $lib, last if $@ eq ''; # no error in loading lib?
2202 die "Couldn't load any math lib, not even the default" if $CALC eq '';
2207 # convert a (ref to) big hex string to BigInt, return undef for error
2210 my $x = Math::BigInt->bzero();
2213 $$hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;
2214 $$hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;
2216 return $x->bnan() if $$hs !~ /^[\-\+]?0x[0-9A-Fa-f]+$/;
2218 my $sign = '+'; $sign = '-' if ($$hs =~ /^-/);
2220 $$hs =~ s/^[+-]//; # strip sign
2221 if ($CALC->can('_from_hex'))
2223 $x->{value} = $CALC->_from_hex($hs);
2227 # fallback to pure perl
2228 my $mul = Math::BigInt->bzero(); $mul++;
2229 my $x65536 = Math::BigInt->new(65536);
2230 my $len = CORE::length($$hs)-2;
2231 $len = int($len/4); # 4-digit parts, w/o '0x'
2232 my $val; my $i = -4;
2235 $val = substr($$hs,$i,4);
2236 $val =~ s/^[+-]?0x// if $len == 0; # for last part only because
2237 $val = hex($val); # hex does not like wrong chars
2239 $x += $mul * $val if $val != 0;
2240 $mul *= $x65536 if $len >= 0; # skip last mul
2243 $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); # no '-0'
2249 # convert a (ref to) big binary string to BigInt, return undef for error
2252 my $x = Math::BigInt->bzero();
2254 $$bs =~ s/([01])_([01])/$1$2/g;
2255 $$bs =~ s/([01])_([01])/$1$2/g;
2256 return $x->bnan() if $$bs !~ /^[+-]?0b[01]+$/;
2258 my $sign = '+'; $sign = '-' if ($$bs =~ /^\-/);
2259 $$bs =~ s/^[+-]//; # strip sign
2260 if ($CALC->can('_from_bin'))
2262 $x->{value} = $CALC->_from_bin($bs);
2266 my $mul = Math::BigInt->bzero(); $mul++;
2267 my $x256 = Math::BigInt->new(256);
2268 my $len = CORE::length($$bs)-2;
2269 $len = int($len/8); # 8-digit parts, w/o '0b'
2270 my $val; my $i = -8;
2273 $val = substr($$bs,$i,8);
2274 $val =~ s/^[+-]?0b// if $len == 0; # for last part only
2275 #$val = oct('0b'.$val); # does not work on Perl prior to 5.6.0
2277 # $val = ('0' x (8-CORE::length($val))).$val if CORE::length($val) < 8;
2278 $val = ord(pack('B8',substr('00000000'.$val,-8,8)));
2280 $x += $mul * $val if $val != 0;
2281 $mul *= $x256 if $len >= 0; # skip last mul
2284 $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); # no '-0'
2290 # (ref to num_str) return num_str
2291 # internal, take apart a string and return the pieces
2292 # strip leading/trailing whitespace, leading zeros, underscore and reject
2296 # strip white space at front, also extranous leading zeros
2297 $$x =~ s/^\s*([-]?)0*([0-9])/$1$2/g; # will not strip ' .2'
2298 $$x =~ s/^\s+//; # but this will
2299 $$x =~ s/\s+$//g; # strip white space at end
2301 # shortcut, if nothing to split, return early
2302 if ($$x =~ /^[+-]?\d+$/)
2304 $$x =~ s/^([+-])0*([0-9])/$2/; my $sign = $1 || '+';
2305 return (\$sign, $x, \'', \'', \0);
2308 # invalid starting char?
2309 return if $$x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/;
2311 return __from_hex($x) if $$x =~ /^[\-\+]?0x/; # hex string
2312 return __from_bin($x) if $$x =~ /^[\-\+]?0b/; # binary string
2314 # strip underscores between digits
2315 $$x =~ s/(\d)_(\d)/$1$2/g;
2316 $$x =~ s/(\d)_(\d)/$1$2/g; # do twice for 1_2_3
2318 # some possible inputs:
2319 # 2.1234 # 0.12 # 1 # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2
2320 # .2 # 1_2_3.4_5_6 # 1.4E1_2_3 # 1e3 # +.2
2322 return if $$x =~ /[Ee].*[Ee]/; # more than one E => error
2324 my ($m,$e) = split /[Ee]/,$$x;
2325 $e = '0' if !defined $e || $e eq "";
2326 # sign,value for exponent,mantint,mantfrac
2327 my ($es,$ev,$mis,$miv,$mfv);
2329 if ($e =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
2333 return if $m eq '.' || $m eq '';
2334 my ($mi,$mf) = split /\./,$m;
2335 $mi = '0' if !defined $mi;
2336 $mi .= '0' if $mi =~ /^[\-\+]?$/;
2337 $mf = '0' if !defined $mf || $mf eq '';
2338 if ($mi =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
2340 $mis = $1||'+'; $miv = $2;
2341 return unless ($mf =~ /^(\d*?)0*$/); # strip trailing zeros
2343 return (\$mis,\$miv,\$mfv,\$es,\$ev);
2346 return; # NaN, not a number
2351 # an object might be asked to return itself as bigint on certain overloaded
2352 # operations, this does exactly this, so that sub classes can simple inherit
2353 # it or override with their own integer conversion routine
2361 # return as hex string, with prefixed 0x
2362 my $x = shift; $x = $class->new($x) if !ref($x);
2364 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2365 return '0x0' if $x->is_zero();
2367 my $es = ''; my $s = '';
2368 $s = $x->{sign} if $x->{sign} eq '-';
2369 if ($CALC->can('_as_hex'))
2371 $es = ${$CALC->_as_hex($x->{value})};
2375 my $x1 = $x->copy()->babs(); my $xr;
2376 my $x10000 = Math::BigInt->new (0x10000);
2377 while (!$x1->is_zero())
2379 ($x1, $xr) = bdiv($x1,$x10000);
2380 $es .= unpack('h4',pack('v',$xr->numify()));
2383 $es =~ s/^[0]+//; # strip leading zeros
2391 # return as binary string, with prefixed 0b
2392 my $x = shift; $x = $class->new($x) if !ref($x);
2394 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2395 return '0b0' if $x->is_zero();
2397 my $es = ''; my $s = '';
2398 $s = $x->{sign} if $x->{sign} eq '-';
2399 if ($CALC->can('_as_bin'))
2401 $es = ${$CALC->_as_bin($x->{value})};
2405 my $x1 = $x->copy()->babs(); my $xr;
2406 my $x10000 = Math::BigInt->new (0x10000);
2407 while (!$x1->is_zero())
2409 ($x1, $xr) = bdiv($x1,$x10000);
2410 $es .= unpack('b16',pack('v',$xr->numify()));
2413 $es =~ s/^[0]+//; # strip leading zeros
2419 ##############################################################################
2420 # internal calculation routines (others are in Math::BigInt::Calc etc)
2424 # (BINT or num_str, BINT or num_str) return BINT
2425 # does modify first argument
2428 my $x = shift; my $ty = shift;
2429 return $x->bnan() if ($x->{sign} eq $nan) || ($ty->{sign} eq $nan);
2430 return $x * $ty / bgcd($x,$ty);
2435 # (BINT or num_str, BINT or num_str) return BINT
2436 # does modify both arguments
2437 # GCD -- Euclids algorithm E, Knuth Vol 2 pg 296
2440 return $x->bnan() if $x->{sign} !~ /^[+-]$/ || $ty->{sign} !~ /^[+-]$/;
2442 while (!$ty->is_zero())
2444 ($x, $ty) = ($ty,bmod($x,$ty));
2449 ###############################################################################
2450 # this method return 0 if the object can be modified, or 1 for not
2451 # We use a fast use constant statement here, to avoid costly calls. Subclasses
2452 # may override it with special code (f.i. Math::BigInt::Constant does so)
2454 sub modify () { 0; }
2461 Math::BigInt - Arbitrary size integer math package
2468 $x = Math::BigInt->new($str); # defaults to 0
2469 $nan = Math::BigInt->bnan(); # create a NotANumber
2470 $zero = Math::BigInt->bzero(); # create a +0
2471 $inf = Math::BigInt->binf(); # create a +inf
2472 $inf = Math::BigInt->binf('-'); # create a -inf
2473 $one = Math::BigInt->bone(); # create a +1
2474 $one = Math::BigInt->bone('-'); # create a -1
2477 $x->is_zero(); # true if arg is +0
2478 $x->is_nan(); # true if arg is NaN
2479 $x->is_one(); # true if arg is +1
2480 $x->is_one('-'); # true if arg is -1
2481 $x->is_odd(); # true if odd, false for even
2482 $x->is_even(); # true if even, false for odd
2483 $x->is_positive(); # true if >= 0
2484 $x->is_negative(); # true if < 0
2485 $x->is_inf(sign); # true if +inf, or -inf (sign is default '+')
2486 $x->is_int(); # true if $x is an integer (not a float)
2488 $x->bcmp($y); # compare numbers (undef,<0,=0,>0)
2489 $x->bacmp($y); # compare absolutely (undef,<0,=0,>0)
2490 $x->sign(); # return the sign, either +,- or NaN
2491 $x->digit($n); # return the nth digit, counting from right
2492 $x->digit(-$n); # return the nth digit, counting from left
2494 # The following all modify their first argument:
2497 $x->bzero(); # set $x to 0
2498 $x->bnan(); # set $x to NaN
2499 $x->bone(); # set $x to +1
2500 $x->bone('-'); # set $x to -1
2501 $x->binf(); # set $x to inf
2502 $x->binf('-'); # set $x to -inf
2504 $x->bneg(); # negation
2505 $x->babs(); # absolute value
2506 $x->bnorm(); # normalize (no-op)
2507 $x->bnot(); # two's complement (bit wise not)
2508 $x->binc(); # increment x by 1
2509 $x->bdec(); # decrement x by 1
2511 $x->badd($y); # addition (add $y to $x)
2512 $x->bsub($y); # subtraction (subtract $y from $x)
2513 $x->bmul($y); # multiplication (multiply $x by $y)
2514 $x->bdiv($y); # divide, set $x to quotient
2515 # return (quo,rem) or quo if scalar
2517 $x->bmod($y); # modulus (x % y)
2518 $x->bpow($y); # power of arguments (x ** y)
2519 $x->blsft($y); # left shift
2520 $x->brsft($y); # right shift
2521 $x->blsft($y,$n); # left shift, by base $n (like 10)
2522 $x->brsft($y,$n); # right shift, by base $n (like 10)
2524 $x->band($y); # bitwise and
2525 $x->bior($y); # bitwise inclusive or
2526 $x->bxor($y); # bitwise exclusive or
2527 $x->bnot(); # bitwise not (two's complement)
2529 $x->bsqrt(); # calculate square-root
2530 $x->bfac(); # factorial of $x (1*2*3*4*..$x)
2532 $x->round($A,$P,$round_mode); # round to accuracy or precision using mode $r
2533 $x->bround($N); # accuracy: preserve $N digits
2534 $x->bfround($N); # round to $Nth digit, no-op for BigInts
2536 # The following do not modify their arguments in BigInt, but do in BigFloat:
2537 $x->bfloor(); # return integer less or equal than $x
2538 $x->bceil(); # return integer greater or equal than $x
2540 # The following do not modify their arguments:
2542 bgcd(@values); # greatest common divisor (no OO style)
2543 blcm(@values); # lowest common multiplicator (no OO style)
2545 $x->length(); # return number of digits in number
2546 ($x,$f) = $x->length(); # length of number and length of fraction part,
2547 # latter is always 0 digits long for BigInt's
2549 $x->exponent(); # return exponent as BigInt
2550 $x->mantissa(); # return (signed) mantissa as BigInt
2551 $x->parts(); # return (mantissa,exponent) as BigInt
2552 $x->copy(); # make a true copy of $x (unlike $y = $x;)
2553 $x->as_number(); # return as BigInt (in BigInt: same as copy())
2555 # conversation to string
2556 $x->bstr(); # normalized string
2557 $x->bsstr(); # normalized string in scientific notation
2558 $x->as_hex(); # as signed hexadecimal string with prefixed 0x
2559 $x->as_bin(); # as signed binary string with prefixed 0b
2563 All operators (inlcuding basic math operations) are overloaded if you
2564 declare your big integers as
2566 $i = new Math::BigInt '123_456_789_123_456_789';
2568 Operations with overloaded operators preserve the arguments which is
2569 exactly what you expect.
2573 =item Canonical notation
2575 Big integer values are strings of the form C</^[+-]\d+$/> with leading
2578 '-0' canonical value '-0', normalized '0'
2579 ' -123_123_123' canonical value '-123123123'
2580 '1_23_456_7890' canonical value '1234567890'
2584 Input values to these routines may be either Math::BigInt objects or
2585 strings of the form C</^\s*[+-]?[\d]+\.?[\d]*E?[+-]?[\d]*$/>.
2587 You can include one underscore between any two digits.
2589 This means integer values like 1.01E2 or even 1000E-2 are also accepted.
2590 Non integer values result in NaN.
2592 Math::BigInt::new() defaults to 0, while Math::BigInt::new('') results
2595 bnorm() on a BigInt object is now effectively a no-op, since the numbers
2596 are always stored in normalized form. On a string, it creates a BigInt
2601 Output values are BigInt objects (normalized), except for bstr(), which
2602 returns a string in normalized form.
2603 Some routines (C<is_odd()>, C<is_even()>, C<is_zero()>, C<is_one()>,
2604 C<is_nan()>) return true or false, while others (C<bcmp()>, C<bacmp()>)
2605 return either undef, <0, 0 or >0 and are suited for sort.
2611 Each of the methods below accepts three additional parameters. These arguments
2612 $A, $P and $R are accuracy, precision and round_mode. Please see more in the
2613 section about ACCURACY and ROUNDIND.
2617 $x->accuracy(5); # local for $x
2618 $class->accuracy(5); # global for all members of $class
2620 Set or get the global or local accuracy, aka how many significant digits the
2621 results have. Please see the section about L<ACCURACY AND PRECISION> for
2624 Value must be greater than zero. Pass an undef value to disable it:
2626 $x->accuracy(undef);
2627 Math::BigInt->accuracy(undef);
2629 Returns the current accuracy. For C<$x->accuracy()> it will return either the
2630 local accuracy, or if not defined, the global. This means the return value
2631 represents the accuracy that will be in effect for $x:
2633 $y = Math::BigInt->new(1234567); # unrounded
2634 print Math::BigInt->accuracy(4),"\n"; # set 4, print 4
2635 $x = Math::BigInt->new(123456); # will be automatically rounded
2636 print "$x $y\n"; # '123500 1234567'
2637 print $x->accuracy(),"\n"; # will be 4
2638 print $y->accuracy(),"\n"; # also 4, since global is 4
2639 print Math::BigInt->accuracy(5),"\n"; # set to 5, print 5
2640 print $x->accuracy(),"\n"; # still 4
2641 print $y->accuracy(),"\n"; # 5, since global is 5
2647 Shifts $x right by $y in base $n. Default is base 2, used are usually 10 and
2648 2, but others work, too.
2650 Right shifting usually amounts to dividing $x by $n ** $y and truncating the
2654 $x = Math::BigInt->new(10);
2655 $x->brsft(1); # same as $x >> 1: 5
2656 $x = Math::BigInt->new(1234);
2657 $x->brsft(2,10); # result 12
2659 There is one exception, and that is base 2 with negative $x:
2662 $x = Math::BigInt->new(-5);
2665 This will print -3, not -2 (as it would if you divide -5 by 2 and truncate the
2670 $x = Math::BigInt->new($str,$A,$P,$R);
2672 Creates a new BigInt object from a string or another BigInt object. The
2673 input is accepted as decimal, hex (with leading '0x') or binary (with leading
2678 $x = Math::BigInt->bnan();
2680 Creates a new BigInt object representing NaN (Not A Number).
2681 If used on an object, it will set it to NaN:
2687 $x = Math::BigInt->bzero();
2689 Creates a new BigInt object representing zero.
2690 If used on an object, it will set it to zero:
2696 $x = Math::BigInt->binf($sign);
2698 Creates a new BigInt object representing infinity. The optional argument is
2699 either '-' or '+', indicating whether you want infinity or minus infinity.
2700 If used on an object, it will set it to infinity:
2707 $x = Math::BigInt->binf($sign);
2709 Creates a new BigInt object representing one. The optional argument is
2710 either '-' or '+', indicating whether you want one or minus one.
2711 If used on an object, it will set it to one:
2716 =head2 is_one()/is_zero()/is_nan()/is_inf()
2719 $x->is_zero(); # true if arg is +0
2720 $x->is_nan(); # true if arg is NaN
2721 $x->is_one(); # true if arg is +1
2722 $x->is_one('-'); # true if arg is -1
2723 $x->is_inf(); # true if +inf
2724 $x->is_inf('-'); # true if -inf (sign is default '+')
2726 These methods all test the BigInt for beeing one specific value and return
2727 true or false depending on the input. These are faster than doing something
2732 =head2 is_positive()/is_negative()
2734 $x->is_positive(); # true if >= 0
2735 $x->is_negative(); # true if < 0
2737 The methods return true if the argument is positive or negative, respectively.
2738 C<NaN> is neither positive nor negative, while C<+inf> counts as positive, and
2739 C<-inf> is negative. A C<zero> is positive.
2741 These methods are only testing the sign, and not the value.
2743 =head2 is_odd()/is_even()/is_int()
2745 $x->is_odd(); # true if odd, false for even
2746 $x->is_even(); # true if even, false for odd
2747 $x->is_int(); # true if $x is an integer
2749 The return true when the argument satisfies the condition. C<NaN>, C<+inf>,
2750 C<-inf> are not integers and are neither odd nor even.
2756 Compares $x with $y and takes the sign into account.
2757 Returns -1, 0, 1 or undef.
2763 Compares $x with $y while ignoring their. Returns -1, 0, 1 or undef.
2769 Return the sign, of $x, meaning either C<+>, C<->, C<-inf>, C<+inf> or NaN.
2773 $x->digit($n); # return the nth digit, counting from right
2779 Negate the number, e.g. change the sign between '+' and '-', or between '+inf'
2780 and '-inf', respectively. Does nothing for NaN or zero.
2786 Set the number to it's absolute value, e.g. change the sign from '-' to '+'
2787 and from '-inf' to '+inf', respectively. Does nothing for NaN or positive
2792 $x->bnorm(); # normalize (no-op)
2796 $x->bnot(); # two's complement (bit wise not)
2800 $x->binc(); # increment x by 1
2804 $x->bdec(); # decrement x by 1
2808 $x->badd($y); # addition (add $y to $x)
2812 $x->bsub($y); # subtraction (subtract $y from $x)
2816 $x->bmul($y); # multiplication (multiply $x by $y)
2820 $x->bdiv($y); # divide, set $x to quotient
2821 # return (quo,rem) or quo if scalar
2825 $x->bmod($y); # modulus (x % y)
2829 $x->bpow($y); # power of arguments (x ** y)
2833 $x->blsft($y); # left shift
2834 $x->blsft($y,$n); # left shift, by base $n (like 10)
2838 $x->brsft($y); # right shift
2839 $x->brsft($y,$n); # right shift, by base $n (like 10)
2843 $x->band($y); # bitwise and
2847 $x->bior($y); # bitwise inclusive or
2851 $x->bxor($y); # bitwise exclusive or
2855 $x->bnot(); # bitwise not (two's complement)
2859 $x->bsqrt(); # calculate square-root
2863 $x->bfac(); # factorial of $x (1*2*3*4*..$x)
2867 $x->round($A,$P,$round_mode); # round to accuracy or precision using mode $r
2871 $x->bround($N); # accuracy: preserve $N digits
2875 $x->bfround($N); # round to $Nth digit, no-op for BigInts
2881 Set $x to the integer less or equal than $x. This is a no-op in BigInt, but
2882 does change $x in BigFloat.
2888 Set $x to the integer greater or equal than $x. This is a no-op in BigInt, but
2889 does change $x in BigFloat.
2893 bgcd(@values); # greatest common divisor (no OO style)
2897 blcm(@values); # lowest common multiplicator (no OO style)
2902 ($xl,$fl) = $x->length();
2904 Returns the number of digits in the decimal representation of the number.
2905 In list context, returns the length of the integer and fraction part. For
2906 BigInt's, the length of the fraction part will always be 0.
2912 Return the exponent of $x as BigInt.
2918 Return the signed mantissa of $x as BigInt.
2922 $x->parts(); # return (mantissa,exponent) as BigInt
2926 $x->copy(); # make a true copy of $x (unlike $y = $x;)
2930 $x->as_number(); # return as BigInt (in BigInt: same as copy())
2934 $x->bstr(); # normalized string
2938 $x->bsstr(); # normalized string in scientific notation
2942 $x->as_hex(); # as signed hexadecimal string with prefixed 0x
2946 $x->as_bin(); # as signed binary string with prefixed 0b
2948 =head1 ACCURACY and PRECISION
2950 Since version v1.33, Math::BigInt and Math::BigFloat have full support for
2951 accuracy and precision based rounding, both automatically after every
2952 operation as well as manually.
2954 This section describes the accuracy/precision handling in Math::Big* as it
2955 used to be and as it is now, complete with an explanation of all terms and
2958 Not yet implemented things (but with correct description) are marked with '!',
2959 things that need to be answered are marked with '?'.
2961 In the next paragraph follows a short description of terms used here (because
2962 these may differ from terms used by others people or documentation).
2964 During the rest of this document, the shortcuts A (for accuracy), P (for
2965 precision), F (fallback) and R (rounding mode) will be used.
2969 A fixed number of digits before (positive) or after (negative)
2970 the decimal point. For example, 123.45 has a precision of -2. 0 means an
2971 integer like 123 (or 120). A precision of 2 means two digits to the left
2972 of the decimal point are zero, so 123 with P = 1 becomes 120. Note that
2973 numbers with zeros before the decimal point may have different precisions,
2974 because 1200 can have p = 0, 1 or 2 (depending on what the inital value
2975 was). It could also have p < 0, when the digits after the decimal point
2978 The string output (of floating point numbers) will be padded with zeros:
2980 Initial value P A Result String
2981 ------------------------------------------------------------
2982 1234.01 -3 1000 1000
2985 1234.001 1 1234 1234.0
2987 1234.01 2 1234.01 1234.01
2988 1234.01 5 1234.01 1234.01000
2990 For BigInts, no padding occurs.
2994 Number of significant digits. Leading zeros are not counted. A
2995 number may have an accuracy greater than the non-zero digits
2996 when there are zeros in it or trailing zeros. For example, 123.456 has
2997 A of 6, 10203 has 5, 123.0506 has 7, 123.450000 has 8 and 0.000123 has 3.
2999 The string output (of floating point numbers) will be padded with zeros:
3001 Initial value P A Result String
3002 ------------------------------------------------------------
3004 1234.01 6 1234.01 1234.01
3005 1234.1 8 1234.1 1234.1000
3007 For BigInts, no padding occurs.
3011 When both A and P are undefined, this is used as a fallback accuracy when
3014 =head2 Rounding mode R
3016 When rounding a number, different 'styles' or 'kinds'
3017 of rounding are possible. (Note that random rounding, as in
3018 Math::Round, is not implemented.)
3024 truncation invariably removes all digits following the
3025 rounding place, replacing them with zeros. Thus, 987.65 rounded
3026 to tens (P=1) becomes 980, and rounded to the fourth sigdig
3027 becomes 987.6 (A=4). 123.456 rounded to the second place after the
3028 decimal point (P=-2) becomes 123.46.
3030 All other implemented styles of rounding attempt to round to the
3031 "nearest digit." If the digit D immediately to the right of the
3032 rounding place (skipping the decimal point) is greater than 5, the
3033 number is incremented at the rounding place (possibly causing a
3034 cascade of incrementation): e.g. when rounding to units, 0.9 rounds
3035 to 1, and -19.9 rounds to -20. If D < 5, the number is similarly
3036 truncated at the rounding place: e.g. when rounding to units, 0.4
3037 rounds to 0, and -19.4 rounds to -19.
3039 However the results of other styles of rounding differ if the
3040 digit immediately to the right of the rounding place (skipping the
3041 decimal point) is 5 and if there are no digits, or no digits other
3042 than 0, after that 5. In such cases:
3046 rounds the digit at the rounding place to 0, 2, 4, 6, or 8
3047 if it is not already. E.g., when rounding to the first sigdig, 0.45
3048 becomes 0.4, -0.55 becomes -0.6, but 0.4501 becomes 0.5.
3052 rounds the digit at the rounding place to 1, 3, 5, 7, or 9 if
3053 it is not already. E.g., when rounding to the first sigdig, 0.45
3054 becomes 0.5, -0.55 becomes -0.5, but 0.5501 becomes 0.6.
3058 round to plus infinity, i.e. always round up. E.g., when
3059 rounding to the first sigdig, 0.45 becomes 0.5, -0.55 becomes -0.5,
3060 and 0.4501 also becomes 0.5.
3064 round to minus infinity, i.e. always round down. E.g., when
3065 rounding to the first sigdig, 0.45 becomes 0.4, -0.55 becomes -0.6,
3066 but 0.4501 becomes 0.5.
3070 round to zero, i.e. positive numbers down, negative ones up.
3071 E.g., when rounding to the first sigdig, 0.45 becomes 0.4, -0.55
3072 becomes -0.5, but 0.4501 becomes 0.5.
3076 The handling of A & P in MBI/MBF (the old core code shipped with Perl
3077 versions <= 5.7.2) is like this:
3083 * ffround($p) is able to round to $p number of digits after the decimal
3085 * otherwise P is unused
3087 =item Accuracy (significant digits)
3089 * fround($a) rounds to $a significant digits
3090 * only fdiv() and fsqrt() take A as (optional) paramater
3091 + other operations simply create the same number (fneg etc), or more (fmul)
3093 + rounding/truncating is only done when explicitly calling one of fround
3094 or ffround, and never for BigInt (not implemented)
3095 * fsqrt() simply hands its accuracy argument over to fdiv.
3096 * the documentation and the comment in the code indicate two different ways
3097 on how fdiv() determines the maximum number of digits it should calculate,
3098 and the actual code does yet another thing
3100 max($Math::BigFloat::div_scale,length(dividend)+length(divisor))
3102 result has at most max(scale, length(dividend), length(divisor)) digits
3104 scale = max(scale, length(dividend)-1,length(divisor)-1);
3105 scale += length(divisior) - length(dividend);
3106 So for lx = 3, ly = 9, scale = 10, scale will actually be 16 (10+9-3).
3107 Actually, the 'difference' added to the scale is calculated from the
3108 number of "significant digits" in dividend and divisor, which is derived
3109 by looking at the length of the mantissa. Which is wrong, since it includes
3110 the + sign (oups) and actually gets 2 for '+100' and 4 for '+101'. Oups
3111 again. Thus 124/3 with div_scale=1 will get you '41.3' based on the strange
3112 assumption that 124 has 3 significant digits, while 120/7 will get you
3113 '17', not '17.1' since 120 is thought to have 2 significant digits.
3114 The rounding after the division then uses the remainder and $y to determine
3115 wether it must round up or down.
3116 ? I have no idea which is the right way. That's why I used a slightly more
3117 ? simple scheme and tweaked the few failing testcases to match it.
3121 This is how it works now:
3125 =item Setting/Accessing
3127 * You can set the A global via Math::BigInt->accuracy() or
3128 Math::BigFloat->accuracy() or whatever class you are using.
3129 * You can also set P globally by using Math::SomeClass->precision() likewise.
3130 * Globals are classwide, and not inherited by subclasses.
3131 * to undefine A, use Math::SomeCLass->accuracy(undef);
3132 * to undefine P, use Math::SomeClass->precision(undef);
3133 * Setting Math::SomeClass->accuracy() clears automatically
3134 Math::SomeClass->precision(), and vice versa.
3135 * To be valid, A must be > 0, P can have any value.
3136 * If P is negative, this means round to the P'th place to the right of the
3137 decimal point; positive values mean to the left of the decimal point.
3138 P of 0 means round to integer.
3139 * to find out the current global A, take Math::SomeClass->accuracy()
3140 * to find out the current global P, take Math::SomeClass->precision()
3141 * use $x->accuracy() respective $x->precision() for the local setting of $x.
3142 * Please note that $x->accuracy() respecive $x->precision() fall back to the
3143 defined globals, when $x's A or P is not set.
3145 =item Creating numbers
3147 * When you create a number, you can give it's desired A or P via:
3148 $x = Math::BigInt->new($number,$A,$P);
3149 * Only one of A or P can be defined, otherwise the result is NaN
3150 * If no A or P is give ($x = Math::BigInt->new($number) form), then the
3151 globals (if set) will be used. Thus changing the global defaults later on
3152 will not change the A or P of previously created numbers (i.e., A and P of
3153 $x will be what was in effect when $x was created)
3154 * If given undef for A and P, B<no> rounding will occur, and the globals will
3155 B<not> be used. This is used by subclasses to create numbers without
3156 suffering rounding in the parent. Thus a subclass is able to have it's own
3157 globals enforced upon creation of a number by using
3158 $x = Math::BigInt->new($number,undef,undef):
3160 use Math::Bigint::SomeSubclass;
3163 Math::BigInt->accuracy(2);
3164 Math::BigInt::SomeSubClass->accuracy(3);
3165 $x = Math::BigInt::SomeSubClass->new(1234);
3167 $x is now 1230, and not 1200. A subclass might choose to implement
3168 this otherwise, e.g. falling back to the parent's A and P.
3172 * If A or P are enabled/defined, they are used to round the result of each
3173 operation according to the rules below
3174 * Negative P is ignored in Math::BigInt, since BigInts never have digits
3175 after the decimal point
3176 * Math::BigFloat uses Math::BigInts internally, but setting A or P inside
3177 Math::BigInt as globals should not tamper with the parts of a BigFloat.
3178 Thus a flag is used to mark all Math::BigFloat numbers as 'never round'
3182 * It only makes sense that a number has only one of A or P at a time.
3183 Since you can set/get both A and P, there is a rule that will practically
3184 enforce only A or P to be in effect at a time, even if both are set.
3185 This is called precedence.
3186 * If two objects are involved in an operation, and one of them has A in
3187 effect, and the other P, this results in an error (NaN).
3188 * A takes precendence over P (Hint: A comes before P). If A is defined, it
3189 is used, otherwise P is used. If neither of them is defined, nothing is
3190 used, i.e. the result will have as many digits as it can (with an
3191 exception for fdiv/fsqrt) and will not be rounded.
3192 * There is another setting for fdiv() (and thus for fsqrt()). If neither of
3193 A or P is defined, fdiv() will use a fallback (F) of $div_scale digits.
3194 If either the dividend's or the divisor's mantissa has more digits than
3195 the value of F, the higher value will be used instead of F.
3196 This is to limit the digits (A) of the result (just consider what would
3197 happen with unlimited A and P in the case of 1/3 :-)
3198 * fdiv will calculate (at least) 4 more digits than required (determined by
3199 A, P or F), and, if F is not used, round the result
3200 (this will still fail in the case of a result like 0.12345000000001 with A
3201 or P of 5, but this can not be helped - or can it?)
3202 * Thus you can have the math done by on Math::Big* class in three modes:
3203 + never round (this is the default):
3204 This is done by setting A and P to undef. No math operation
3205 will round the result, with fdiv() and fsqrt() as exceptions to guard
3206 against overflows. You must explicitely call bround(), bfround() or
3207 round() (the latter with parameters).
3208 Note: Once you have rounded a number, the settings will 'stick' on it
3209 and 'infect' all other numbers engaged in math operations with it, since
3210 local settings have the highest precedence. So, to get SaferRound[tm],
3211 use a copy() before rounding like this:
3213 $x = Math::BigFloat->new(12.34);
3214 $y = Math::BigFloat->new(98.76);
3215 $z = $x * $y; # 1218.6984
3216 print $x->copy()->fround(3); # 12.3 (but A is now 3!)
3217 $z = $x * $y; # still 1218.6984, without
3218 # copy would have been 1210!
3220 + round after each op:
3221 After each single operation (except for testing like is_zero()), the
3222 method round() is called and the result is rounded appropriately. By
3223 setting proper values for A and P, you can have all-the-same-A or
3224 all-the-same-P modes. For example, Math::Currency might set A to undef,
3225 and P to -2, globally.
3227 ?Maybe an extra option that forbids local A & P settings would be in order,
3228 ?so that intermediate rounding does not 'poison' further math?
3230 =item Overriding globals
3232 * you will be able to give A, P and R as an argument to all the calculation
3233 routines; the second parameter is A, the third one is P, and the fourth is
3234 R (shift right by one for binary operations like badd). P is used only if
3235 the first parameter (A) is undefined. These three parameters override the
3236 globals in the order detailed as follows, i.e. the first defined value
3238 (local: per object, global: global default, parameter: argument to sub)
3241 + local A (if defined on both of the operands: smaller one is taken)
3242 + local P (if defined on both of the operands: bigger one is taken)
3246 * fsqrt() will hand its arguments to fdiv(), as it used to, only now for two
3247 arguments (A and P) instead of one
3249 =item Local settings
3251 * You can set A and P locally by using $x->accuracy() and $x->precision()
3252 and thus force different A and P for different objects/numbers.
3253 * Setting A or P this way immediately rounds $x to the new value.
3254 * $x->accuracy() clears $x->precision(), and vice versa.
3258 * the rounding routines will use the respective global or local settings.
3259 fround()/bround() is for accuracy rounding, while ffround()/bfround()
3261 * the two rounding functions take as the second parameter one of the
3262 following rounding modes (R):
3263 'even', 'odd', '+inf', '-inf', 'zero', 'trunc'
3264 * you can set and get the global R by using Math::SomeClass->round_mode()
3265 or by setting $Math::SomeClass::round_mode
3266 * after each operation, $result->round() is called, and the result may
3267 eventually be rounded (that is, if A or P were set either locally,
3268 globally or as parameter to the operation)
3269 * to manually round a number, call $x->round($A,$P,$round_mode);
3270 this will round the number by using the appropriate rounding function
3271 and then normalize it.
3272 * rounding modifies the local settings of the number:
3274 $x = Math::BigFloat->new(123.456);
3278 Here 4 takes precedence over 5, so 123.5 is the result and $x->accuracy()
3279 will be 4 from now on.
3281 =item Default values
3290 * The defaults are set up so that the new code gives the same results as
3291 the old code (except in a few cases on fdiv):
3292 + Both A and P are undefined and thus will not be used for rounding
3293 after each operation.
3294 + round() is thus a no-op, unless given extra parameters A and P
3300 The actual numbers are stored as unsigned big integers (with seperate sign).
3301 You should neither care about nor depend on the internal representation; it
3302 might change without notice. Use only method calls like C<< $x->sign(); >>
3303 instead relying on the internal hash keys like in C<< $x->{sign}; >>.
3307 Math with the numbers is done (by default) by a module called
3308 Math::BigInt::Calc. This is equivalent to saying:
3310 use Math::BigInt lib => 'Calc';
3312 You can change this by using:
3314 use Math::BigInt lib => 'BitVect';
3316 The following would first try to find Math::BigInt::Foo, then
3317 Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
3319 use Math::BigInt lib => 'Foo,Math::BigInt::Bar';
3321 Calc.pm uses as internal format an array of elements of some decimal base
3322 (usually 1e5 or 1e7) with the least significant digit first, while BitVect.pm
3323 uses a bit vector of base 2, most significant bit first. Other modules might
3324 use even different means of representing the numbers. See the respective
3325 module documentation for further details.
3329 The sign is either '+', '-', 'NaN', '+inf' or '-inf' and stored seperately.
3331 A sign of 'NaN' is used to represent the result when input arguments are not
3332 numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
3333 minus infinity. You will get '+inf' when dividing a positive number by 0, and
3334 '-inf' when dividing any negative number by 0.
3336 =head2 mantissa(), exponent() and parts()
3338 C<mantissa()> and C<exponent()> return the said parts of the BigInt such
3341 $m = $x->mantissa();
3342 $e = $x->exponent();
3343 $y = $m * ( 10 ** $e );
3344 print "ok\n" if $x == $y;
3346 C<< ($m,$e) = $x->parts() >> is just a shortcut that gives you both of them
3347 in one go. Both the returned mantissa and exponent have a sign.
3349 Currently, for BigInts C<$e> will be always 0, except for NaN, +inf and -inf,
3350 where it will be NaN; and for $x == 0, where it will be 1
3351 (to be compatible with Math::BigFloat's internal representation of a zero as
3354 C<$m> will always be a copy of the original number. The relation between $e
3355 and $m might change in the future, but will always be equivalent in a
3356 numerical sense, e.g. $m might get minimized.
3362 sub bint { Math::BigInt->new(shift); }
3364 $x = Math::BigInt->bstr("1234") # string "1234"
3365 $x = "$x"; # same as bstr()
3366 $x = Math::BigInt->bneg("1234"); # Bigint "-1234"
3367 $x = Math::BigInt->babs("-12345"); # Bigint "12345"
3368 $x = Math::BigInt->bnorm("-0 00"); # BigInt "0"
3369 $x = bint(1) + bint(2); # BigInt "3"
3370 $x = bint(1) + "2"; # ditto (auto-BigIntify of "2")
3371 $x = bint(1); # BigInt "1"
3372 $x = $x + 5 / 2; # BigInt "3"
3373 $x = $x ** 3; # BigInt "27"
3374 $x *= 2; # BigInt "54"
3375 $x = Math::BigInt->new(0); # BigInt "0"
3377 $x = Math::BigInt->badd(4,5) # BigInt "9"
3378 print $x->bsstr(); # 9e+0
3380 Examples for rounding:
3385 $x = Math::BigFloat->new(123.4567);
3386 $y = Math::BigFloat->new(123.456789);
3387 Math::BigFloat->accuracy(4); # no more A than 4
3389 ok ($x->copy()->fround(),123.4); # even rounding
3390 print $x->copy()->fround(),"\n"; # 123.4
3391 Math::BigFloat->round_mode('odd'); # round to odd
3392 print $x->copy()->fround(),"\n"; # 123.5
3393 Math::BigFloat->accuracy(5); # no more A than 5
3394 Math::BigFloat->round_mode('odd'); # round to odd
3395 print $x->copy()->fround(),"\n"; # 123.46
3396 $y = $x->copy()->fround(4),"\n"; # A = 4: 123.4
3397 print "$y, ",$y->accuracy(),"\n"; # 123.4, 4
3399 Math::BigFloat->accuracy(undef); # A not important now
3400 Math::BigFloat->precision(2); # P important
3401 print $x->copy()->bnorm(),"\n"; # 123.46
3402 print $x->copy()->fround(),"\n"; # 123.46
3404 Examples for converting:
3406 my $x = Math::BigInt->new('0b1'.'01' x 123);
3407 print "bin: ",$x->as_bin()," hex:",$x->as_hex()," dec: ",$x,"\n";
3409 =head1 Autocreating constants
3411 After C<use Math::BigInt ':constant'> all the B<integer> decimal, hexadecimal
3412 and binary constants in the given scope are converted to C<Math::BigInt>.
3413 This conversion happens at compile time.
3417 perl -MMath::BigInt=:constant -e 'print 2**100,"\n"'
3419 prints the integer value of C<2**100>. Note that without conversion of
3420 constants the expression 2**100 will be calculated as perl scalar.
3422 Please note that strings and floating point constants are not affected,
3425 use Math::BigInt qw/:constant/;
3427 $x = 1234567890123456789012345678901234567890
3428 + 123456789123456789;
3429 $y = '1234567890123456789012345678901234567890'
3430 + '123456789123456789';
3432 do not work. You need an explicit Math::BigInt->new() around one of the
3433 operands. You should also quote large constants to protect loss of precision:
3437 $x = Math::BigInt->new('1234567889123456789123456789123456789');
3439 Without the quotes Perl would convert the large number to a floating point
3440 constant at compile time and then hand the result to BigInt, which results in
3441 an truncated result or a NaN.
3443 This also applies to integers that look like floating point constants:
3445 use Math::BigInt ':constant';
3447 print ref(123e2),"\n";
3448 print ref(123.2e2),"\n";
3450 will print nothing but newlines. Use either L<bignum> or L<Math::BigFloat>
3451 to get this to work.
3455 Using the form $x += $y; etc over $x = $x + $y is faster, since a copy of $x
3456 must be made in the second case. For long numbers, the copy can eat up to 20%
3457 of the work (in the case of addition/subtraction, less for
3458 multiplication/division). If $y is very small compared to $x, the form
3459 $x += $y is MUCH faster than $x = $x + $y since making the copy of $x takes
3460 more time then the actual addition.
3462 With a technique called copy-on-write, the cost of copying with overload could
3463 be minimized or even completely avoided. A test implementation of COW did show
3464 performance gains for overloaded math, but introduced a performance loss due
3465 to a constant overhead for all other operatons.
3467 The rewritten version of this module is slower on certain operations, like
3468 new(), bstr() and numify(). The reason are that it does now more work and
3469 handles more cases. The time spent in these operations is usually gained in
3470 the other operations so that programs on the average should get faster. If
3471 they don't, please contect the author.
3473 Some operations may be slower for small numbers, but are significantly faster
3474 for big numbers. Other operations are now constant (O(1), like bneg(), babs()
3475 etc), instead of O(N) and thus nearly always take much less time. These
3476 optimizations were done on purpose.
3478 If you find the Calc module to slow, try to install any of the replacement
3479 modules and see if they help you.
3481 =head2 Alternative math libraries
3483 You can use an alternative library to drive Math::BigInt via:
3485 use Math::BigInt lib => 'Module';
3487 See L<MATH LIBRARY> for more information.
3489 For more benchmark results see L<http://bloodgate.com/perl/benchmarks.html>.
3493 =head1 Subclassing Math::BigInt
3495 The basic design of Math::BigInt allows simple subclasses with very little
3496 work, as long as a few simple rules are followed:
3502 The public API must remain consistent, i.e. if a sub-class is overloading
3503 addition, the sub-class must use the same name, in this case badd(). The
3504 reason for this is that Math::BigInt is optimized to call the object methods
3509 The private object hash keys like C<$x->{sign}> may not be changed, but
3510 additional keys can be added, like C<$x->{_custom}>.
3514 Accessor functions are available for all existing object hash keys and should
3515 be used instead of directly accessing the internal hash keys. The reason for
3516 this is that Math::BigInt itself has a pluggable interface which permits it
3517 to support different storage methods.
3521 More complex sub-classes may have to replicate more of the logic internal of
3522 Math::BigInt if they need to change more basic behaviors. A subclass that
3523 needs to merely change the output only needs to overload C<bstr()>.
3525 All other object methods and overloaded functions can be directly inherited
3526 from the parent class.
3528 At the very minimum, any subclass will need to provide it's own C<new()> and can
3529 store additional hash keys in the object. There are also some package globals
3530 that must be defined, e.g.:
3534 $precision = -2; # round to 2 decimal places
3535 $round_mode = 'even';
3538 Additionally, you might want to provide the following two globals to allow
3539 auto-upgrading and auto-downgrading to work correctly:
3544 This allows Math::BigInt to correctly retrieve package globals from the
3545 subclass, like C<$SubClass::precision>. See t/Math/BigInt/Subclass.pm or
3546 t/Math/BigFloat/SubClass.pm completely functional subclass examples.
3552 in your subclass to automatically inherit the overloading from the parent. If
3553 you like, you can change part of the overloading, look at Math::String for an
3558 When used like this:
3560 use Math::BigInt upgrade => 'Foo::Bar';
3562 certain operations will 'upgrade' their calculation and thus the result to
3563 the class Foo::Bar. Usually this is used in conjunction with Math::BigFloat:
3565 use Math::BigInt upgrade => 'Math::BigFloat';
3567 As a shortcut, you can use the module C<bignum>:
3571 Also good for oneliners:
3573 perl -Mbignum -le 'print 2 ** 255'
3575 This makes it possible to mix arguments of different classes (as in 2.5 + 2)
3576 as well es preserve accuracy (as in sqrt(3)).
3578 Beware: This feature is not fully implemented yet.
3582 The following methods upgrade themselves unconditionally; that is if upgrade
3583 is in effect, they will always hand up their work:
3595 Beware: This list is not complete.
3597 All other methods upgrade themselves only when one (or all) of their
3598 arguments are of the class mentioned in $upgrade (This might change in later
3599 versions to a more sophisticated scheme):
3605 =item Out of Memory!
3607 Under Perl prior to 5.6.0 having an C<use Math::BigInt ':constant';> and
3608 C<eval()> in your code will crash with "Out of memory". This is probably an
3609 overload/exporter bug. You can workaround by not having C<eval()>
3610 and ':constant' at the same time or upgrade your Perl to a newer version.
3612 =item Fails to load Calc on Perl prior 5.6.0
3614 Since eval(' use ...') can not be used in conjunction with ':constant', BigInt
3615 will fall back to eval { require ... } when loading the math lib on Perls
3616 prior to 5.6.0. This simple replaces '::' with '/' and thus might fail on
3617 filesystems using a different seperator.
3623 Some things might not work as you expect them. Below is documented what is
3624 known to be troublesome:
3628 =item stringify, bstr(), bsstr() and 'cmp'
3630 Both stringify and bstr() now drop the leading '+'. The old code would return
3631 '+3', the new returns '3'. This is to be consistent with Perl and to make
3632 cmp (especially with overloading) to work as you expect. It also solves
3633 problems with Test.pm, it's ok() uses 'eq' internally.
3635 Mark said, when asked about to drop the '+' altogether, or make only cmp work:
3637 I agree (with the first alternative), don't add the '+' on positive
3638 numbers. It's not as important anymore with the new internal
3639 form for numbers. It made doing things like abs and neg easier,
3640 but those have to be done differently now anyway.
3642 So, the following examples will now work all as expected:
3645 BEGIN { plan tests => 1 }
3648 my $x = new Math::BigInt 3*3;
3649 my $y = new Math::BigInt 3*3;
3652 print "$x eq 9" if $x eq $y;
3653 print "$x eq 9" if $x eq '9';
3654 print "$x eq 9" if $x eq 3*3;
3656 Additionally, the following still works:
3658 print "$x == 9" if $x == $y;
3659 print "$x == 9" if $x == 9;
3660 print "$x == 9" if $x == 3*3;
3662 There is now a C<bsstr()> method to get the string in scientific notation aka
3663 C<1e+2> instead of C<100>. Be advised that overloaded 'eq' always uses bstr()
3664 for comparisation, but Perl will represent some numbers as 100 and others
3665 as 1e+308. If in doubt, convert both arguments to Math::BigInt before doing eq:
3668 BEGIN { plan tests => 3 }
3671 $x = Math::BigInt->new('1e56'); $y = 1e56;
3672 ok ($x,$y); # will fail
3673 ok ($x->bsstr(),$y); # okay
3674 $y = Math::BigInt->new($y);
3677 Alternatively, simple use <=> for comparisations, that will get it always
3678 right. There is not yet a way to get a number automatically represented as
3679 a string that matches exactly the way Perl represents it.
3683 C<int()> will return (at least for Perl v5.7.1 and up) another BigInt, not a
3686 $x = Math::BigInt->new(123);
3687 $y = int($x); # BigInt 123
3688 $x = Math::BigFloat->new(123.45);
3689 $y = int($x); # BigInt 123
3691 In all Perl versions you can use C<as_number()> for the same effect:
3693 $x = Math::BigFloat->new(123.45);
3694 $y = $x->as_number(); # BigInt 123
3696 This also works for other subclasses, like Math::String.
3698 It is yet unlcear whether overloaded int() should return a scalar or a BigInt.
3702 The following will probably not do what you expect:
3704 $c = Math::BigInt->new(123);
3705 print $c->length(),"\n"; # prints 30
3707 It prints both the number of digits in the number and in the fraction part
3708 since print calls C<length()> in list context. Use something like:
3710 print scalar $c->length(),"\n"; # prints 3
3714 The following will probably not do what you expect:
3716 print $c->bdiv(10000),"\n";
3718 It prints both quotient and remainder since print calls C<bdiv()> in list
3719 context. Also, C<bdiv()> will modify $c, so be carefull. You probably want
3722 print $c / 10000,"\n";
3723 print scalar $c->bdiv(10000),"\n"; # or if you want to modify $c
3727 The quotient is always the greatest integer less than or equal to the
3728 real-valued quotient of the two operands, and the remainder (when it is
3729 nonzero) always has the same sign as the second operand; so, for
3739 As a consequence, the behavior of the operator % agrees with the
3740 behavior of Perl's built-in % operator (as documented in the perlop
3741 manpage), and the equation
3743 $x == ($x / $y) * $y + ($x % $y)
3745 holds true for any $x and $y, which justifies calling the two return
3746 values of bdiv() the quotient and remainder. The only exception to this rule
3747 are when $y == 0 and $x is negative, then the remainder will also be
3748 negative. See below under "infinity handling" for the reasoning behing this.
3750 Perl's 'use integer;' changes the behaviour of % and / for scalars, but will
3751 not change BigInt's way to do things. This is because under 'use integer' Perl
3752 will do what the underlying C thinks is right and this is different for each
3753 system. If you need BigInt's behaving exactly like Perl's 'use integer', bug
3754 the author to implement it ;)
3756 =item infinity handling
3758 Here are some examples that explain the reasons why certain results occur while
3761 The following table shows the result of the division and the remainder, so that
3762 the equation above holds true. Some "ordinary" cases are strewn in to show more
3763 clearly the reasoning:
3765 A / B = C, R so that C * B + R = A
3766 =========================================================
3767 5 / 8 = 0, 5 0 * 8 + 5 = 5
3768 0 / 8 = 0, 0 0 * 8 + 0 = 0
3769 0 / inf = 0, 0 0 * inf + 0 = 0
3770 0 /-inf = 0, 0 0 * -inf + 0 = 0
3771 5 / inf = 0, 5 0 * inf + 5 = 5
3772 5 /-inf = 0, 5 0 * -inf + 5 = 5
3773 -5/ inf = 0, -5 0 * inf + -5 = -5
3774 -5/-inf = 0, -5 0 * -inf + -5 = -5
3775 inf/ 5 = inf, 0 inf * 5 + 0 = inf
3776 -inf/ 5 = -inf, 0 -inf * 5 + 0 = -inf
3777 inf/ -5 = -inf, 0 -inf * -5 + 0 = inf
3778 -inf/ -5 = inf, 0 inf * -5 + 0 = -inf
3779 5/ 5 = 1, 0 1 * 5 + 0 = 5
3780 -5/ -5 = 1, 0 1 * -5 + 0 = -5
3781 inf/ inf = 1, 0 1 * inf + 0 = inf
3782 -inf/-inf = 1, 0 1 * -inf + 0 = -inf
3783 inf/-inf = -1, 0 -1 * -inf + 0 = inf
3784 -inf/ inf = -1, 0 1 * -inf + 0 = -inf
3785 8/ 0 = inf, 8 inf * 0 + 8 = 8
3786 inf/ 0 = inf, inf inf * 0 + inf = inf
3789 These cases below violate the "remainder has the sign of the second of the two
3790 arguments", since they wouldn't match up otherwise.
3792 A / B = C, R so that C * B + R = A
3793 ========================================================
3794 -inf/ 0 = -inf, -inf -inf * 0 + inf = -inf
3795 -8/ 0 = -inf, -8 -inf * 0 + 8 = -8
3797 =item Modifying and =
3801 $x = Math::BigFloat->new(5);
3804 It will not do what you think, e.g. making a copy of $x. Instead it just makes
3805 a second reference to the B<same> object and stores it in $y. Thus anything
3806 that modifies $x (except overloaded operators) will modify $y, and vice versa.
3807 Or in other words, C<=> is only safe if you modify your BigInts only via
3808 overloaded math. As soon as you use a method call it breaks:
3811 print "$x, $y\n"; # prints '10, 10'
3813 If you want a true copy of $x, use:
3817 You can also chain the calls like this, this will make first a copy and then
3820 $y = $x->copy()->bmul(2);
3822 See also the documentation for overload.pm regarding C<=>.
3826 C<bpow()> (and the rounding functions) now modifies the first argument and
3827 returns it, unlike the old code which left it alone and only returned the
3828 result. This is to be consistent with C<badd()> etc. The first three will
3829 modify $x, the last one won't:
3831 print bpow($x,$i),"\n"; # modify $x
3832 print $x->bpow($i),"\n"; # ditto
3833 print $x **= $i,"\n"; # the same
3834 print $x ** $i,"\n"; # leave $x alone
3836 The form C<$x **= $y> is faster than C<$x = $x ** $y;>, though.
3838 =item Overloading -$x
3848 since overload calls C<sub($x,0,1);> instead of C<neg($x)>. The first variant
3849 needs to preserve $x since it does not know that it later will get overwritten.
3850 This makes a copy of $x and takes O(N), but $x->bneg() is O(1).
3852 With Copy-On-Write, this issue would be gone, but C-o-W is not implemented
3853 since it is slower for all other things.
3855 =item Mixing different object types
3857 In Perl you will get a floating point value if you do one of the following:
3863 With overloaded math, only the first two variants will result in a BigFloat:
3868 $mbf = Math::BigFloat->new(5);
3869 $mbi2 = Math::BigInteger->new(5);
3870 $mbi = Math::BigInteger->new(2);
3872 # what actually gets called:
3873 $float = $mbf + $mbi; # $mbf->badd()
3874 $float = $mbf / $mbi; # $mbf->bdiv()
3875 $integer = $mbi + $mbf; # $mbi->badd()
3876 $integer = $mbi2 / $mbi; # $mbi2->bdiv()
3877 $integer = $mbi2 / $mbf; # $mbi2->bdiv()
3879 This is because math with overloaded operators follows the first (dominating)
3880 operand, and the operation of that is called and returns thus the result. So,
3881 Math::BigInt::bdiv() will always return a Math::BigInt, regardless whether
3882 the result should be a Math::BigFloat or the second operant is one.
3884 To get a Math::BigFloat you either need to call the operation manually,
3885 make sure the operands are already of the proper type or casted to that type
3886 via Math::BigFloat->new():
3888 $float = Math::BigFloat->new($mbi2) / $mbi; # = 2.5
3890 Beware of simple "casting" the entire expression, this would only convert
3891 the already computed result:
3893 $float = Math::BigFloat->new($mbi2 / $mbi); # = 2.0 thus wrong!
3895 Beware also of the order of more complicated expressions like:
3897 $integer = ($mbi2 + $mbi) / $mbf; # int / float => int
3898 $integer = $mbi2 / Math::BigFloat->new($mbi); # ditto
3900 If in doubt, break the expression into simpler terms, or cast all operands
3901 to the desired resulting type.
3903 Scalar values are a bit different, since:
3908 will both result in the proper type due to the way the overloaded math works.
3910 This section also applies to other overloaded math packages, like Math::String.
3912 One solution to you problem might be L<autoupgrading|upgrading>.
3916 C<bsqrt()> works only good if the result is a big integer, e.g. the square
3917 root of 144 is 12, but from 12 the square root is 3, regardless of rounding
3920 If you want a better approximation of the square root, then use:
3922 $x = Math::BigFloat->new(12);
3923 Math::BigFloat->precision(0);
3924 Math::BigFloat->round_mode('even');
3925 print $x->copy->bsqrt(),"\n"; # 4
3927 Math::BigFloat->precision(2);
3928 print $x->bsqrt(),"\n"; # 3.46
3929 print $x->bsqrt(3),"\n"; # 3.464
3933 For negative numbers in base see also L<brsft|brsft>.
3939 This program is free software; you may redistribute it and/or modify it under
3940 the same terms as Perl itself.
3944 L<Math::BigFloat> and L<Math::Big> as well as L<Math::BigInt::BitVect>,
3945 L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
3948 L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigInt> contains
3949 more documentation including a full version history, testcases, empty
3950 subclass files and benchmarks.
3954 Original code by Mark Biggar, overloaded interface by Ilya Zakharevich.
3955 Completely rewritten by Tels http://bloodgate.com in late 2000, 2001.