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