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