1 package Math::BigFloat;
4 # Mike grinned. 'Two down, infinity to go' - Mike Nostrus in 'Before and After'
7 # The following hash values are internally used:
8 # _e: exponent (BigInt)
9 # _m: mantissa (absolute BigInt)
10 # sign: +,-,+inf,-inf, or "NaN" if not a number
13 # _f: flags, used to signal MBI not to touch our private parts
19 @ISA = qw(Exporter Math::BigInt);
22 # $_trap_inf and $_trap_nan are internal and should never be accessed from the outside
23 use vars qw/$AUTOLOAD $accuracy $precision $div_scale $round_mode $rnd_mode
24 $upgrade $downgrade $_trap_nan $_trap_inf/;
25 my $class = "Math::BigFloat";
28 '<=>' => sub { $_[2] ?
29 ref($_[0])->bcmp($_[1],$_[0]) :
30 ref($_[0])->bcmp($_[0],$_[1])},
31 'int' => sub { $_[0]->as_number() }, # 'trunc' to bigint
34 ##############################################################################
35 # global constants, flags and assorted stuff
37 # the following are public, but their usage is not recommended. Use the
38 # accessor methods instead.
40 # class constants, use Class->constant_name() to access
41 $round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
48 my $MBI = 'Math::BigInt'; # the package we are using for our private parts
49 # changable by use Math::BigFloat with => 'package'
51 # the following are private and not to be used from the outside:
53 sub MB_NEVER_ROUND () { 0x0001; }
55 # are NaNs ok? (otherwise it dies when encountering an NaN) set w/ config()
60 # constant for easier life
63 my $IMPORT = 0; # was import() called yet?
64 # used to make require work
66 # some digits of accuracy for blog(undef,10); which we use in blog() for speed
68 '2.3025850929940456840179914546843642076011014886287729760333279009675726097';
69 my $LOG_10_A = length($LOG_10)-1;
72 '0.6931471805599453094172321214581765680755001343602552541206800094933936220';
73 my $LOG_2_A = length($LOG_2)-1;
75 ##############################################################################
76 # the old code had $rnd_mode, so we need to support it, too
78 sub TIESCALAR { my ($class) = @_; bless \$round_mode, $class; }
79 sub FETCH { return $round_mode; }
80 sub STORE { $rnd_mode = $_[0]->round_mode($_[1]); }
84 # when someone set's $rnd_mode, we catch this and check the value to see
85 # whether it is valid or not.
86 $rnd_mode = 'even'; tie $rnd_mode, 'Math::BigFloat';
89 ##############################################################################
92 # valid method aliases for AUTOLOAD
93 my %methods = map { $_ => 1 }
94 qw / fadd fsub fmul fdiv fround ffround fsqrt fmod fstr fsstr fpow fnorm
95 fint facmp fcmp fzero fnan finf finc fdec flog ffac
96 fceil ffloor frsft flsft fone flog froot
98 # valid method's that can be hand-ed up (for AUTOLOAD)
99 my %hand_ups = map { $_ => 1 }
100 qw / is_nan is_inf is_negative is_positive is_pos is_neg
101 accuracy precision div_scale round_mode fneg fabs fnot
102 objectify upgrade downgrade
106 sub method_alias { exists $methods{$_[0]||''}; }
107 sub method_hand_up { exists $hand_ups{$_[0]||''}; }
110 ##############################################################################
115 # create a new BigFloat object from a string or another bigfloat object.
118 # sign => sign (+/-), or "NaN"
120 my ($class,$wanted,@r) = @_;
122 # avoid numify-calls by not using || on $wanted!
123 return $class->bzero() if !defined $wanted; # default to 0
124 return $wanted->copy() if UNIVERSAL::isa($wanted,'Math::BigFloat');
126 $class->import() if $IMPORT == 0; # make require work
128 my $self = {}; bless $self, $class;
129 # shortcut for bigints and its subclasses
130 if ((ref($wanted)) && (ref($wanted) ne $class))
132 $self->{_m} = $wanted->as_number(); # get us a bigint copy
133 $self->{_e} = $MBI->bzero();
135 $self->{sign} = $wanted->sign();
136 return $self->bnorm();
139 # handle '+inf', '-inf' first
140 if ($wanted =~ /^[+-]?inf$/)
142 return $downgrade->new($wanted) if $downgrade;
144 $self->{_e} = $MBI->bzero();
145 $self->{_m} = $MBI->bzero();
146 $self->{sign} = $wanted;
147 $self->{sign} = '+inf' if $self->{sign} eq 'inf';
148 return $self->bnorm();
150 #print "new string '$wanted'\n";
152 my ($mis,$miv,$mfv,$es,$ev) = Math::BigInt::_split(\$wanted);
158 Carp::croak ("$wanted is not a number initialized to $class");
161 return $downgrade->bnan() if $downgrade;
163 $self->{_e} = $MBI->bzero();
164 $self->{_m} = $MBI->bzero();
165 $self->{sign} = $nan;
169 # make integer from mantissa by adjusting exp, then convert to bigint
170 # undef,undef to signal MBI that we don't need no bloody rounding
171 $self->{_e} = $MBI->new("$$es$$ev",undef,undef); # exponent
172 $self->{_m} = $MBI->new("$$miv$$mfv",undef,undef); # create mant.
174 # this is to prevent automatically rounding when MBI's globals are set
175 $self->{_m}->{_f} = MB_NEVER_ROUND;
176 $self->{_e}->{_f} = MB_NEVER_ROUND;
178 # 3.123E0 = 3123E-3, and 3.123E-2 => 3123E-5
179 $self->{_e}->bsub( $MBI->new(CORE::length($$mfv),undef,undef))
180 if CORE::length($$mfv) != 0;
181 $self->{sign} = $$mis;
183 #print "$$miv$$mfv $$es$$ev\n";
185 # we can only have trailing zeros on the mantissa of $$mfv eq ''
186 if (CORE::length($$mfv) == 0)
188 my $zeros = $self->{_m}->_trailing_zeros(); # correct for trailing zeros
191 $self->{_m}->brsft($zeros,10); $self->{_e}->badd($MBI->new($zeros));
196 # for something like 0Ey, set y to 1, and -0 => +0
197 $self->{sign} = '+', $self->{_e}->bone() if $self->{_m}->is_zero();
199 return $self->round(@r) if !$downgrade;
201 # if downgrade, inf, NaN or integers go down
203 if ($downgrade && $self->{_e}->{sign} eq '+')
205 #print "downgrading $$miv$$mfv"."E$$es$$ev";
206 if ($self->{_e}->is_zero())
208 $self->{_m}->{sign} = $$mis; # negative if wanted
209 return $downgrade->new($self->{_m});
211 return $downgrade->new($self->bsstr());
213 #print "mbf new $self->{sign} $self->{_m} e $self->{_e} ",ref($self),"\n";
214 $self->bnorm()->round(@r); # first normalize, then round
219 # used by parent class bone() to initialize number to NaN
225 my $class = ref($self);
226 Carp::croak ("Tried to set $self to NaN in $class\::_bnan()");
229 $IMPORT=1; # call our import only once
230 $self->{_m} = $MBI->bzero();
231 $self->{_e} = $MBI->bzero();
236 # used by parent class bone() to initialize number to +-inf
242 my $class = ref($self);
243 Carp::croak ("Tried to set $self to +-inf in $class\::_binf()");
246 $IMPORT=1; # call our import only once
247 $self->{_m} = $MBI->bzero();
248 $self->{_e} = $MBI->bzero();
253 # used by parent class bone() to initialize number to 1
255 $IMPORT=1; # call our import only once
256 $self->{_m} = $MBI->bone();
257 $self->{_e} = $MBI->bzero();
262 # used by parent class bone() to initialize number to 0
264 $IMPORT=1; # call our import only once
265 $self->{_m} = $MBI->bzero();
266 $self->{_e} = $MBI->bone();
271 my ($self,$class) = @_;
272 return if $class =~ /^Math::BigInt/; # we aren't one of these
273 UNIVERSAL::isa($self,$class);
278 # return (later set?) configuration data as hash ref
279 my $class = shift || 'Math::BigFloat';
281 my $cfg = $class->SUPER::config(@_);
283 # now we need only to override the ones that are different from our parent
284 $cfg->{class} = $class;
289 ##############################################################################
290 # string conversation
294 # (ref to BFLOAT or num_str ) return num_str
295 # Convert number from internal format to (non-scientific) string format.
296 # internal format is always normalized (no leading zeros, "-0" => "+0")
297 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
299 if ($x->{sign} !~ /^[+-]$/)
301 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
305 my $es = '0'; my $len = 1; my $cad = 0; my $dot = '.';
308 my $not_zero = !($x->{sign} eq '+' && $x->{_m}->is_zero());
311 $es = $x->{_m}->bstr();
312 $len = CORE::length($es);
313 my $e = $x->{_e}->numify();
317 # if _e is bigger than a scalar, the following will blow your memory
320 #print "style: 0.xxxx\n";
321 my $r = abs($e) - $len;
322 $es = '0.'. ('0' x $r) . $es; $cad = -($len+$r);
326 #print "insert '.' at $e in '$es'\n";
327 substr($es,$e,0) = '.'; $cad = $x->{_e};
333 $es .= '0' x $e; $len += $e; $cad = 0;
336 $es = '-'.$es if $x->{sign} eq '-';
337 # if set accuracy or precision, pad with zeros on the right side
338 if ((defined $x->{_a}) && ($not_zero))
340 # 123400 => 6, 0.1234 => 4, 0.001234 => 4
341 my $zeros = $x->{_a} - $cad; # cad == 0 => 12340
342 $zeros = $x->{_a} - $len if $cad != $len;
343 $es .= $dot.'0' x $zeros if $zeros > 0;
345 elsif ((($x->{_p} || 0) < 0))
347 # 123400 => 6, 0.1234 => 4, 0.001234 => 6
348 my $zeros = -$x->{_p} + $cad;
349 $es .= $dot.'0' x $zeros if $zeros > 0;
356 # (ref to BFLOAT or num_str ) return num_str
357 # Convert number from internal format to scientific string format.
358 # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
359 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
361 if ($x->{sign} !~ /^[+-]$/)
363 return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN
366 # do $esign, because we need '1e+1', since $x->{_e}->bstr() misses the +
367 my $esign = $x->{_e}->{sign}; $esign = '' if $esign eq '-';
368 my $sep = 'e'.$esign;
369 my $sign = $x->{sign}; $sign = '' if $sign eq '+';
370 $sign . $x->{_m}->bstr() . $sep . $x->{_e}->bstr();
375 # Make a number from a BigFloat object
376 # simple return a string and let Perl's atoi()/atof() handle the rest
377 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
381 ##############################################################################
382 # public stuff (usually prefixed with "b")
385 # XXX TODO this must be overwritten and return NaN for non-integer values
386 # band(), bior(), bxor(), too
389 # $class->SUPER::bnot($class,@_);
394 # Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort)
397 my ($self,$x,$y) = (ref($_[0]),@_);
398 # objectify is costly, so avoid it
399 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
401 ($self,$x,$y) = objectify(2,@_);
404 return $upgrade->bcmp($x,$y) if defined $upgrade &&
405 ((!$x->isa($self)) || (!$y->isa($self)));
407 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
409 # handle +-inf and NaN
410 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
411 return 0 if ($x->{sign} eq $y->{sign}) && ($x->{sign} =~ /^[+-]inf$/);
412 return +1 if $x->{sign} eq '+inf';
413 return -1 if $x->{sign} eq '-inf';
414 return -1 if $y->{sign} eq '+inf';
418 # check sign for speed first
419 return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y
420 return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0
423 my $xz = $x->is_zero();
424 my $yz = $y->is_zero();
425 return 0 if $xz && $yz; # 0 <=> 0
426 return -1 if $xz && $y->{sign} eq '+'; # 0 <=> +y
427 return 1 if $yz && $x->{sign} eq '+'; # +x <=> 0
429 # adjust so that exponents are equal
430 my $lxm = $x->{_m}->length();
431 my $lym = $y->{_m}->length();
432 # the numify somewhat limits our length, but makes it much faster
433 my $lx = $lxm + $x->{_e}->numify();
434 my $ly = $lym + $y->{_e}->numify();
435 my $l = $lx - $ly; $l = -$l if $x->{sign} eq '-';
436 return $l <=> 0 if $l != 0;
438 # lengths (corrected by exponent) are equal
439 # so make mantissa equal length by padding with zero (shift left)
440 my $diff = $lxm - $lym;
441 my $xm = $x->{_m}; # not yet copy it
445 $ym = $y->{_m}->copy()->blsft($diff,10);
449 $xm = $x->{_m}->copy()->blsft(-$diff,10);
451 my $rc = $xm->bacmp($ym);
452 $rc = -$rc if $x->{sign} eq '-'; # -124 < -123
458 # Compares 2 values, ignoring their signs.
459 # Returns one of undef, <0, =0, >0. (suitable for sort)
462 my ($self,$x,$y) = (ref($_[0]),@_);
463 # objectify is costly, so avoid it
464 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
466 ($self,$x,$y) = objectify(2,@_);
469 return $upgrade->bacmp($x,$y) if defined $upgrade &&
470 ((!$x->isa($self)) || (!$y->isa($self)));
472 # handle +-inf and NaN's
473 if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/)
475 return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
476 return 0 if ($x->is_inf() && $y->is_inf());
477 return 1 if ($x->is_inf() && !$y->is_inf());
482 my $xz = $x->is_zero();
483 my $yz = $y->is_zero();
484 return 0 if $xz && $yz; # 0 <=> 0
485 return -1 if $xz && !$yz; # 0 <=> +y
486 return 1 if $yz && !$xz; # +x <=> 0
488 # adjust so that exponents are equal
489 my $lxm = $x->{_m}->length();
490 my $lym = $y->{_m}->length();
491 # the numify somewhat limits our length, but makes it much faster
492 my $lx = $lxm + $x->{_e}->numify();
493 my $ly = $lym + $y->{_e}->numify();
495 return $l <=> 0 if $l != 0;
497 # lengths (corrected by exponent) are equal
498 # so make mantissa equal-length by padding with zero (shift left)
499 my $diff = $lxm - $lym;
500 my $xm = $x->{_m}; # not yet copy it
504 $ym = $y->{_m}->copy()->blsft($diff,10);
508 $xm = $x->{_m}->copy()->blsft(-$diff,10);
510 $xm->bacmp($ym) <=> 0;
515 # add second arg (BFLOAT or string) to first (BFLOAT) (modifies first)
516 # return result as BFLOAT
519 my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
520 # objectify is costly, so avoid it
521 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
523 ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
526 # inf and NaN handling
527 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
530 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
532 if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
534 # +inf++inf or -inf+-inf => same, rest is NaN
535 return $x if $x->{sign} eq $y->{sign};
538 # +-inf + something => +inf; something +-inf => +-inf
539 $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
543 return $upgrade->badd($x,$y,$a,$p,$r) if defined $upgrade &&
544 ((!$x->isa($self)) || (!$y->isa($self)));
546 # speed: no add for 0+y or x+0
547 return $x->bround($a,$p,$r) if $y->is_zero(); # x+0
548 if ($x->is_zero()) # 0+y
550 # make copy, clobbering up x (modify in place!)
551 $x->{_e} = $y->{_e}->copy();
552 $x->{_m} = $y->{_m}->copy();
553 $x->{sign} = $y->{sign} || $nan;
554 return $x->round($a,$p,$r,$y);
557 # take lower of the two e's and adapt m1 to it to match m2
559 $e = $MBI->bzero() if !defined $e; # if no BFLOAT ?
560 $e = $e->copy(); # make copy (didn't do it yet)
561 $e->bsub($x->{_e}); # Ye - Xe
562 my $add = $y->{_m}->copy();
563 if ($e->{sign} eq '-') # < 0
565 $x->{_e} += $e; # need the sign of e
566 $x->{_m}->blsft($e->babs(),10); # destroys copy of _e
568 elsif (!$e->is_zero()) # > 0
572 # else: both e are the same, so just leave them
573 $x->{_m}->{sign} = $x->{sign}; # fiddle with signs
574 $add->{sign} = $y->{sign};
575 $x->{_m} += $add; # finally do add/sub
576 $x->{sign} = $x->{_m}->{sign}; # re-adjust signs
577 $x->{_m}->{sign} = '+'; # mantissa always positiv
578 # delete trailing zeros, then round
579 $x->bnorm()->round($a,$p,$r,$y);
584 # (BigFloat or num_str, BigFloat or num_str) return BigFloat
585 # subtract second arg from first, modify first
588 my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
589 # objectify is costly, so avoid it
590 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
592 ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
595 if ($y->is_zero()) # still round for not adding zero
597 return $x->round($a,$p,$r);
601 $y->{sign} =~ tr/+-/-+/; # does nothing for NaN
602 $x->badd($y,$a,$p,$r); # badd does not leave internal zeros
603 $y->{sign} =~ tr/+-/-+/; # refix $y (does nothing for NaN)
604 $x; # already rounded by badd()
609 # increment arg by one
610 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
612 if ($x->{_e}->sign() eq '-')
614 return $x->badd($self->bone(),@r); # digits after dot
617 if (!$x->{_e}->is_zero()) # _e == 0 for NaN, inf, -inf
619 # 1e2 => 100, so after the shift below _m has a '0' as last digit
620 $x->{_m}->blsft($x->{_e},10); # 1e2 => 100
621 $x->{_e}->bzero(); # normalize
622 # we know that the last digit of $x will be '1' or '9', depending on the
626 if ($x->{sign} eq '+')
629 return $x->bnorm()->bround(@r);
631 elsif ($x->{sign} eq '-')
634 $x->{sign} = '+' if $x->{_m}->is_zero(); # -1 +1 => -0 => +0
635 return $x->bnorm()->bround(@r);
637 # inf, nan handling etc
638 $x->badd($self->bone(),@r); # badd() does round
643 # decrement arg by one
644 my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
646 if ($x->{_e}->sign() eq '-')
648 return $x->badd($self->bone('-'),@r); # digits after dot
651 if (!$x->{_e}->is_zero())
653 $x->{_m}->blsft($x->{_e},10); # 1e2 => 100
657 my $zero = $x->is_zero();
659 if (($x->{sign} eq '-') || $zero)
662 $x->{sign} = '-' if $zero; # 0 => 1 => -1
663 $x->{sign} = '+' if $x->{_m}->is_zero(); # -1 +1 => -0 => +0
664 return $x->bnorm()->round(@r);
667 elsif ($x->{sign} eq '+')
670 return $x->bnorm()->round(@r);
672 # inf, nan handling etc
673 $x->badd($self->bone('-'),@r); # does round
680 my ($self,$x,$base,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
682 # $base > 0, $base != 1; if $base == undef default to $base == e
685 # we need to limit the accuracy to protect against overflow
688 ($x,@params) = $x->_find_round_parameters($a,$p,$r);
690 # also takes care of the "error in _find_round_parameters?" case
691 return $x->bnan() if $x->{sign} ne '+' || $x->is_zero();
693 # no rounding at all, so must use fallback
694 if (scalar @params == 0)
696 # simulate old behaviour
697 $params[0] = $self->div_scale(); # and round to it as accuracy
698 $params[1] = undef; # P = undef
699 $scale = $params[0]+4; # at least four more for proper round
700 $params[2] = $r; # round mode by caller or undef
701 $fallback = 1; # to clear a/p afterwards
705 # the 4 below is empirical, and there might be cases where it is not
707 $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
710 return $x->bzero(@params) if $x->is_one();
711 # base not defined => base == Euler's constant e
714 # make object, since we don't feed it through objectify() to still get the
715 # case of $base == undef
716 $base = $self->new($base) unless ref($base);
717 # $base > 0; $base != 1
718 return $x->bnan() if $base->is_zero() || $base->is_one() ||
719 $base->{sign} ne '+';
720 # if $x == $base, we know the result must be 1.0
721 return $x->bone('+',@params) if $x->bcmp($base) == 0;
724 # when user set globals, they would interfere with our calculation, so
725 # disable them and later re-enable them
727 my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
728 my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
729 # we also need to disable any set A or P on $x (_find_round_parameters took
730 # them already into account), since these would interfere, too
731 delete $x->{_a}; delete $x->{_p};
732 # need to disable $upgrade in BigInt, to avoid deep recursion
733 local $Math::BigInt::upgrade = undef;
734 local $Math::BigFloat::downgrade = undef;
736 # upgrade $x if $x is not a BigFloat (handle BigInt input)
737 if (!$x->isa('Math::BigFloat'))
739 $x = Math::BigFloat->new($x);
745 # If the base is defined and an integer, try to calculate integer result
746 # first. This is very fast, and in case the real result was found, we can
748 if (defined $base && $base->is_int() && $x->is_int())
750 my $int = $x->{_m}->copy();
751 $int->blsft($x->{_e},10) unless $x->{_e}->is_zero();
752 $int->blog($base->as_number());
754 if ($base->copy()->bpow($int) == $x)
756 # found result, return it
758 $x->{_e} = $MBI->bzero();
766 # first calculate the log to base e (using reduction by 10 (and probably 2))
767 $self->_log_10($x,$scale);
769 # and if a different base was requested, convert it
772 $base = Math::BigFloat->new($base) unless $base->isa('Math::BigFloat');
773 # not ln, but some other base (don't modify $base)
774 $x->bdiv( $base->copy()->blog(undef,$scale), $scale );
778 # shortcut to not run through _find_round_parameters again
779 if (defined $params[0])
781 $x->bround($params[0],$params[2]); # then round accordingly
785 $x->bfround($params[1],$params[2]); # then round accordingly
789 # clear a/p after round, since user did not request it
790 delete $x->{_a}; delete $x->{_p};
793 $$abr = $ab; $$pbr = $pb;
800 # internal log function to calculate ln() based on Taylor series.
801 # Modifies $x in place.
802 my ($self,$x,$scale) = @_;
804 # in case of $x == 1, result is 0
805 return $x->bzero() if $x->is_one();
807 # http://www.efunda.com/math/taylor_series/logarithmic.cfm?search_string=log
811 # Taylor: | u 1 u^3 1 u^5 |
812 # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 0
813 # |_ v 3 v^3 5 v^5 _|
815 # This takes much more steps to calculate the result and is thus not used
818 # Taylor: | u 1 u^2 1 u^3 |
819 # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 1/2
820 # |_ x 2 x^2 3 x^3 _|
822 my ($limit,$v,$u,$below,$factor,$two,$next,$over,$f);
824 $v = $x->copy(); $v->binc(); # v = x+1
825 $x->bdec(); $u = $x->copy(); # u = x-1; x = x-1
826 $x->bdiv($v,$scale); # first term: u/v
829 $u *= $u; $v *= $v; # u^2, v^2
830 $below->bmul($v); # u^3, v^3
832 $factor = $self->new(3); $f = $self->new(2);
834 my $steps = 0 if DEBUG;
835 $limit = $self->new("1E-". ($scale-1));
838 # we calculate the next term, and add it to the last
839 # when the next term is below our limit, it won't affect the outcome
840 # anymore, so we stop
842 # calculating the next term simple from over/below will result in quite
843 # a time hog if the input has many digits, since over and below will
844 # accumulate more and more digits, and the result will also have many
845 # digits, but in the end it is rounded to $scale digits anyway. So if we
846 # round $over and $below first, we save a lot of time for the division
847 # (not with log(1.2345), but try log (123**123) to see what I mean. This
848 # can introduce a rounding error if the division result would be f.i.
849 # 0.1234500000001 and we round it to 5 digits it would become 0.12346, but
850 # if we truncated $over and $below we might get 0.12345. Does this matter
851 # for the end result? So we give $over and $below 4 more digits to be
852 # on the safe side (unscientific error handling as usual... :+D
854 $next = $over->copy->bround($scale+4)->bdiv(
855 $below->copy->bmul($factor)->bround($scale+4),
859 ## $next = $over->copy()->bdiv($below->copy()->bmul($factor),$scale);
861 last if $next->bacmp($limit) <= 0;
863 delete $next->{_a}; delete $next->{_p};
865 #print "step $x\n ($next - $limit = ",$next - $limit,")\n";
866 # calculate things for the next term
867 $over *= $u; $below *= $v; $factor->badd($f);
870 $steps++; print "step $steps = $x\n" if $steps % 10 == 0;
873 $x->bmul($f); # $x *= 2
874 print "took $steps steps\n" if DEBUG;
879 # Internal log function based on reducing input to the range of 0.1 .. 9.99
880 # and then "correcting" the result to the proper one. Modifies $x in place.
881 my ($self,$x,$scale) = @_;
883 # taking blog() from numbers greater than 10 takes a *very long* time, so we
884 # break the computation down into parts based on the observation that:
885 # blog(x*y) = blog(x) + blog(y)
886 # We set $y here to multiples of 10 so that $x is below 1 (the smaller $x is
887 # the faster it get's, especially because 2*$x takes about 10 times as long,
888 # so by dividing $x by 10 we make it at least factor 100 faster...)
890 # The same observation is valid for numbers smaller than 0.1 (e.g. computing
891 # log(1) is fastest, and the farther away we get from 1, the longer it takes)
892 # so we also 'break' this down by multiplying $x with 10 and subtract the
893 # log(10) afterwards to get the correct result.
895 # calculate nr of digits before dot
896 my $dbd = $x->{_m}->length() + $x->{_e}->numify();
898 # more than one digit (e.g. at least 10), but *not* exactly 10 to avoid
901 my $calc = 1; # do some calculation?
903 # disable the shortcut for 10, since we need log(10) and this would recurse
905 if ($x->{_e}->is_one() && $x->{_m}->is_one())
907 $dbd = 0; # disable shortcut
908 # we can use the cached value in these cases
909 if ($scale <= $LOG_10_A)
911 $x->bzero(); $x->badd($LOG_10);
912 $calc = 0; # no need to calc, but round
917 # disable the shortcut for 2, since we maybe have it cached
918 if ($x->{_e}->is_zero() && $x->{_m}->bcmp(2) == 0)
920 $dbd = 0; # disable shortcut
921 # we can use the cached value in these cases
922 if ($scale <= $LOG_2_A)
924 $x->bzero(); $x->badd($LOG_2);
925 $calc = 0; # no need to calc, but round
930 # if $x = 0.1, we know the result must be 0-log(10)
931 if ($calc != 0 && $x->{_e}->is_one('-') && $x->{_m}->is_one())
933 $dbd = 0; # disable shortcut
934 # we can use the cached value in these cases
935 if ($scale <= $LOG_10_A)
937 $x->bzero(); $x->bsub($LOG_10);
938 $calc = 0; # no need to calc, but round
942 return if $calc == 0; # already have the result
944 # default: these correction factors are undef and thus not used
945 my $l_10; # value of ln(10) to A of $scale
946 my $l_2; # value of ln(2) to A of $scale
948 # $x == 2 => 1, $x == 13 => 2, $x == 0.1 => 0, $x == 0.01 => -1
949 # so don't do this shortcut for 1 or 0
950 if (($dbd > 1) || ($dbd < 0))
952 # convert our cached value to an object if not already (avoid doing this
953 # at import() time, since not everybody needs this)
954 $LOG_10 = $self->new($LOG_10,undef,undef) unless ref $LOG_10;
956 #print "x = $x, dbd = $dbd, calc = $calc\n";
957 # got more than one digit before the dot, or more than one zero after the
959 # log(123) == log(1.23) + log(10) * 2
960 # log(0.0123) == log(1.23) - log(10) * 2
962 if ($scale <= $LOG_10_A)
965 #print "using cached value for l_10\n";
966 $l_10 = $LOG_10->copy(); # copy for mul
970 # else: slower, compute it (but don't cache it, because it could be big)
971 # also disable downgrade for this code path
972 local $Math::BigFloat::downgrade = undef;
973 #print "l_10 = $l_10 (self = $self',
974 # ", ref(l_10) = ",ref($l_10)," scale $scale)\n";
975 #print "calculating value for l_10, scale $scale\n";
976 $l_10 = $self->new(10)->blog(undef,$scale); # scale+4, actually
978 $dbd-- if ($dbd > 1); # 20 => dbd=2, so make it dbd=1
980 $dbd = $self->new($dbd);
982 $l_10->bmul($dbd); # log(10) * (digits_before_dot-1)
983 #print "l_10 = $l_10\n";
985 $x->{_e}->bsub($dbd); # 123 => 1.23
987 #print "calculating log($x) with scale=$scale\n";
991 # Now: 0.1 <= $x < 10 (and possible correction in l_10)
993 ### Since $x in the range 0.5 .. 1.5 is MUCH faster, we do a repeated div
994 ### or mul by 2 (maximum times 3, since x < 10 and x > 0.1)
996 my $half = $self->new('0.5');
997 my $twos = 0; # default: none (0 times)
998 my $two = $self->new(2);
999 while ($x->bacmp($half) <= 0)
1001 $twos--; $x->bmul($two);
1003 while ($x->bacmp($two) >= 0)
1005 $twos++; $x->bdiv($two,$scale+4); # keep all digits
1008 # $twos > 0 => did mul 2, < 0 => did div 2 (never both)
1009 # calculate correction factor based on ln(2)
1012 $LOG_2 = $self->new($LOG_2,undef,undef) unless ref $LOG_2;
1013 if ($scale <= $LOG_2_A)
1016 #print "using cached value for l_10\n";
1017 $l_2 = $LOG_2->copy(); # copy for mul
1021 # else: slower, compute it (but don't cache it, because it could be big)
1022 # also disable downgrade for this code path
1023 local $Math::BigFloat::downgrade = undef;
1024 #print "calculating value for l_2, scale $scale\n";
1025 $l_2 = $two->blog(undef,$scale); # scale+4, actually
1027 $l_2->bmul($twos); # * -2 => subtract, * 2 => add
1030 $self->_log($x,$scale); # need to do the "normal" way
1031 $x->badd($l_10) if defined $l_10; # correct it by ln(10)
1032 $x->badd($l_2) if defined $l_2; # and maybe by ln(2)
1033 # all done, $x contains now the result
1038 # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
1039 # does not modify arguments, but returns new object
1040 # Lowest Common Multiplicator
1042 my ($self,@arg) = objectify(0,@_);
1043 my $x = $self->new(shift @arg);
1044 while (@arg) { $x = _lcm($x,shift @arg); }
1050 # (BFLOAT or num_str, BFLOAT or num_str) return BINT
1051 # does not modify arguments, but returns new object
1052 # GCD -- Euclids algorithm Knuth Vol 2 pg 296
1054 my ($self,@arg) = objectify(0,@_);
1055 my $x = $self->new(shift @arg);
1056 while (@arg) { $x = _gcd($x,shift @arg); }
1060 ###############################################################################
1061 # is_foo methods (is_negative, is_positive are inherited from BigInt)
1065 # internal, return true if BigInt arg is zero or one, saving the
1066 # two calls to is_zero() and is_one()
1069 $x->{sign} eq '+' && ($x->is_zero() || $x->is_one());
1074 # return true if arg (BFLOAT or num_str) is an integer
1075 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1077 return 1 if ($x->{sign} =~ /^[+-]$/) && # NaN and +-inf aren't
1078 $x->{_e}->{sign} eq '+'; # 1e-1 => no integer
1084 # return true if arg (BFLOAT or num_str) is zero
1085 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1087 return 1 if $x->{sign} eq '+' && $x->{_m}->is_zero();
1093 # return true if arg (BFLOAT or num_str) is +1 or -1 if signis given
1094 my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
1096 $sign = '+' if !defined $sign || $sign ne '-';
1098 if ($x->{sign} eq $sign && $x->{_e}->is_zero() && $x->{_m}->is_one());
1104 # return true if arg (BFLOAT or num_str) is odd or false if even
1105 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1107 return 1 if ($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't
1108 ($x->{_e}->is_zero() && $x->{_m}->is_odd());
1114 # return true if arg (BINT or num_str) is even or false if odd
1115 my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
1117 return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't
1118 return 1 if ($x->{_e}->{sign} eq '+' # 123.45 is never
1119 && $x->{_m}->is_even()); # but 1200 is
1125 # multiply two numbers -- stolen from Knuth Vol 2 pg 233
1126 # (BINT or num_str, BINT or num_str) return BINT
1129 my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
1130 # objectify is costly, so avoid it
1131 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1133 ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1136 return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
1139 if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
1141 return $x->bnan() if $x->is_zero() || $y->is_zero();
1142 # result will always be +-inf:
1143 # +inf * +/+inf => +inf, -inf * -/-inf => +inf
1144 # +inf * -/-inf => -inf, -inf * +/+inf => -inf
1145 return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
1146 return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
1147 return $x->binf('-');
1150 return $x->bzero() if $x->is_zero() || $y->is_zero();
1152 return $upgrade->bmul($x,$y,$a,$p,$r) if defined $upgrade &&
1153 ((!$x->isa($self)) || (!$y->isa($self)));
1155 # aEb * cEd = (a*c)E(b+d)
1156 $x->{_m}->bmul($y->{_m});
1157 $x->{_e}->badd($y->{_e});
1159 $x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+';
1160 return $x->bnorm()->round($a,$p,$r,$y);
1165 # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return
1166 # (BFLOAT,BFLOAT) (quo,rem) or BFLOAT (only rem)
1169 my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
1170 # objectify is costly, so avoid it
1171 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1173 ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1176 return $self->_div_inf($x,$y)
1177 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
1179 # x== 0 # also: or y == 1 or y == -1
1180 return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
1183 return $upgrade->bdiv($upgrade->new($x),$y,$a,$p,$r) if defined $upgrade;
1185 # we need to limit the accuracy to protect against overflow
1187 my (@params,$scale);
1188 ($x,@params) = $x->_find_round_parameters($a,$p,$r,$y);
1190 return $x if $x->is_nan(); # error in _find_round_parameters?
1192 # no rounding at all, so must use fallback
1193 if (scalar @params == 0)
1195 # simulate old behaviour
1196 $params[0] = $self->div_scale(); # and round to it as accuracy
1197 $scale = $params[0]+4; # at least four more for proper round
1198 $params[2] = $r; # round mode by caller or undef
1199 $fallback = 1; # to clear a/p afterwards
1203 # the 4 below is empirical, and there might be cases where it is not
1205 $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
1207 my $lx = $x->{_m}->length(); my $ly = $y->{_m}->length();
1208 $scale = $lx if $lx > $scale;
1209 $scale = $ly if $ly > $scale;
1210 my $diff = $ly - $lx;
1211 $scale += $diff if $diff > 0; # if lx << ly, but not if ly << lx!
1213 # make copy of $x in case of list context for later reminder calculation
1215 if (wantarray && !$y->is_one())
1220 $x->{sign} = $x->{sign} ne $y->sign() ? '-' : '+';
1222 # check for / +-1 ( +/- 1E0)
1225 # promote BigInts and it's subclasses (except when already a BigFloat)
1226 $y = $self->new($y) unless $y->isa('Math::BigFloat');
1228 # need to disable $upgrade in BigInt, to avoid deep recursion
1229 local $Math::BigInt::upgrade = undef; # should be parent class vs MBI
1231 # calculate the result to $scale digits and then round it
1232 # a * 10 ** b / c * 10 ** d => a/c * 10 ** (b-d)
1233 $x->{_m}->blsft($scale,10);
1234 $x->{_m}->bdiv( $y->{_m} ); # a/c
1235 $x->{_e}->bsub( $y->{_e} ); # b-d
1236 $x->{_e}->bsub($scale); # correct for 10**scale
1237 $x->bnorm(); # remove trailing 0's
1240 # shortcut to not run through _find_round_parameters again
1241 if (defined $params[0])
1243 delete $x->{_a}; # clear before round
1244 $x->bround($params[0],$params[2]); # then round accordingly
1248 delete $x->{_p}; # clear before round
1249 $x->bfround($params[1],$params[2]); # then round accordingly
1253 # clear a/p after round, since user did not request it
1254 delete $x->{_a}; delete $x->{_p};
1261 $rem->bmod($y,@params); # copy already done
1265 $rem = $self->bzero();
1269 # clear a/p after round, since user did not request it
1270 delete $rem->{_a}; delete $rem->{_p};
1279 # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return reminder
1282 my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
1283 # objectify is costly, so avoid it
1284 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1286 ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1289 if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
1291 my ($d,$re) = $self->SUPER::_div_inf($x,$y);
1292 $x->{sign} = $re->{sign};
1293 $x->{_e} = $re->{_e};
1294 $x->{_m} = $re->{_m};
1295 return $x->round($a,$p,$r,$y);
1297 return $x->bnan() if $x->is_zero() && $y->is_zero();
1298 return $x if $y->is_zero();
1299 return $x->bnan() if $x->is_nan() || $y->is_nan();
1300 return $x->bzero() if $y->is_one() || $x->is_zero();
1302 # inf handling is missing here
1304 my $cmp = $x->bacmp($y); # equal or $x < $y?
1305 return $x->bzero($a,$p) if $cmp == 0; # $x == $y => result 0
1307 # only $y of the operands negative?
1308 my $neg = 0; $neg = 1 if $x->{sign} ne $y->{sign};
1310 $x->{sign} = $y->{sign}; # calc sign first
1311 return $x->round($a,$p,$r) if $cmp < 0 && $neg == 0; # $x < $y => result $x
1313 my $ym = $y->{_m}->copy();
1316 $ym->blsft($y->{_e},10) if $y->{_e}->{sign} eq '+' && !$y->{_e}->is_zero();
1318 # if $y has digits after dot
1319 my $shifty = 0; # correct _e of $x by this
1320 if ($y->{_e}->{sign} eq '-') # has digits after dot
1322 # 123 % 2.5 => 1230 % 25 => 5 => 0.5
1323 $shifty = $y->{_e}->copy()->babs(); # no more digits after dot
1324 $x->blsft($shifty,10); # 123 => 1230, $y->{_m} is already 25
1326 # $ym is now mantissa of $y based on exponent 0
1328 my $shiftx = 0; # correct _e of $x by this
1329 if ($x->{_e}->{sign} eq '-') # has digits after dot
1331 # 123.4 % 20 => 1234 % 200
1332 $shiftx = $x->{_e}->copy()->babs(); # no more digits after dot
1333 $ym->blsft($shiftx,10);
1335 # 123e1 % 20 => 1230 % 20
1336 if ($x->{_e}->{sign} eq '+' && !$x->{_e}->is_zero())
1338 $x->{_m}->blsft($x->{_e},10);
1340 $x->{_e} = $MBI->bzero() unless $x->{_e}->is_zero();
1342 $x->{_e}->bsub($shiftx) if $shiftx != 0;
1343 $x->{_e}->bsub($shifty) if $shifty != 0;
1345 # now mantissas are equalized, exponent of $x is adjusted, so calc result
1347 $x->{_m}->bmod($ym);
1349 $x->{sign} = '+' if $x->{_m}->is_zero(); # fix sign for -0
1352 if ($neg != 0) # one of them negative => correct in place
1355 $x->{_m} = $r->{_m};
1356 $x->{_e} = $r->{_e};
1357 $x->{sign} = '+' if $x->{_m}->is_zero(); # fix sign for -0
1361 $x->round($a,$p,$r,$y); # round and return
1366 # calculate $y'th root of $x
1369 my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
1370 # objectify is costly, so avoid it
1371 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1373 ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1376 # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
1377 return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
1378 $y->{sign} !~ /^\+$/;
1380 return $x if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
1382 # we need to limit the accuracy to protect against overflow
1384 my (@params,$scale);
1385 ($x,@params) = $x->_find_round_parameters($a,$p,$r);
1387 return $x if $x->is_nan(); # error in _find_round_parameters?
1389 # no rounding at all, so must use fallback
1390 if (scalar @params == 0)
1392 # simulate old behaviour
1393 $params[0] = $self->div_scale(); # and round to it as accuracy
1394 $scale = $params[0]+4; # at least four more for proper round
1395 $params[2] = $r; # round mode by caller or undef
1396 $fallback = 1; # to clear a/p afterwards
1400 # the 4 below is empirical, and there might be cases where it is not
1402 $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
1405 # when user set globals, they would interfere with our calculation, so
1406 # disable them and later re-enable them
1408 my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
1409 my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
1410 # we also need to disable any set A or P on $x (_find_round_parameters took
1411 # them already into account), since these would interfere, too
1412 delete $x->{_a}; delete $x->{_p};
1413 # need to disable $upgrade in BigInt, to avoid deep recursion
1414 local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
1416 # remember sign and make $x positive, since -4 ** (1/2) => -2
1417 my $sign = 0; $sign = 1 if $x->is_negative(); $x->babs();
1419 if ($y->bcmp(2) == 0) # normal square root
1421 $x->bsqrt($scale+4);
1423 elsif ($y->is_one('-'))
1426 my $u = $self->bone()->bdiv($x,$scale);
1427 # copy private parts over
1428 $x->{_m} = $u->{_m};
1429 $x->{_e} = $u->{_e};
1433 # calculate the broot() as integer result first, and if it fits, return
1434 # it rightaway (but only if $x and $y are integer):
1436 my $done = 0; # not yet
1437 if ($y->is_int() && $x->is_int())
1439 my $int = $x->{_m}->copy();
1440 $int->blsft($x->{_e},10) unless $x->{_e}->is_zero();
1441 $int->broot($y->as_number());
1443 if ($int->copy()->bpow($y) == $x)
1445 # found result, return it
1447 $x->{_e} = $MBI->bzero();
1454 my $u = $self->bone()->bdiv($y,$scale+4);
1455 delete $u->{_a}; delete $u->{_p}; # otherwise it conflicts
1456 $x->bpow($u,$scale+4); # el cheapo
1459 $x->bneg() if $sign == 1;
1461 # shortcut to not run through _find_round_parameters again
1462 if (defined $params[0])
1464 $x->bround($params[0],$params[2]); # then round accordingly
1468 $x->bfround($params[1],$params[2]); # then round accordingly
1472 # clear a/p after round, since user did not request it
1473 delete $x->{_a}; delete $x->{_p};
1476 $$abr = $ab; $$pbr = $pb;
1482 # calculate square root
1483 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1485 return $x->bnan() if $x->{sign} !~ /^[+]/; # NaN, -inf or < 0
1486 return $x if $x->{sign} eq '+inf'; # sqrt(inf) == inf
1487 return $x->round($a,$p,$r) if $x->is_zero() || $x->is_one();
1489 # we need to limit the accuracy to protect against overflow
1491 my (@params,$scale);
1492 ($x,@params) = $x->_find_round_parameters($a,$p,$r);
1494 return $x if $x->is_nan(); # error in _find_round_parameters?
1496 # no rounding at all, so must use fallback
1497 if (scalar @params == 0)
1499 # simulate old behaviour
1500 $params[0] = $self->div_scale(); # and round to it as accuracy
1501 $scale = $params[0]+4; # at least four more for proper round
1502 $params[2] = $r; # round mode by caller or undef
1503 $fallback = 1; # to clear a/p afterwards
1507 # the 4 below is empirical, and there might be cases where it is not
1509 $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
1512 # when user set globals, they would interfere with our calculation, so
1513 # disable them and later re-enable them
1515 my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
1516 my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
1517 # we also need to disable any set A or P on $x (_find_round_parameters took
1518 # them already into account), since these would interfere, too
1519 delete $x->{_a}; delete $x->{_p};
1520 # need to disable $upgrade in BigInt, to avoid deep recursion
1521 local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI
1523 my $xas = $x->as_number();
1524 my $gs = $xas->copy()->bsqrt(); # some guess
1526 if (($x->{_e}->{sign} ne '-') # guess can't be accurate if there are
1527 # digits after the dot
1528 && ($xas->bacmp($gs * $gs) == 0)) # guess hit the nail on the head?
1531 $x->{_m} = $gs; $x->{_e} = $MBI->bzero(); $x->bnorm();
1532 # shortcut to not run through _find_round_parameters again
1533 if (defined $params[0])
1535 $x->bround($params[0],$params[2]); # then round accordingly
1539 $x->bfround($params[1],$params[2]); # then round accordingly
1543 # clear a/p after round, since user did not request it
1544 delete $x->{_a}; delete $x->{_p};
1546 # re-enable A and P, upgrade is taken care of by "local"
1547 ${"$self\::accuracy"} = $ab; ${"$self\::precision"} = $pb;
1551 # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the accuracy
1552 # of the result by multipyling the input by 100 and then divide the integer
1553 # result of sqrt(input) by 10. Rounding afterwards returns the real result.
1554 # this will transform 123.456 (in $x) into 123456 (in $y1)
1555 my $y1 = $x->{_m}->copy();
1556 # We now make sure that $y1 has the same odd or even number of digits than
1557 # $x had. So when _e of $x is odd, we must shift $y1 by one digit left,
1558 # because we always must multiply by steps of 100 (sqrt(100) is 10) and not
1559 # steps of 10. The length of $x does not count, since an even or odd number
1560 # of digits before the dot is not changed by adding an even number of digits
1561 # after the dot (the result is still odd or even digits long).
1562 my $length = $y1->length();
1563 $y1->bmul(10) if $x->{_e}->is_odd();
1564 # now calculate how many digits the result of sqrt(y1) would have
1565 my $digits = int($length / 2);
1566 # but we need at least $scale digits, so calculate how many are missing
1567 my $shift = $scale - $digits;
1568 # that should never happen (we take care of integer guesses above)
1569 # $shift = 0 if $shift < 0;
1570 # multiply in steps of 100, by shifting left two times the "missing" digits
1571 $y1->blsft($shift*2,10);
1572 # now take the square root and truncate to integer
1574 # By "shifting" $y1 right (by creating a negative _e) we calculate the final
1575 # result, which is than later rounded to the desired scale.
1577 # calculate how many zeros $x had after the '.' (or before it, depending
1578 # on sign of $dat, the result should have half as many:
1579 my $dat = $length + $x->{_e}->numify();
1583 # no zeros after the dot (e.g. 1.23, 0.49 etc)
1584 # preserve half as many digits before the dot than the input had
1585 # (but round this "up")
1586 $dat = int(($dat+1)/2);
1590 $dat = int(($dat)/2);
1592 $x->{_e}= $MBI->new( $dat - $y1->length() );
1596 # shortcut to not run through _find_round_parameters again
1597 if (defined $params[0])
1599 $x->bround($params[0],$params[2]); # then round accordingly
1603 $x->bfround($params[1],$params[2]); # then round accordingly
1607 # clear a/p after round, since user did not request it
1608 delete $x->{_a}; delete $x->{_p};
1611 $$abr = $ab; $$pbr = $pb;
1617 # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
1618 # compute factorial number, modifies first argument
1621 my ($self,$x,@r) = (ref($_[0]),@_);
1622 # objectify is costly, so avoid it
1623 ($self,$x,@r) = objectify(1,@_) if !ref($x);
1625 return $x if $x->{sign} eq '+inf'; # inf => inf
1627 if (($x->{sign} ne '+') || # inf, NaN, <0 etc => NaN
1628 ($x->{_e}->{sign} ne '+')); # digits after dot?
1630 # use BigInt's bfac() for faster calc
1631 if (! $x->{_e}->is_zero())
1633 $x->{_m}->blsft($x->{_e},10); # change 12e1 to 120e0
1636 $x->{_m}->bfac(); # calculate factorial
1637 $x->bnorm()->round(@r); # norm again and round result
1642 # Calculate a power where $y is a non-integer, like 2 ** 0.5
1643 my ($x,$y,$a,$p,$r) = @_;
1646 # if $y == 0.5, it is sqrt($x)
1647 return $x->bsqrt($a,$p,$r,$y) if $y->bcmp('0.5') == 0;
1650 # a ** x == e ** (x * ln a)
1654 # Taylor: | u u^2 u^3 |
1655 # x ** y = 1 + | --- + --- + ----- + ... |
1658 # we need to limit the accuracy to protect against overflow
1660 my ($scale,@params);
1661 ($x,@params) = $x->_find_round_parameters($a,$p,$r);
1663 return $x if $x->is_nan(); # error in _find_round_parameters?
1665 # no rounding at all, so must use fallback
1666 if (scalar @params == 0)
1668 # simulate old behaviour
1669 $params[0] = $self->div_scale(); # and round to it as accuracy
1670 $params[1] = undef; # disable P
1671 $scale = $params[0]+4; # at least four more for proper round
1672 $params[2] = $r; # round mode by caller or undef
1673 $fallback = 1; # to clear a/p afterwards
1677 # the 4 below is empirical, and there might be cases where it is not
1679 $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
1682 # when user set globals, they would interfere with our calculation, so
1683 # disable them and later re-enable them
1685 my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
1686 my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
1687 # we also need to disable any set A or P on $x (_find_round_parameters took
1688 # them already into account), since these would interfere, too
1689 delete $x->{_a}; delete $x->{_p};
1690 # need to disable $upgrade in BigInt, to avoid deep recursion
1691 local $Math::BigInt::upgrade = undef;
1693 my ($limit,$v,$u,$below,$factor,$next,$over);
1695 $u = $x->copy()->blog(undef,$scale)->bmul($y);
1696 $v = $self->bone(); # 1
1697 $factor = $self->new(2); # 2
1698 $x->bone(); # first term: 1
1700 $below = $v->copy();
1703 $limit = $self->new("1E-". ($scale-1));
1707 # we calculate the next term, and add it to the last
1708 # when the next term is below our limit, it won't affect the outcome
1709 # anymore, so we stop
1710 $next = $over->copy()->bdiv($below,$scale);
1711 last if $next->bacmp($limit) <= 0;
1713 # calculate things for the next term
1714 $over *= $u; $below *= $factor; $factor->binc();
1718 # shortcut to not run through _find_round_parameters again
1719 if (defined $params[0])
1721 $x->bround($params[0],$params[2]); # then round accordingly
1725 $x->bfround($params[1],$params[2]); # then round accordingly
1729 # clear a/p after round, since user did not request it
1730 delete $x->{_a}; delete $x->{_p};
1733 $$abr = $ab; $$pbr = $pb;
1739 # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
1740 # compute power of two numbers, second arg is used as integer
1741 # modifies first argument
1744 my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
1745 # objectify is costly, so avoid it
1746 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1748 ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
1751 return $x if $x->{sign} =~ /^[+-]inf$/;
1752 return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
1753 return $x->bone() if $y->is_zero();
1754 return $x if $x->is_one() || $y->is_one();
1756 return $x->_pow($y,$a,$p,$r) if !$y->is_int(); # non-integer power
1758 my $y1 = $y->as_number(); # make bigint
1760 if ($x->{sign} eq '-' && $x->{_m}->is_one() && $x->{_e}->is_zero())
1762 # if $x == -1 and odd/even y => +1/-1 because +-1 ^ (+-1) => +-1
1763 return $y1->is_odd() ? $x : $x->babs(1);
1767 return $x if $y->{sign} eq '+'; # 0**y => 0 (if not y <= 0)
1768 # 0 ** -y => 1 / (0 ** y) => / 0! (1 / 0 => +inf)
1772 # calculate $x->{_m} ** $y and $x->{_e} * $y separately (faster)
1774 $x->{_m}->bpow($y1);
1775 $x->{_e}->bmul($y1);
1776 $x->{sign} = $nan if $x->{_m}->{sign} eq $nan || $x->{_e}->{sign} eq $nan;
1778 if ($y->{sign} eq '-')
1780 # modify $x in place!
1781 my $z = $x->copy(); $x->bzero()->binc();
1782 return $x->bdiv($z,$a,$p,$r); # round in one go (might ignore y's A!)
1784 $x->round($a,$p,$r,$y);
1787 ###############################################################################
1788 # rounding functions
1792 # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
1793 # $n == 0 means round to integer
1794 # expects and returns normalized numbers!
1795 my $x = shift; my $self = ref($x) || $x; $x = $self->new(shift) if !ref($x);
1797 return $x if $x->modify('bfround');
1799 my ($scale,$mode) = $x->_scale_p($self->precision(),$self->round_mode(),@_);
1800 return $x if !defined $scale; # no-op
1802 # never round a 0, +-inf, NaN
1805 $x->{_p} = $scale if !defined $x->{_p} || $x->{_p} < $scale; # -3 < -2
1808 return $x if $x->{sign} !~ /^[+-]$/;
1810 # don't round if x already has lower precision
1811 return $x if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p});
1813 $x->{_p} = $scale; # remember round in any case
1814 delete $x->{_a}; # and clear A
1817 # round right from the '.'
1819 return $x if $x->{_e}->{sign} eq '+'; # e >= 0 => nothing to round
1821 $scale = -$scale; # positive for simplicity
1822 my $len = $x->{_m}->length(); # length of mantissa
1824 # the following poses a restriction on _e, but if _e is bigger than a
1825 # scalar, you got other problems (memory etc) anyway
1826 my $dad = -($x->{_e}->numify()); # digits after dot
1827 my $zad = 0; # zeros after dot
1828 $zad = $dad - $len if (-$dad < -$len); # for 0.00..00xxx style
1830 #print "scale $scale dad $dad zad $zad len $len\n";
1831 # number bsstr len zad dad
1832 # 0.123 123e-3 3 0 3
1833 # 0.0123 123e-4 3 1 4
1836 # 1.2345 12345e-4 5 0 4
1838 # do not round after/right of the $dad
1839 return $x if $scale > $dad; # 0.123, scale >= 3 => exit
1841 # round to zero if rounding inside the $zad, but not for last zero like:
1842 # 0.0065, scale -2, round last '0' with following '65' (scale == zad case)
1843 return $x->bzero() if $scale < $zad;
1844 if ($scale == $zad) # for 0.006, scale -3 and trunc
1850 # adjust round-point to be inside mantissa
1853 $scale = $scale-$zad;
1857 my $dbd = $len - $dad; $dbd = 0 if $dbd < 0; # digits before dot
1858 $scale = $dbd+$scale;
1864 # round left from the '.'
1866 # 123 => 100 means length(123) = 3 - $scale (2) => 1
1868 my $dbt = $x->{_m}->length();
1870 my $dbd = $dbt + $x->{_e}->numify();
1871 # should be the same, so treat it as this
1872 $scale = 1 if $scale == 0;
1873 # shortcut if already integer
1874 return $x if $scale == 1 && $dbt <= $dbd;
1875 # maximum digits before dot
1880 # not enough digits before dot, so round to zero
1883 elsif ( $scale == $dbd )
1890 $scale = $dbd - $scale;
1893 # pass sign to bround for rounding modes '+inf' and '-inf'
1894 $x->{_m}->{sign} = $x->{sign};
1895 $x->{_m}->bround($scale,$mode);
1896 $x->{_m}->{sign} = '+'; # fix sign back
1902 # accuracy: preserve $N digits, and overwrite the rest with 0's
1903 my $x = shift; my $self = ref($x) || $x; $x = $self->new(shift) if !ref($x);
1905 if (($_[0] || 0) < 0)
1907 require Carp; Carp::croak ('bround() needs positive accuracy');
1910 my ($scale,$mode) = $x->_scale_a($self->accuracy(),$self->round_mode(),@_);
1911 return $x if !defined $scale; # no-op
1913 return $x if $x->modify('bround');
1915 # scale is now either $x->{_a}, $accuracy, or the user parameter
1916 # test whether $x already has lower accuracy, do nothing in this case
1917 # but do round if the accuracy is the same, since a math operation might
1918 # want to round a number with A=5 to 5 digits afterwards again
1919 return $x if defined $_[0] && defined $x->{_a} && $x->{_a} < $_[0];
1921 # scale < 0 makes no sense
1922 # never round a +-inf, NaN
1923 return $x if ($scale < 0) || $x->{sign} !~ /^[+-]$/;
1925 # 1: $scale == 0 => keep all digits
1926 # 2: never round a 0
1927 # 3: if we should keep more digits than the mantissa has, do nothing
1928 if ($scale == 0 || $x->is_zero() || $x->{_m}->length() <= $scale)
1930 $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale;
1934 # pass sign to bround for '+inf' and '-inf' rounding modes
1935 $x->{_m}->{sign} = $x->{sign};
1936 $x->{_m}->bround($scale,$mode); # round mantissa
1937 $x->{_m}->{sign} = '+'; # fix sign back
1938 $x->{_a} = $scale; # remember rounding
1939 delete $x->{_p}; # and clear P
1940 $x->bnorm(); # del trailing zeros gen. by bround()
1945 # return integer less or equal then $x
1946 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1948 return $x if $x->modify('bfloor');
1950 return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf
1952 # if $x has digits after dot
1953 if ($x->{_e}->{sign} eq '-')
1955 $x->{_e}->{sign} = '+'; # negate e
1956 $x->{_m}->brsft($x->{_e},10); # cut off digits after dot
1957 $x->{_e}->bzero(); # trunc/norm
1958 $x->{_m}->binc() if $x->{sign} eq '-'; # decrement if negative
1960 $x->round($a,$p,$r);
1965 # return integer greater or equal then $x
1966 my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
1968 return $x if $x->modify('bceil');
1969 return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf
1971 # if $x has digits after dot
1972 if ($x->{_e}->{sign} eq '-')
1974 #$x->{_m}->brsft(-$x->{_e},10);
1976 #$x++ if $x->{sign} eq '+';
1978 $x->{_e}->{sign} = '+'; # negate e
1979 $x->{_m}->brsft($x->{_e},10); # cut off digits after dot
1980 $x->{_e}->bzero(); # trunc/norm
1981 $x->{_m}->binc() if $x->{sign} eq '+'; # decrement if negative
1983 $x->round($a,$p,$r);
1988 # shift right by $y (divide by power of $n)
1991 my ($self,$x,$y,$n,$a,$p,$r) = (ref($_[0]),@_);
1992 # objectify is costly, so avoid it
1993 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
1995 ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
1998 return $x if $x->modify('brsft');
1999 return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf
2001 $n = 2 if !defined $n; $n = $self->new($n);
2002 $x->bdiv($n->bpow($y),$a,$p,$r,$y);
2007 # shift left by $y (multiply by power of $n)
2010 my ($self,$x,$y,$n,$a,$p,$r) = (ref($_[0]),@_);
2011 # objectify is costly, so avoid it
2012 if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
2014 ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
2017 return $x if $x->modify('blsft');
2018 return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf
2020 $n = 2 if !defined $n; $n = $self->new($n);
2021 $x->bmul($n->bpow($y),$a,$p,$r,$y);
2024 ###############################################################################
2028 # going through AUTOLOAD for every DESTROY is costly, avoid it by empty sub
2033 # make fxxx and bxxx both work by selectively mapping fxxx() to MBF::bxxx()
2034 # or falling back to MBI::bxxx()
2035 my $name = $AUTOLOAD;
2037 $name =~ s/(.*):://; # split package
2038 my $c = $1 || $class;
2040 $c->import() if $IMPORT == 0;
2041 if (!method_alias($name))
2045 # delayed load of Carp and avoid recursion
2047 Carp::croak ("$c: Can't call a method without name");
2049 if (!method_hand_up($name))
2051 # delayed load of Carp and avoid recursion
2053 Carp::croak ("Can't call $c\-\>$name, not a valid method");
2055 # try one level up, but subst. bxxx() for fxxx() since MBI only got bxxx()
2057 return &{"$MBI"."::$name"}(@_);
2059 my $bname = $name; $bname =~ s/^f/b/;
2067 # return a copy of the exponent
2068 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
2070 if ($x->{sign} !~ /^[+-]$/)
2072 my $s = $x->{sign}; $s =~ s/^[+-]//;
2073 return $self->new($s); # -inf, +inf => +inf
2075 return $x->{_e}->copy();
2080 # return a copy of the mantissa
2081 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
2083 if ($x->{sign} !~ /^[+-]$/)
2085 my $s = $x->{sign}; $s =~ s/^[+]//;
2086 return $self->new($s); # -inf, +inf => +inf
2088 my $m = $x->{_m}->copy(); # faster than going via bstr()
2089 $m->bneg() if $x->{sign} eq '-';
2096 # return a copy of both the exponent and the mantissa
2097 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
2099 if ($x->{sign} !~ /^[+-]$/)
2101 my $s = $x->{sign}; $s =~ s/^[+]//; my $se = $s; $se =~ s/^[-]//;
2102 return ($self->new($s),$self->new($se)); # +inf => inf and -inf,+inf => inf
2104 my $m = $x->{_m}->copy(); # faster than going via bstr()
2105 $m->bneg() if $x->{sign} eq '-';
2106 return ($m,$x->{_e}->copy());
2109 ##############################################################################
2110 # private stuff (internal use only)
2116 my $lib = ''; my @a;
2118 for ( my $i = 0; $i < $l ; $i++)
2120 if ( $_[$i] eq ':constant' )
2122 # This causes overlord er load to step in. 'binary' and 'integer'
2123 # are handled by BigInt.
2124 overload::constant float => sub { $self->new(shift); };
2126 elsif ($_[$i] eq 'upgrade')
2128 # this causes upgrading
2129 $upgrade = $_[$i+1]; # or undef to disable
2132 elsif ($_[$i] eq 'downgrade')
2134 # this causes downgrading
2135 $downgrade = $_[$i+1]; # or undef to disable
2138 elsif ($_[$i] eq 'lib')
2140 # alternative library
2141 $lib = $_[$i+1] || ''; # default Calc
2144 elsif ($_[$i] eq 'with')
2146 # alternative class for our private parts()
2147 $MBI = $_[$i+1] || 'Math::BigInt'; # default Math::BigInt
2156 # let use Math::BigInt lib => 'GMP'; use Math::BigFloat; still work
2157 my $mbilib = eval { Math::BigInt->config()->{lib} };
2158 if ((defined $mbilib) && ($MBI eq 'Math::BigInt'))
2160 # MBI already loaded
2161 $MBI->import('lib',"$lib,$mbilib", 'objectify');
2165 # MBI not loaded, or with ne "Math::BigInt"
2166 $lib .= ",$mbilib" if defined $mbilib;
2167 $lib =~ s/^,//; # don't leave empty
2168 # replacement library can handle lib statement, but also could ignore it
2171 # Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is
2172 # used in the same script, or eval inside import().
2173 my @parts = split /::/, $MBI; # Math::BigInt => Math BigInt
2174 my $file = pop @parts; $file .= '.pm'; # BigInt => BigInt.pm
2176 $file = File::Spec->catfile (@parts, $file);
2177 eval { require "$file"; };
2178 $MBI->import( lib => $lib, 'objectify' );
2182 my $rc = "use $MBI lib => '$lib', 'objectify';";
2188 require Carp; Carp::croak ("Couldn't load $MBI: $! $@");
2191 # any non :constant stuff is handled by our parent, Exporter
2192 # even if @_ is empty, to give it a chance
2193 $self->SUPER::import(@a); # for subclasses
2194 $self->export_to_level(1,$self,@a); # need this, too
2199 # adjust m and e so that m is smallest possible
2200 # round number according to accuracy and precision settings
2201 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
2203 return $x if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2205 my $zeros = $x->{_m}->_trailing_zeros(); # correct for trailing zeros
2208 my $z = $MBI->new($zeros,undef,undef);
2209 $x->{_m}->brsft($z,10); $x->{_e}->badd($z);
2213 # $x can only be 0Ey if there are no trailing zeros ('0' has 0 trailing
2214 # zeros). So, for something like 0Ey, set y to 1, and -0 => +0
2215 $x->{sign} = '+', $x->{_e}->bone() if $x->{_m}->is_zero();
2218 # this is to prevent automatically rounding when MBI's globals are set
2219 $x->{_m}->{_f} = MB_NEVER_ROUND;
2220 $x->{_e}->{_f} = MB_NEVER_ROUND;
2221 # 'forget' that mantissa was rounded via MBI::bround() in MBF's bfround()
2222 delete $x->{_m}->{_a}; delete $x->{_e}->{_a};
2223 delete $x->{_m}->{_p}; delete $x->{_e}->{_p};
2224 $x; # MBI bnorm is no-op, so dont call it
2227 ##############################################################################
2231 # return number as hexadecimal string (only for integers defined)
2232 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
2234 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2235 return '0x0' if $x->is_zero();
2237 return $nan if $x->{_e}->{sign} ne '+'; # how to do 1e-1 in hex!?
2239 my $z = $x->{_m}->copy();
2240 if (!$x->{_e}->is_zero()) # > 0
2242 $z->blsft($x->{_e},10);
2244 $z->{sign} = $x->{sign};
2250 # return number as binary digit string (only for integers defined)
2251 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
2253 return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc
2254 return '0b0' if $x->is_zero();
2256 return $nan if $x->{_e}->{sign} ne '+'; # how to do 1e-1 in hex!?
2258 my $z = $x->{_m}->copy();
2259 if (!$x->{_e}->is_zero()) # > 0
2261 $z->blsft($x->{_e},10);
2263 $z->{sign} = $x->{sign};
2269 # return copy as a bigint representation of this BigFloat number
2270 my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
2272 my $z = $x->{_m}->copy();
2273 if ($x->{_e}->{sign} eq '-') # < 0
2275 $x->{_e}->{sign} = '+'; # flip
2276 $z->brsft($x->{_e},10);
2277 $x->{_e}->{sign} = '-'; # flip back
2279 elsif (!$x->{_e}->is_zero()) # > 0
2281 $z->blsft($x->{_e},10);
2283 $z->{sign} = $x->{sign};
2290 my $class = ref($x) || $x;
2291 $x = $class->new(shift) unless ref($x);
2293 return 1 if $x->{_m}->is_zero();
2294 my $len = $x->{_m}->length();
2295 $len += $x->{_e} if $x->{_e}->sign() eq '+';
2298 my $t = $MBI->bzero();
2299 $t = $x->{_e}->copy()->babs() if $x->{_e}->sign() eq '-';
2310 Math::BigFloat - Arbitrary size floating point math package
2317 $x = Math::BigFloat->new($str); # defaults to 0
2318 $nan = Math::BigFloat->bnan(); # create a NotANumber
2319 $zero = Math::BigFloat->bzero(); # create a +0
2320 $inf = Math::BigFloat->binf(); # create a +inf
2321 $inf = Math::BigFloat->binf('-'); # create a -inf
2322 $one = Math::BigFloat->bone(); # create a +1
2323 $one = Math::BigFloat->bone('-'); # create a -1
2326 $x->is_zero(); # true if arg is +0
2327 $x->is_nan(); # true if arg is NaN
2328 $x->is_one(); # true if arg is +1
2329 $x->is_one('-'); # true if arg is -1
2330 $x->is_odd(); # true if odd, false for even
2331 $x->is_even(); # true if even, false for odd
2332 $x->is_pos(); # true if >= 0
2333 $x->is_neg(); # true if < 0
2334 $x->is_inf(sign); # true if +inf, or -inf (default is '+')
2336 $x->bcmp($y); # compare numbers (undef,<0,=0,>0)
2337 $x->bacmp($y); # compare absolutely (undef,<0,=0,>0)
2338 $x->sign(); # return the sign, either +,- or NaN
2339 $x->digit($n); # return the nth digit, counting from right
2340 $x->digit(-$n); # return the nth digit, counting from left
2342 # The following all modify their first argument. If you want to preserve
2343 # $x, use $z = $x->copy()->bXXX($y); See under L<CAVEATS> for why this is
2344 # neccessary when mixing $a = $b assigments with non-overloaded math.
2347 $x->bzero(); # set $i to 0
2348 $x->bnan(); # set $i to NaN
2349 $x->bone(); # set $x to +1
2350 $x->bone('-'); # set $x to -1
2351 $x->binf(); # set $x to inf
2352 $x->binf('-'); # set $x to -inf
2354 $x->bneg(); # negation
2355 $x->babs(); # absolute value
2356 $x->bnorm(); # normalize (no-op)
2357 $x->bnot(); # two's complement (bit wise not)
2358 $x->binc(); # increment x by 1
2359 $x->bdec(); # decrement x by 1
2361 $x->badd($y); # addition (add $y to $x)
2362 $x->bsub($y); # subtraction (subtract $y from $x)
2363 $x->bmul($y); # multiplication (multiply $x by $y)
2364 $x->bdiv($y); # divide, set $x to quotient
2365 # return (quo,rem) or quo if scalar
2367 $x->bmod($y); # modulus ($x % $y)
2368 $x->bpow($y); # power of arguments ($x ** $y)
2369 $x->blsft($y); # left shift
2370 $x->brsft($y); # right shift
2371 # return (quo,rem) or quo if scalar
2373 $x->blog(); # logarithm of $x to base e (Euler's number)
2374 $x->blog($base); # logarithm of $x to base $base (f.i. 2)
2376 $x->band($y); # bit-wise and
2377 $x->bior($y); # bit-wise inclusive or
2378 $x->bxor($y); # bit-wise exclusive or
2379 $x->bnot(); # bit-wise not (two's complement)
2381 $x->bsqrt(); # calculate square-root
2382 $x->broot($y); # $y'th root of $x (e.g. $y == 3 => cubic root)
2383 $x->bfac(); # factorial of $x (1*2*3*4*..$x)
2385 $x->bround($N); # accuracy: preserve $N digits
2386 $x->bfround($N); # precision: round to the $Nth digit
2388 $x->bfloor(); # return integer less or equal than $x
2389 $x->bceil(); # return integer greater or equal than $x
2391 # The following do not modify their arguments:
2393 bgcd(@values); # greatest common divisor
2394 blcm(@values); # lowest common multiplicator
2396 $x->bstr(); # return string
2397 $x->bsstr(); # return string in scientific notation
2399 $x->as_int(); # return $x as BigInt
2400 $x->exponent(); # return exponent as BigInt
2401 $x->mantissa(); # return mantissa as BigInt
2402 $x->parts(); # return (mantissa,exponent) as BigInt
2404 $x->length(); # number of digits (w/o sign and '.')
2405 ($l,$f) = $x->length(); # number of digits, and length of fraction
2407 $x->precision(); # return P of $x (or global, if P of $x undef)
2408 $x->precision($n); # set P of $x to $n
2409 $x->accuracy(); # return A of $x (or global, if A of $x undef)
2410 $x->accuracy($n); # set A $x to $n
2412 # these get/set the appropriate global value for all BigFloat objects
2413 Math::BigFloat->precision(); # Precision
2414 Math::BigFloat->accuracy(); # Accuracy
2415 Math::BigFloat->round_mode(); # rounding mode
2419 All operators (inlcuding basic math operations) are overloaded if you
2420 declare your big floating point numbers as
2422 $i = new Math::BigFloat '12_3.456_789_123_456_789E-2';
2424 Operations with overloaded operators preserve the arguments, which is
2425 exactly what you expect.
2427 =head2 Canonical notation
2429 Input to these routines are either BigFloat objects, or strings of the
2430 following four forms:
2444 C</^[+-]\d+E[+-]?\d+$/>
2448 C</^[+-]\d*\.\d+E[+-]?\d+$/>
2452 all with optional leading and trailing zeros and/or spaces. Additonally,
2453 numbers are allowed to have an underscore between any two digits.
2455 Empty strings as well as other illegal numbers results in 'NaN'.
2457 bnorm() on a BigFloat object is now effectively a no-op, since the numbers
2458 are always stored in normalized form. On a string, it creates a BigFloat
2463 Output values are BigFloat objects (normalized), except for bstr() and bsstr().
2465 The string output will always have leading and trailing zeros stripped and drop
2466 a plus sign. C<bstr()> will give you always the form with a decimal point,
2467 while C<bsstr()> (s for scientific) gives you the scientific notation.
2469 Input bstr() bsstr()
2471 ' -123 123 123' '-123123123' '-123123123E0'
2472 '00.0123' '0.0123' '123E-4'
2473 '123.45E-2' '1.2345' '12345E-4'
2474 '10E+3' '10000' '1E4'
2476 Some routines (C<is_odd()>, C<is_even()>, C<is_zero()>, C<is_one()>,
2477 C<is_nan()>) return true or false, while others (C<bcmp()>, C<bacmp()>)
2478 return either undef, <0, 0 or >0 and are suited for sort.
2480 Actual math is done by using the class defined with C<with => Class;> (which
2481 defaults to BigInts) to represent the mantissa and exponent.
2483 The sign C</^[+-]$/> is stored separately. The string 'NaN' is used to
2484 represent the result when input arguments are not numbers, as well as
2485 the result of dividing by zero.
2487 =head2 C<mantissa()>, C<exponent()> and C<parts()>
2489 C<mantissa()> and C<exponent()> return the said parts of the BigFloat
2490 as BigInts such that:
2492 $m = $x->mantissa();
2493 $e = $x->exponent();
2494 $y = $m * ( 10 ** $e );
2495 print "ok\n" if $x == $y;
2497 C<< ($m,$e) = $x->parts(); >> is just a shortcut giving you both of them.
2499 A zero is represented and returned as C<0E1>, B<not> C<0E0> (after Knuth).
2501 Currently the mantissa is reduced as much as possible, favouring higher
2502 exponents over lower ones (e.g. returning 1e7 instead of 10e6 or 10000000e0).
2503 This might change in the future, so do not depend on it.
2505 =head2 Accuracy vs. Precision
2507 See also: L<Rounding|Rounding>.
2509 Math::BigFloat supports both precision and accuracy. For a full documentation,
2510 examples and tips on these topics please see the large section in
2513 Since things like sqrt(2) or 1/3 must presented with a limited precision lest
2514 a operation consumes all resources, each operation produces no more than
2515 the requested number of digits.
2517 Please refer to BigInt's documentation for the precedence rules of which
2518 accuracy/precision setting will be used.
2520 If there is no gloabl precision set, B<and> the operation inquestion was not
2521 called with a requested precision or accuracy, B<and> the input $x has no
2522 accuracy or precision set, then a fallback parameter will be used. For
2523 historical reasons, it is called C<div_scale> and can be accessed via:
2525 $d = Math::BigFloat->div_scale(); # query
2526 Math::BigFloat->div_scale($n); # set to $n digits
2528 The default value is 40 digits.
2530 In case the result of one operation has more precision than specified,
2531 it is rounded. The rounding mode taken is either the default mode, or the one
2532 supplied to the operation after the I<scale>:
2534 $x = Math::BigFloat->new(2);
2535 Math::BigFloat->precision(5); # 5 digits max
2536 $y = $x->copy()->bdiv(3); # will give 0.66666
2537 $y = $x->copy()->bdiv(3,6); # will give 0.666666
2538 $y = $x->copy()->bdiv(3,6,'odd'); # will give 0.666667
2539 Math::BigFloat->round_mode('zero');
2540 $y = $x->copy()->bdiv(3,6); # will give 0.666666
2546 =item ffround ( +$scale )
2548 Rounds to the $scale'th place left from the '.', counting from the dot.
2549 The first digit is numbered 1.
2551 =item ffround ( -$scale )
2553 Rounds to the $scale'th place right from the '.', counting from the dot.
2557 Rounds to an integer.
2559 =item fround ( +$scale )
2561 Preserves accuracy to $scale digits from the left (aka significant digits)
2562 and pads the rest with zeros. If the number is between 1 and -1, the
2563 significant digits count from the first non-zero after the '.'
2565 =item fround ( -$scale ) and fround ( 0 )
2567 These are effectively no-ops.
2571 All rounding functions take as a second parameter a rounding mode from one of
2572 the following: 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'.
2574 The default rounding mode is 'even'. By using
2575 C<< Math::BigFloat->round_mode($round_mode); >> you can get and set the default
2576 mode for subsequent rounding. The usage of C<$Math::BigFloat::$round_mode> is
2577 no longer supported.
2578 The second parameter to the round functions then overrides the default
2581 The C<as_number()> function returns a BigInt from a Math::BigFloat. It uses
2582 'trunc' as rounding mode to make it equivalent to:
2587 You can override this by passing the desired rounding mode as parameter to
2590 $x = Math::BigFloat->new(2.5);
2591 $y = $x->as_number('odd'); # $y = 3
2597 =head1 Autocreating constants
2599 After C<use Math::BigFloat ':constant'> all the floating point constants
2600 in the given scope are converted to C<Math::BigFloat>. This conversion
2601 happens at compile time.
2605 perl -MMath::BigFloat=:constant -e 'print 2E-100,"\n"'
2607 prints the value of C<2E-100>. Note that without conversion of
2608 constants the expression 2E-100 will be calculated as normal floating point
2611 Please note that ':constant' does not affect integer constants, nor binary
2612 nor hexadecimal constants. Use L<bignum> or L<Math::BigInt> to get this to
2617 Math with the numbers is done (by default) by a module called
2618 Math::BigInt::Calc. This is equivalent to saying:
2620 use Math::BigFloat lib => 'Calc';
2622 You can change this by using:
2624 use Math::BigFloat lib => 'BitVect';
2626 The following would first try to find Math::BigInt::Foo, then
2627 Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
2629 use Math::BigFloat lib => 'Foo,Math::BigInt::Bar';
2631 Calc.pm uses as internal format an array of elements of some decimal base
2632 (usually 1e7, but this might be differen for some systems) with the least
2633 significant digit first, while BitVect.pm uses a bit vector of base 2, most
2634 significant bit first. Other modules might use even different means of
2635 representing the numbers. See the respective module documentation for further
2638 Please note that Math::BigFloat does B<not> use the denoted library itself,
2639 but it merely passes the lib argument to Math::BigInt. So, instead of the need
2642 use Math::BigInt lib => 'GMP';
2645 you can roll it all into one line:
2647 use Math::BigFloat lib => 'GMP';
2649 It is also possible to just require Math::BigFloat:
2651 require Math::BigFloat;
2653 This will load the neccessary things (like BigInt) when they are needed, and
2656 Use the lib, Luke! And see L<Using Math::BigInt::Lite> for more details than
2657 you ever wanted to know about loading a different library.
2659 =head2 Using Math::BigInt::Lite
2661 It is possible to use L<Math::BigInt::Lite> with Math::BigFloat:
2664 use Math::BigFloat with => 'Math::BigInt::Lite';
2666 There is no need to "use Math::BigInt" or "use Math::BigInt::Lite", but you
2667 can combine these if you want. For instance, you may want to use
2668 Math::BigInt objects in your main script, too.
2672 use Math::BigFloat with => 'Math::BigInt::Lite';
2674 Of course, you can combine this with the C<lib> parameter.
2677 use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'GMP,Pari';
2679 There is no need for a "use Math::BigInt;" statement, even if you want to
2680 use Math::BigInt's, since Math::BigFloat will needs Math::BigInt and thus
2681 always loads it. But if you add it, add it B<before>:
2685 use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'GMP,Pari';
2687 Notice that the module with the last C<lib> will "win" and thus
2688 it's lib will be used if the lib is available:
2691 use Math::BigInt lib => 'Bar,Baz';
2692 use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'Foo';
2694 That would try to load Foo, Bar, Baz and Calc (in that order). Or in other
2695 words, Math::BigFloat will try to retain previously loaded libs when you
2696 don't specify it onem but if you specify one, it will try to load them.
2698 Actually, the lib loading order would be "Bar,Baz,Calc", and then
2699 "Foo,Bar,Baz,Calc", but independend of which lib exists, the result is the
2700 same as trying the latter load alone, except for the fact that one of Bar or
2701 Baz might be loaded needlessly in an intermidiate step (and thus hang around
2702 and waste memory). If neither Bar nor Baz exist (or don't work/compile), they
2703 will still be tried to be loaded, but this is not as time/memory consuming as
2704 actually loading one of them. Still, this type of usage is not recommended due
2707 The old way (loading the lib only in BigInt) still works though:
2710 use Math::BigInt lib => 'Bar,Baz';
2713 You can even load Math::BigInt afterwards:
2717 use Math::BigInt lib => 'Bar,Baz';
2719 But this has the same problems like #5, it will first load Calc
2720 (Math::BigFloat needs Math::BigInt and thus loads it) and then later Bar or
2721 Baz, depending on which of them works and is usable/loadable. Since this
2722 loads Calc unnecc., it is not recommended.
2724 Since it also possible to just require Math::BigFloat, this poses the question
2725 about what libary this will use:
2727 require Math::BigFloat;
2728 my $x = Math::BigFloat->new(123); $x += 123;
2730 It will use Calc. Please note that the call to import() is still done, but
2731 only when you use for the first time some Math::BigFloat math (it is triggered
2732 via any constructor, so the first time you create a Math::BigFloat, the load
2733 will happen in the background). This means:
2735 require Math::BigFloat;
2736 Math::BigFloat->import ( lib => 'Foo,Bar' );
2738 would be the same as:
2740 use Math::BigFloat lib => 'Foo, Bar';
2742 But don't try to be clever to insert some operations in between:
2744 require Math::BigFloat;
2745 my $x = Math::BigFloat->bone() + 4; # load BigInt and Calc
2746 Math::BigFloat->import( lib => 'Pari' ); # load Pari, too
2747 $x = Math::BigFloat->bone()+4; # now use Pari
2749 While this works, it loads Calc needlessly. But maybe you just wanted that?
2751 B<Examples #3 is highly recommended> for daily usage.
2755 Please see the file BUGS in the CPAN distribution Math::BigInt for known bugs.
2761 =item stringify, bstr()
2763 Both stringify and bstr() now drop the leading '+'. The old code would return
2764 '+1.23', the new returns '1.23'. See the documentation in L<Math::BigInt> for
2765 reasoning and details.
2769 The following will probably not do what you expect:
2771 print $c->bdiv(123.456),"\n";
2773 It prints both quotient and reminder since print works in list context. Also,
2774 bdiv() will modify $c, so be carefull. You probably want to use
2776 print $c / 123.456,"\n";
2777 print scalar $c->bdiv(123.456),"\n"; # or if you want to modify $c
2781 =item Modifying and =
2785 $x = Math::BigFloat->new(5);
2788 It will not do what you think, e.g. making a copy of $x. Instead it just makes
2789 a second reference to the B<same> object and stores it in $y. Thus anything
2790 that modifies $x will modify $y (except overloaded math operators), and vice
2791 versa. See L<Math::BigInt> for details and how to avoid that.
2795 C<bpow()> now modifies the first argument, unlike the old code which left
2796 it alone and only returned the result. This is to be consistent with
2797 C<badd()> etc. The first will modify $x, the second one won't:
2799 print bpow($x,$i),"\n"; # modify $x
2800 print $x->bpow($i),"\n"; # ditto
2801 print $x ** $i,"\n"; # leave $x alone
2807 L<Math::BigInt>, L<Math::BigRat> and L<Math::Big> as well as
2808 L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.
2810 The pragmas L<bignum>, L<bigint> and L<bigrat> might also be of interest
2811 because they solve the autoupgrading/downgrading issue, at least partly.
2814 L<http://search.cpan.org/search?mode=module&query=Math%3A%3ABigInt> contains
2815 more documentation including a full version history, testcases, empty
2816 subclass files and benchmarks.
2820 This program is free software; you may redistribute it and/or modify it under
2821 the same terms as Perl itself.
2825 Mark Biggar, overloaded interface by Ilya Zakharevich.
2826 Completely rewritten by Tels http://bloodgate.com in 2001, 2002, and still