home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2004 December / PCpro_2004_12.ISO / files / webserver / tsw / TSW_3.4.0.exe / Apache2 / perl / BigInt.pm < prev    next >
Encoding:
Perl POD Document  |  2004-01-13  |  128.9 KB  |  4,409 lines

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