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