summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/Math::BigInt.3pm
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/Math::BigInt.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/Math::BigInt.3pm2998
1 files changed, 2998 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/Math::BigInt.3pm b/upstream/mageia-cauldron/man3pm/Math::BigInt.3pm
new file mode 100644
index 00000000..8b5ad787
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/Math::BigInt.3pm
@@ -0,0 +1,2998 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "Math::BigInt 3pm"
+.TH Math::BigInt 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+Math::BigInt \- arbitrary size integer math package
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+.Vb 1
+\& use Math::BigInt;
+\&
+\& # or make it faster with huge numbers: install (optional)
+\& # Math::BigInt::GMP and always use (it falls back to
+\& # pure Perl if the GMP library is not installed):
+\& # (See also the L<MATH LIBRARY> section!)
+\&
+\& # to warn if Math::BigInt::GMP cannot be found, use
+\& use Math::BigInt lib => \*(AqGMP\*(Aq;
+\&
+\& # to suppress the warning if Math::BigInt::GMP cannot be found, use
+\& # use Math::BigInt try => \*(AqGMP\*(Aq;
+\&
+\& # to die if Math::BigInt::GMP cannot be found, use
+\& # use Math::BigInt only => \*(AqGMP\*(Aq;
+\&
+\& # Configuration methods (may be used as class methods and instance methods)
+\&
+\& Math::BigInt\->accuracy(); # get class accuracy
+\& Math::BigInt\->accuracy($n); # set class accuracy
+\& Math::BigInt\->precision(); # get class precision
+\& Math::BigInt\->precision($n); # set class precision
+\& Math::BigInt\->round_mode(); # get class rounding mode
+\& Math::BigInt\->round_mode($m); # set global round mode, must be one of
+\& # \*(Aqeven\*(Aq, \*(Aqodd\*(Aq, \*(Aq+inf\*(Aq, \*(Aq\-inf\*(Aq, \*(Aqzero\*(Aq,
+\& # \*(Aqtrunc\*(Aq, or \*(Aqcommon\*(Aq
+\& Math::BigInt\->config(); # return hash with configuration
+\&
+\& # Constructor methods (when the class methods below are used as instance
+\& # methods, the value is assigned the invocand)
+\&
+\& $x = Math::BigInt\->new($str); # defaults to 0
+\& $x = Math::BigInt\->new(\*(Aq0x123\*(Aq); # from hexadecimal
+\& $x = Math::BigInt\->new(\*(Aq0b101\*(Aq); # from binary
+\& $x = Math::BigInt\->from_hex(\*(Aqcafe\*(Aq); # from hexadecimal
+\& $x = Math::BigInt\->from_oct(\*(Aq377\*(Aq); # from octal
+\& $x = Math::BigInt\->from_bin(\*(Aq1101\*(Aq); # from binary
+\& $x = Math::BigInt\->from_base(\*(Aqwhy\*(Aq, 36); # from any base
+\& $x = Math::BigInt\->from_base_num([1, 0], 2); # from any base
+\& $x = Math::BigInt\->bzero(); # create a +0
+\& $x = Math::BigInt\->bone(); # create a +1
+\& $x = Math::BigInt\->bone(\*(Aq\-\*(Aq); # create a \-1
+\& $x = Math::BigInt\->binf(); # create a +inf
+\& $x = Math::BigInt\->binf(\*(Aq\-\*(Aq); # create a \-inf
+\& $x = Math::BigInt\->bnan(); # create a Not\-A\-Number
+\& $x = Math::BigInt\->bpi(); # returns pi
+\&
+\& $y = $x\->copy(); # make a copy (unlike $y = $x)
+\& $y = $x\->as_int(); # return as a Math::BigInt
+\& $y = $x\->as_float(); # return as a Math::BigFloat
+\& $y = $x\->as_rat(); # return as a Math::BigRat
+\&
+\& # Boolean methods (these don\*(Aqt modify the invocand)
+\&
+\& $x\->is_zero(); # if $x is 0
+\& $x\->is_one(); # if $x is +1
+\& $x\->is_one("+"); # ditto
+\& $x\->is_one("\-"); # if $x is \-1
+\& $x\->is_inf(); # if $x is +inf or \-inf
+\& $x\->is_inf("+"); # if $x is +inf
+\& $x\->is_inf("\-"); # if $x is \-inf
+\& $x\->is_nan(); # if $x is NaN
+\&
+\& $x\->is_positive(); # if $x > 0
+\& $x\->is_pos(); # ditto
+\& $x\->is_negative(); # if $x < 0
+\& $x\->is_neg(); # ditto
+\&
+\& $x\->is_odd(); # if $x is odd
+\& $x\->is_even(); # if $x is even
+\& $x\->is_int(); # if $x is an integer
+\&
+\& # Comparison methods
+\&
+\& $x\->bcmp($y); # compare numbers (undef, < 0, == 0, > 0)
+\& $x\->bacmp($y); # compare absolutely (undef, < 0, == 0, > 0)
+\& $x\->beq($y); # true if and only if $x == $y
+\& $x\->bne($y); # true if and only if $x != $y
+\& $x\->blt($y); # true if and only if $x < $y
+\& $x\->ble($y); # true if and only if $x <= $y
+\& $x\->bgt($y); # true if and only if $x > $y
+\& $x\->bge($y); # true if and only if $x >= $y
+\&
+\& # Arithmetic methods
+\&
+\& $x\->bneg(); # negation
+\& $x\->babs(); # absolute value
+\& $x\->bsgn(); # sign function (\-1, 0, 1, or NaN)
+\& $x\->bnorm(); # normalize (no\-op)
+\& $x\->binc(); # increment $x by 1
+\& $x\->bdec(); # decrement $x by 1
+\& $x\->badd($y); # addition (add $y to $x)
+\& $x\->bsub($y); # subtraction (subtract $y from $x)
+\& $x\->bmul($y); # multiplication (multiply $x by $y)
+\& $x\->bmuladd($y,$z); # $x = $x * $y + $z
+\& $x\->bdiv($y); # division (floored), set $x to quotient
+\& # return (quo,rem) or quo if scalar
+\& $x\->btdiv($y); # division (truncated), set $x to quotient
+\& # return (quo,rem) or quo if scalar
+\& $x\->bmod($y); # modulus (x % y)
+\& $x\->btmod($y); # modulus (truncated)
+\& $x\->bmodinv($mod); # modular multiplicative inverse
+\& $x\->bmodpow($y,$mod); # modular exponentiation (($x ** $y) % $mod)
+\& $x\->bpow($y); # power of arguments (x ** y)
+\& $x\->blog(); # logarithm of $x to base e (Euler\*(Aqs number)
+\& $x\->blog($base); # logarithm of $x to base $base (e.g., base 2)
+\& $x\->bexp(); # calculate e ** $x where e is Euler\*(Aqs number
+\& $x\->bnok($y); # x over y (binomial coefficient n over k)
+\& $x\->buparrow($n, $y); # Knuth\*(Aqs up\-arrow notation
+\& $x\->backermann($y); # the Ackermann function
+\& $x\->bsin(); # sine
+\& $x\->bcos(); # cosine
+\& $x\->batan(); # inverse tangent
+\& $x\->batan2($y); # two\-argument inverse tangent
+\& $x\->bsqrt(); # calculate square root
+\& $x\->broot($y); # $y\*(Aqth root of $x (e.g. $y == 3 => cubic root)
+\& $x\->bfac(); # factorial of $x (1*2*3*4*..$x)
+\& $x\->bdfac(); # double factorial of $x ($x*($x\-2)*($x\-4)*...)
+\& $x\->btfac(); # triple factorial of $x ($x*($x\-3)*($x\-6)*...)
+\& $x\->bmfac($k); # $k\*(Aqth multi\-factorial of $x ($x*($x\-$k)*...)
+\&
+\& $x\->blsft($n); # left shift $n places in base 2
+\& $x\->blsft($n,$b); # left shift $n places in base $b
+\& # returns (quo,rem) or quo (scalar context)
+\& $x\->brsft($n); # right shift $n places in base 2
+\& $x\->brsft($n,$b); # right shift $n places in base $b
+\& # returns (quo,rem) or quo (scalar context)
+\&
+\& # Bitwise methods
+\&
+\& $x\->band($y); # bitwise and
+\& $x\->bior($y); # bitwise inclusive or
+\& $x\->bxor($y); # bitwise exclusive or
+\& $x\->bnot(); # bitwise not (two\*(Aqs complement)
+\&
+\& # Rounding methods
+\& $x\->round($A,$P,$mode); # round to accuracy or precision using
+\& # rounding mode $mode
+\& $x\->bround($n); # accuracy: preserve $n digits
+\& $x\->bfround($n); # $n > 0: round to $nth digit left of dec. point
+\& # $n < 0: round to $nth digit right of dec. point
+\& $x\->bfloor(); # round towards minus infinity
+\& $x\->bceil(); # round towards plus infinity
+\& $x\->bint(); # round towards zero
+\&
+\& # Other mathematical methods
+\&
+\& $x\->bgcd($y); # greatest common divisor
+\& $x\->blcm($y); # least common multiple
+\&
+\& # Object property methods (do not modify the invocand)
+\&
+\& $x\->sign(); # the sign, either +, \- or NaN
+\& $x\->digit($n); # the nth digit, counting from the right
+\& $x\->digit(\-$n); # the nth digit, counting from the left
+\& $x\->length(); # return number of digits in number
+\& ($xl,$f) = $x\->length(); # length of number and length of fraction
+\& # part, latter is always 0 digits long
+\& # for Math::BigInt objects
+\& $x\->mantissa(); # return (signed) mantissa as a Math::BigInt
+\& $x\->exponent(); # return exponent as a Math::BigInt
+\& $x\->parts(); # return (mantissa,exponent) as a Math::BigInt
+\& $x\->sparts(); # mantissa and exponent (as integers)
+\& $x\->nparts(); # mantissa and exponent (normalised)
+\& $x\->eparts(); # mantissa and exponent (engineering notation)
+\& $x\->dparts(); # integer and fraction part
+\& $x\->fparts(); # numerator and denominator
+\& $x\->numerator(); # numerator
+\& $x\->denominator(); # denominator
+\&
+\& # Conversion methods (do not modify the invocand)
+\&
+\& $x\->bstr(); # decimal notation, possibly zero padded
+\& $x\->bsstr(); # string in scientific notation with integers
+\& $x\->bnstr(); # string in normalized notation
+\& $x\->bestr(); # string in engineering notation
+\& $x\->bfstr(); # string in fractional notation
+\&
+\& $x\->to_hex(); # as signed hexadecimal string
+\& $x\->to_bin(); # as signed binary string
+\& $x\->to_oct(); # as signed octal string
+\& $x\->to_bytes(); # as byte string
+\& $x\->to_base($b); # as string in any base
+\& $x\->to_base_num($b); # as array of integers in any base
+\&
+\& $x\->as_hex(); # as signed hexadecimal string with prefixed 0x
+\& $x\->as_bin(); # as signed binary string with prefixed 0b
+\& $x\->as_oct(); # as signed octal string with prefixed 0
+\&
+\& # Other conversion methods
+\&
+\& $x\->numify(); # return as scalar (might overflow or underflow)
+.Ve
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+Math::BigInt provides support for arbitrary precision integers. Overloading is
+also provided for Perl operators.
+.SS Input
+.IX Subsection "Input"
+Input values to these routines may be any scalar number or string that looks
+like a number and represents an integer. Anything that is accepted by Perl as a
+literal numeric constant should be accepted by this module, except that finite
+non-integers return NaN.
+.IP \(bu 4
+Leading and trailing whitespace is ignored.
+.IP \(bu 4
+Leading zeros are ignored, except for floating point numbers with a binary
+exponent, in which case the number is interpreted as an octal floating point
+number. For example, "01.4p+0" gives 1.5, "00.4p+0" gives 0.5, but "0.4p+0"
+gives a NaN. And while "0377" gives 255, "0377p0" gives 255.
+.IP \(bu 4
+If the string has a "0x" or "0X" prefix, it is interpreted as a hexadecimal
+number.
+.IP \(bu 4
+If the string has a "0o" or "0O" prefix, it is interpreted as an octal number. A
+floating point literal with a "0" prefix is also interpreted as an octal number.
+.IP \(bu 4
+If the string has a "0b" or "0B" prefix, it is interpreted as a binary number.
+.IP \(bu 4
+Underline characters are allowed in the same way as they are allowed in literal
+numerical constants.
+.IP \(bu 4
+If the string can not be interpreted, or does not represent a finite integer,
+NaN is returned.
+.IP \(bu 4
+For hexadecimal, octal, and binary floating point numbers, the exponent must be
+separated from the significand (mantissa) by the letter "p" or "P", not "e" or
+"E" as with decimal numbers.
+.PP
+Some examples of valid string input
+.PP
+.Vb 1
+\& Input string Resulting value
+\&
+\& 123 123
+\& 1.23e2 123
+\& 12300e\-2 123
+\&
+\& 67_538_754 67538754
+\& \-4_5_6.7_8_9e+0_1_0 \-4567890000000
+\&
+\& 0x13a 314
+\& 0x13ap0 314
+\& 0x1.3ap+8 314
+\& 0x0.00013ap+24 314
+\& 0x13a000p\-12 314
+\&
+\& 0o472 314
+\& 0o1.164p+8 314
+\& 0o0.0001164p+20 314
+\& 0o1164000p\-10 314
+\&
+\& 0472 472 Note!
+\& 01.164p+8 314
+\& 00.0001164p+20 314
+\& 01164000p\-10 314
+\&
+\& 0b100111010 314
+\& 0b1.0011101p+8 314
+\& 0b0.00010011101p+12 314
+\& 0b100111010000p\-3 314
+.Ve
+.PP
+Input given as scalar numbers might lose precision. Quote your input to ensure
+that no digits are lost:
+.PP
+.Vb 2
+\& $x = Math::BigInt\->new( 56789012345678901234 ); # bad
+\& $x = Math::BigInt\->new(\*(Aq56789012345678901234\*(Aq); # good
+.Ve
+.PP
+Currently, \f(CW\*(C`Math::BigInt\-\*(C'\fR\fBnew()\fR> (no input argument) and
+\&\f(CW\*(C`Math::BigInt\-\*(C'\fRnew("")> return 0. This might change in the future, so always
+use the following explicit forms to get a zero:
+.PP
+.Vb 1
+\& $zero = Math::BigInt\->bzero();
+.Ve
+.SS Output
+.IX Subsection "Output"
+Output values are usually Math::BigInt objects.
+.PP
+Boolean operators \f(CWis_zero()\fR, \f(CWis_one()\fR, \f(CWis_inf()\fR, etc. return true or
+false.
+.PP
+Comparison operators \f(CWbcmp()\fR and \f(CWbacmp()\fR) return \-1, 0, 1, or
+undef.
+.SH METHODS
+.IX Header "METHODS"
+.SS "Configuration methods"
+.IX Subsection "Configuration methods"
+Each of the methods below (except \fBconfig()\fR, \fBaccuracy()\fR and \fBprecision()\fR) accepts
+three additional parameters. These arguments \f(CW$A\fR, \f(CW$P\fR and \f(CW$R\fR are
+\&\f(CW\*(C`accuracy\*(C'\fR, \f(CW\*(C`precision\*(C'\fR and \f(CW\*(C`round_mode\*(C'\fR. Please see the section about
+"ACCURACY and PRECISION" for more information.
+.PP
+Setting a class variable effects all object instance that are created
+afterwards.
+.IP \fBaccuracy()\fR 4
+.IX Item "accuracy()"
+.Vb 2
+\& Math::BigInt\->accuracy(5); # set class accuracy
+\& $x\->accuracy(5); # set instance accuracy
+\&
+\& $A = Math::BigInt\->accuracy(); # get class accuracy
+\& $A = $x\->accuracy(); # get instance accuracy
+.Ve
+.Sp
+Set or get the accuracy, i.e., the number of significant digits. The accuracy
+must be an integer. If the accuracy is set to \f(CW\*(C`undef\*(C'\fR, no rounding is done.
+.Sp
+Alternatively, one can round the results explicitly using one of "\fBround()\fR",
+"\fBbround()\fR" or "\fBbfround()\fR" or by passing the desired accuracy to the method
+as an additional parameter:
+.Sp
+.Vb 4
+\& my $x = Math::BigInt\->new(30000);
+\& my $y = Math::BigInt\->new(7);
+\& print scalar $x\->copy()\->bdiv($y, 2); # prints 4300
+\& print scalar $x\->copy()\->bdiv($y)\->bround(2); # prints 4300
+.Ve
+.Sp
+Please see the section about "ACCURACY and PRECISION" for further details.
+.Sp
+.Vb 4
+\& $y = Math::BigInt\->new(1234567); # $y is not rounded
+\& Math::BigInt\->accuracy(4); # set class accuracy to 4
+\& $x = Math::BigInt\->new(1234567); # $x is rounded automatically
+\& print "$x $y"; # prints "1235000 1234567"
+\&
+\& print $x\->accuracy(); # prints "4"
+\& print $y\->accuracy(); # also prints "4", since
+\& # class accuracy is 4
+\&
+\& Math::BigInt\->accuracy(5); # set class accuracy to 5
+\& print $x\->accuracy(); # prints "4", since instance
+\& # accuracy is 4
+\& print $y\->accuracy(); # prints "5", since no instance
+\& # accuracy, and class accuracy is 5
+.Ve
+.Sp
+Note: Each class has it's own globals separated from Math::BigInt, but it is
+possible to subclass Math::BigInt and make the globals of the subclass aliases
+to the ones from Math::BigInt.
+.IP \fBprecision()\fR 4
+.IX Item "precision()"
+.Vb 2
+\& Math::BigInt\->precision(\-2); # set class precision
+\& $x\->precision(\-2); # set instance precision
+\&
+\& $P = Math::BigInt\->precision(); # get class precision
+\& $P = $x\->precision(); # get instance precision
+.Ve
+.Sp
+Set or get the precision, i.e., the place to round relative to the decimal
+point. The precision must be a integer. Setting the precision to \f(CW$P\fR means that
+each number is rounded up or down, depending on the rounding mode, to the
+nearest multiple of 10**$P. If the precision is set to \f(CW\*(C`undef\*(C'\fR, no rounding is
+done.
+.Sp
+You might want to use "\fBaccuracy()\fR" instead. With "\fBaccuracy()\fR" you set the
+number of digits each result should have, with "\fBprecision()\fR" you set the
+place where to round.
+.Sp
+Please see the section about "ACCURACY and PRECISION" for further details.
+.Sp
+.Vb 4
+\& $y = Math::BigInt\->new(1234567); # $y is not rounded
+\& Math::BigInt\->precision(4); # set class precision to 4
+\& $x = Math::BigInt\->new(1234567); # $x is rounded automatically
+\& print $x; # prints "1230000"
+.Ve
+.Sp
+Note: Each class has its own globals separated from Math::BigInt, but it is
+possible to subclass Math::BigInt and make the globals of the subclass aliases
+to the ones from Math::BigInt.
+.IP \fBdiv_scale()\fR 4
+.IX Item "div_scale()"
+Set/get the fallback accuracy. This is the accuracy used when neither accuracy
+nor precision is set explicitly. It is used when a computation might otherwise
+attempt to return an infinite number of digits.
+.IP \fBround_mode()\fR 4
+.IX Item "round_mode()"
+Set/get the rounding mode.
+.IP \fBupgrade()\fR 4
+.IX Item "upgrade()"
+Set/get the class for upgrading. When a computation might result in a
+non-integer, the operands are upgraded to this class. This is used for instance
+by bignum. The default is \f(CW\*(C`undef\*(C'\fR, i.e., no upgrading.
+.Sp
+.Vb 4
+\& # with no upgrading
+\& $x = Math::BigInt\->new(12);
+\& $y = Math::BigInt\->new(5);
+\& print $x / $y, "\en"; # 2 as a Math::BigInt
+\&
+\& # with upgrading to Math::BigFloat
+\& Math::BigInt \-> upgrade("Math::BigFloat");
+\& print $x / $y, "\en"; # 2.4 as a Math::BigFloat
+\&
+\& # with upgrading to Math::BigRat (after loading Math::BigRat)
+\& Math::BigInt \-> upgrade("Math::BigRat");
+\& print $x / $y, "\en"; # 12/5 as a Math::BigRat
+.Ve
+.IP \fBdowngrade()\fR 4
+.IX Item "downgrade()"
+Set/get the class for downgrading. The default is \f(CW\*(C`undef\*(C'\fR, i.e., no
+downgrading. Downgrading is not done by Math::BigInt.
+.IP \fBmodify()\fR 4
+.IX Item "modify()"
+.Vb 1
+\& $x\->modify(\*(Aqbpowd\*(Aq);
+.Ve
+.Sp
+This method returns 0 if the object can be modified with the given operation,
+or 1 if not.
+.Sp
+This is used for instance by Math::BigInt::Constant.
+.IP \fBconfig()\fR 4
+.IX Item "config()"
+.Vb 2
+\& Math::BigInt\->config("trap_nan" => 1); # set
+\& $accu = Math::BigInt\->config("accuracy"); # get
+.Ve
+.Sp
+Set or get class variables. Read-only parameters are marked as RO. Read-write
+parameters are marked as RW. The following parameters are supported.
+.Sp
+.Vb 10
+\& Parameter RO/RW Description
+\& Example
+\& ============================================================
+\& lib RO Name of the math backend library
+\& Math::BigInt::Calc
+\& lib_version RO Version of the math backend library
+\& 0.30
+\& class RO The class of config you just called
+\& Math::BigRat
+\& version RO version number of the class you used
+\& 0.10
+\& upgrade RW To which class numbers are upgraded
+\& undef
+\& downgrade RW To which class numbers are downgraded
+\& undef
+\& precision RW Global precision
+\& undef
+\& accuracy RW Global accuracy
+\& undef
+\& round_mode RW Global round mode
+\& even
+\& div_scale RW Fallback accuracy for division etc.
+\& 40
+\& trap_nan RW Trap NaNs
+\& undef
+\& trap_inf RW Trap +inf/\-inf
+\& undef
+.Ve
+.SS "Constructor methods"
+.IX Subsection "Constructor methods"
+.IP \fBnew()\fR 4
+.IX Item "new()"
+.Vb 1
+\& $x = Math::BigInt\->new($str,$A,$P,$R);
+.Ve
+.Sp
+Creates a new Math::BigInt object from a scalar or another Math::BigInt object.
+The input is accepted as decimal, hexadecimal (with leading '0x'), octal (with
+leading ('0o') or binary (with leading '0b').
+.Sp
+See "Input" for more info on accepted input formats.
+.IP \fBfrom_dec()\fR 4
+.IX Item "from_dec()"
+.Vb 1
+\& $x = Math::BigInt\->from_dec("314159"); # input is decimal
+.Ve
+.Sp
+Interpret input as a decimal. It is equivalent to \fBnew()\fR, but does not accept
+anything but strings representing finite, decimal numbers.
+.IP \fBfrom_hex()\fR 4
+.IX Item "from_hex()"
+.Vb 1
+\& $x = Math::BigInt\->from_hex("0xcafe"); # input is hexadecimal
+.Ve
+.Sp
+Interpret input as a hexadecimal string. A "0x" or "x" prefix is optional. A
+single underscore character may be placed right after the prefix, if present,
+or between any two digits. If the input is invalid, a NaN is returned.
+.IP \fBfrom_oct()\fR 4
+.IX Item "from_oct()"
+.Vb 1
+\& $x = Math::BigInt\->from_oct("0775"); # input is octal
+.Ve
+.Sp
+Interpret the input as an octal string and return the corresponding value. A
+"0" (zero) prefix is optional. A single underscore character may be placed
+right after the prefix, if present, or between any two digits. If the input is
+invalid, a NaN is returned.
+.IP \fBfrom_bin()\fR 4
+.IX Item "from_bin()"
+.Vb 1
+\& $x = Math::BigInt\->from_bin("0b10011"); # input is binary
+.Ve
+.Sp
+Interpret the input as a binary string. A "0b" or "b" prefix is optional. A
+single underscore character may be placed right after the prefix, if present,
+or between any two digits. If the input is invalid, a NaN is returned.
+.IP \fBfrom_bytes()\fR 4
+.IX Item "from_bytes()"
+.Vb 1
+\& $x = Math::BigInt\->from_bytes("\exf3\ex6b"); # $x = 62315
+.Ve
+.Sp
+Interpret the input as a byte string, assuming big endian byte order. The
+output is always a non-negative, finite integer.
+.Sp
+In some special cases, \fBfrom_bytes()\fR matches the conversion done by \fBunpack()\fR:
+.Sp
+.Vb 3
+\& $b = "\ex4e"; # one char byte string
+\& $x = Math::BigInt\->from_bytes($b); # = 78
+\& $y = unpack "C", $b; # ditto, but scalar
+\&
+\& $b = "\exf3\ex6b"; # two char byte string
+\& $x = Math::BigInt\->from_bytes($b); # = 62315
+\& $y = unpack "S>", $b; # ditto, but scalar
+\&
+\& $b = "\ex2d\exe0\ex49\exad"; # four char byte string
+\& $x = Math::BigInt\->from_bytes($b); # = 769673645
+\& $y = unpack "L>", $b; # ditto, but scalar
+\&
+\& $b = "\ex2d\exe0\ex49\exad\ex2d\exe0\ex49\exad"; # eight char byte string
+\& $x = Math::BigInt\->from_bytes($b); # = 3305723134637787565
+\& $y = unpack "Q>", $b; # ditto, but scalar
+.Ve
+.IP \fBfrom_base()\fR 4
+.IX Item "from_base()"
+Given a string, a base, and an optional collation sequence, interpret the
+string as a number in the given base. The collation sequence describes the
+value of each character in the string.
+.Sp
+If a collation sequence is not given, a default collation sequence is used. If
+the base is less than or equal to 36, the collation sequence is the string
+consisting of the 36 characters "0" to "9" and "A" to "Z". In this case, the
+letter case in the input is ignored. If the base is greater than 36, and
+smaller than or equal to 62, the collation sequence is the string consisting of
+the 62 characters "0" to "9", "A" to "Z", and "a" to "z". A base larger than 62
+requires the collation sequence to be specified explicitly.
+.Sp
+These examples show standard binary, octal, and hexadecimal conversion. All
+cases return 250.
+.Sp
+.Vb 3
+\& $x = Math::BigInt\->from_base("11111010", 2);
+\& $x = Math::BigInt\->from_base("372", 8);
+\& $x = Math::BigInt\->from_base("fa", 16);
+.Ve
+.Sp
+When the base is less than or equal to 36, and no collation sequence is given,
+the letter case is ignored, so both of these also return 250:
+.Sp
+.Vb 2
+\& $x = Math::BigInt\->from_base("6Y", 16);
+\& $x = Math::BigInt\->from_base("6y", 16);
+.Ve
+.Sp
+When the base greater than 36, and no collation sequence is given, the default
+collation sequence contains both uppercase and lowercase letters, so
+the letter case in the input is not ignored:
+.Sp
+.Vb 5
+\& $x = Math::BigInt\->from_base("6S", 37); # $x is 250
+\& $x = Math::BigInt\->from_base("6s", 37); # $x is 276
+\& $x = Math::BigInt\->from_base("121", 3); # $x is 16
+\& $x = Math::BigInt\->from_base("XYZ", 36); # $x is 44027
+\& $x = Math::BigInt\->from_base("Why", 42); # $x is 58314
+.Ve
+.Sp
+The collation sequence can be any set of unique characters. These two cases
+are equivalent
+.Sp
+.Vb 2
+\& $x = Math::BigInt\->from_base("100", 2, "01"); # $x is 4
+\& $x = Math::BigInt\->from_base("|\-\-", 2, "\-|"); # $x is 4
+.Ve
+.IP \fBfrom_base_num()\fR 4
+.IX Item "from_base_num()"
+Returns a new Math::BigInt object given an array of values and a base. This
+method is equivalent to \f(CWfrom_base()\fR, but works on numbers in an array rather
+than characters in a string. Unlike \f(CWfrom_base()\fR, all input values may be
+arbitrarily large.
+.Sp
+.Vb 2
+\& $x = Math::BigInt\->from_base_num([1, 1, 0, 1], 2) # $x is 13
+\& $x = Math::BigInt\->from_base_num([3, 125, 39], 128) # $x is 65191
+.Ve
+.IP \fBbzero()\fR 4
+.IX Item "bzero()"
+.Vb 2
+\& $x = Math::BigInt\->bzero();
+\& $x\->bzero();
+.Ve
+.Sp
+Returns a new Math::BigInt object representing zero. If used as an instance
+method, assigns the value to the invocand.
+.IP \fBbone()\fR 4
+.IX Item "bone()"
+.Vb 6
+\& $x = Math::BigInt\->bone(); # +1
+\& $x = Math::BigInt\->bone("+"); # +1
+\& $x = Math::BigInt\->bone("\-"); # \-1
+\& $x\->bone(); # +1
+\& $x\->bone("+"); # +1
+\& $x\->bone(\*(Aq\-\*(Aq); # \-1
+.Ve
+.Sp
+Creates a new Math::BigInt object representing one. The optional argument is
+either '\-' or '+', indicating whether you want plus one or minus one. If used
+as an instance method, assigns the value to the invocand.
+.IP \fBbinf()\fR 4
+.IX Item "binf()"
+.Vb 1
+\& $x = Math::BigInt\->binf($sign);
+.Ve
+.Sp
+Creates a new Math::BigInt object representing infinity. The optional argument
+is either '\-' or '+', indicating whether you want infinity or minus infinity.
+If used as an instance method, assigns the value to the invocand.
+.Sp
+.Vb 2
+\& $x\->binf();
+\& $x\->binf(\*(Aq\-\*(Aq);
+.Ve
+.IP \fBbnan()\fR 4
+.IX Item "bnan()"
+.Vb 1
+\& $x = Math::BigInt\->bnan();
+.Ve
+.Sp
+Creates a new Math::BigInt object representing NaN (Not A Number). If used as
+an instance method, assigns the value to the invocand.
+.Sp
+.Vb 1
+\& $x\->bnan();
+.Ve
+.IP \fBbpi()\fR 4
+.IX Item "bpi()"
+.Vb 2
+\& $x = Math::BigInt\->bpi(100); # 3
+\& $x\->bpi(100); # 3
+.Ve
+.Sp
+Creates a new Math::BigInt object representing PI. If used as an instance
+method, assigns the value to the invocand. With Math::BigInt this always
+returns 3.
+.Sp
+If upgrading is in effect, returns PI, rounded to N digits with the current
+rounding mode:
+.Sp
+.Vb 4
+\& use Math::BigFloat;
+\& use Math::BigInt upgrade => "Math::BigFloat";
+\& print Math::BigInt\->bpi(3), "\en"; # 3.14
+\& print Math::BigInt\->bpi(100), "\en"; # 3.1415....
+.Ve
+.IP \fBcopy()\fR 4
+.IX Item "copy()"
+.Vb 1
+\& $x\->copy(); # make a true copy of $x (unlike $y = $x)
+.Ve
+.IP \fBas_int()\fR 4
+.IX Item "as_int()"
+.PD 0
+.IP \fBas_number()\fR 4
+.IX Item "as_number()"
+.PD
+These methods are called when Math::BigInt encounters an object it doesn't know
+how to handle. For instance, assume \f(CW$x\fR is a Math::BigInt, or subclass thereof,
+and \f(CW$y\fR is defined, but not a Math::BigInt, or subclass thereof. If you do
+.Sp
+.Vb 1
+\& $x \-> badd($y);
+.Ve
+.Sp
+\&\f(CW$y\fR needs to be converted into an object that \f(CW$x\fR can deal with. This is done by
+first checking if \f(CW$y\fR is something that \f(CW$x\fR might be upgraded to. If that is the
+case, no further attempts are made. The next is to see if \f(CW$y\fR supports the
+method \f(CWas_int()\fR. If it does, \f(CWas_int()\fR is called, but if it doesn't, the
+next thing is to see if \f(CW$y\fR supports the method \f(CWas_number()\fR. If it does,
+\&\f(CWas_number()\fR is called. The method \f(CWas_int()\fR (and \f(CWas_number()\fR) is
+expected to return either an object that has the same class as \f(CW$x\fR, a subclass
+thereof, or a string that \f(CW\*(C`ref($x)\->new()\*(C'\fR can parse to create an object.
+.Sp
+\&\f(CWas_number()\fR is an alias to \f(CWas_int()\fR. \f(CW\*(C`as_number\*(C'\fR was introduced in
+v1.22, while \f(CWas_int()\fR was introduced in v1.68.
+.Sp
+In Math::BigInt, \f(CWas_int()\fR has the same effect as \f(CWcopy()\fR.
+.IP \fBas_float()\fR 4
+.IX Item "as_float()"
+Return the argument as a Math::BigFloat object.
+.IP \fBas_rat()\fR 4
+.IX Item "as_rat()"
+Return the argument as a Math::BigRat object.
+.SS "Boolean methods"
+.IX Subsection "Boolean methods"
+None of these methods modify the invocand object.
+.IP \fBis_zero()\fR 4
+.IX Item "is_zero()"
+.Vb 1
+\& $x\->is_zero(); # true if $x is 0
+.Ve
+.Sp
+Returns true if the invocand is zero and false otherwise.
+.IP "is_one( [ SIGN ])" 4
+.IX Item "is_one( [ SIGN ])"
+.Vb 3
+\& $x\->is_one(); # true if $x is +1
+\& $x\->is_one("+"); # ditto
+\& $x\->is_one("\-"); # true if $x is \-1
+.Ve
+.Sp
+Returns true if the invocand is one and false otherwise.
+.IP \fBis_finite()\fR 4
+.IX Item "is_finite()"
+.Vb 1
+\& $x\->is_finite(); # true if $x is not +inf, \-inf or NaN
+.Ve
+.Sp
+Returns true if the invocand is a finite number, i.e., it is neither +inf,
+\&\-inf, nor NaN.
+.IP "is_inf( [ SIGN ] )" 4
+.IX Item "is_inf( [ SIGN ] )"
+.Vb 3
+\& $x\->is_inf(); # true if $x is +inf
+\& $x\->is_inf("+"); # ditto
+\& $x\->is_inf("\-"); # true if $x is \-inf
+.Ve
+.Sp
+Returns true if the invocand is infinite and false otherwise.
+.IP \fBis_nan()\fR 4
+.IX Item "is_nan()"
+.Vb 1
+\& $x\->is_nan(); # true if $x is NaN
+.Ve
+.IP \fBis_positive()\fR 4
+.IX Item "is_positive()"
+.PD 0
+.IP \fBis_pos()\fR 4
+.IX Item "is_pos()"
+.PD
+.Vb 2
+\& $x\->is_positive(); # true if > 0
+\& $x\->is_pos(); # ditto
+.Ve
+.Sp
+Returns true if the invocand is positive and false otherwise. A \f(CW\*(C`NaN\*(C'\fR is
+neither positive nor negative.
+.IP \fBis_negative()\fR 4
+.IX Item "is_negative()"
+.PD 0
+.IP \fBis_neg()\fR 4
+.IX Item "is_neg()"
+.PD
+.Vb 2
+\& $x\->is_negative(); # true if < 0
+\& $x\->is_neg(); # ditto
+.Ve
+.Sp
+Returns true if the invocand is negative and false otherwise. A \f(CW\*(C`NaN\*(C'\fR is
+neither positive nor negative.
+.IP \fBis_non_positive()\fR 4
+.IX Item "is_non_positive()"
+.Vb 1
+\& $x\->is_non_positive(); # true if <= 0
+.Ve
+.Sp
+Returns true if the invocand is negative or zero.
+.IP \fBis_non_negative()\fR 4
+.IX Item "is_non_negative()"
+.Vb 1
+\& $x\->is_non_negative(); # true if >= 0
+.Ve
+.Sp
+Returns true if the invocand is positive or zero.
+.IP \fBis_odd()\fR 4
+.IX Item "is_odd()"
+.Vb 1
+\& $x\->is_odd(); # true if odd, false for even
+.Ve
+.Sp
+Returns true if the invocand is odd and false otherwise. \f(CW\*(C`NaN\*(C'\fR, \f(CW\*(C`+inf\*(C'\fR, and
+\&\f(CW\*(C`\-inf\*(C'\fR are neither odd nor even.
+.IP \fBis_even()\fR 4
+.IX Item "is_even()"
+.Vb 1
+\& $x\->is_even(); # true if $x is even
+.Ve
+.Sp
+Returns true if the invocand is even and false otherwise. \f(CW\*(C`NaN\*(C'\fR, \f(CW\*(C`+inf\*(C'\fR,
+\&\f(CW\*(C`\-inf\*(C'\fR are not integers and are neither odd nor even.
+.IP \fBis_int()\fR 4
+.IX Item "is_int()"
+.Vb 1
+\& $x\->is_int(); # true if $x is an integer
+.Ve
+.Sp
+Returns true if the invocand is an integer and false otherwise. \f(CW\*(C`NaN\*(C'\fR,
+\&\f(CW\*(C`+inf\*(C'\fR, \f(CW\*(C`\-inf\*(C'\fR are not integers.
+.SS "Comparison methods"
+.IX Subsection "Comparison methods"
+None of these methods modify the invocand object. Note that a \f(CW\*(C`NaN\*(C'\fR is neither
+less than, greater than, or equal to anything else, even a \f(CW\*(C`NaN\*(C'\fR.
+.IP \fBbcmp()\fR 4
+.IX Item "bcmp()"
+.Vb 1
+\& $x\->bcmp($y);
+.Ve
+.Sp
+Returns \-1, 0, 1 depending on whether \f(CW$x\fR is less than, equal to, or grater than
+\&\f(CW$y\fR. Returns undef if any operand is a NaN.
+.IP \fBbacmp()\fR 4
+.IX Item "bacmp()"
+.Vb 1
+\& $x\->bacmp($y);
+.Ve
+.Sp
+Returns \-1, 0, 1 depending on whether the absolute value of \f(CW$x\fR is less than,
+equal to, or grater than the absolute value of \f(CW$y\fR. Returns undef if any operand
+is a NaN.
+.IP \fBbeq()\fR 4
+.IX Item "beq()"
+.Vb 1
+\& $x \-> beq($y);
+.Ve
+.Sp
+Returns true if and only if \f(CW$x\fR is equal to \f(CW$y\fR, and false otherwise.
+.IP \fBbne()\fR 4
+.IX Item "bne()"
+.Vb 1
+\& $x \-> bne($y);
+.Ve
+.Sp
+Returns true if and only if \f(CW$x\fR is not equal to \f(CW$y\fR, and false otherwise.
+.IP \fBblt()\fR 4
+.IX Item "blt()"
+.Vb 1
+\& $x \-> blt($y);
+.Ve
+.Sp
+Returns true if and only if \f(CW$x\fR is equal to \f(CW$y\fR, and false otherwise.
+.IP \fBble()\fR 4
+.IX Item "ble()"
+.Vb 1
+\& $x \-> ble($y);
+.Ve
+.Sp
+Returns true if and only if \f(CW$x\fR is less than or equal to \f(CW$y\fR, and false
+otherwise.
+.IP \fBbgt()\fR 4
+.IX Item "bgt()"
+.Vb 1
+\& $x \-> bgt($y);
+.Ve
+.Sp
+Returns true if and only if \f(CW$x\fR is greater than \f(CW$y\fR, and false otherwise.
+.IP \fBbge()\fR 4
+.IX Item "bge()"
+.Vb 1
+\& $x \-> bge($y);
+.Ve
+.Sp
+Returns true if and only if \f(CW$x\fR is greater than or equal to \f(CW$y\fR, and false
+otherwise.
+.SS "Arithmetic methods"
+.IX Subsection "Arithmetic methods"
+These methods modify the invocand object and returns it.
+.IP \fBbneg()\fR 4
+.IX Item "bneg()"
+.Vb 1
+\& $x\->bneg();
+.Ve
+.Sp
+Negate the number, e.g. change the sign between '+' and '\-', or between '+inf'
+and '\-inf', respectively. Does nothing for NaN or zero.
+.IP \fBbabs()\fR 4
+.IX Item "babs()"
+.Vb 1
+\& $x\->babs();
+.Ve
+.Sp
+Set the number to its absolute value, e.g. change the sign from '\-' to '+'
+and from '\-inf' to '+inf', respectively. Does nothing for NaN or positive
+numbers.
+.IP \fBbsgn()\fR 4
+.IX Item "bsgn()"
+.Vb 1
+\& $x\->bsgn();
+.Ve
+.Sp
+Signum function. Set the number to \-1, 0, or 1, depending on whether the
+number is negative, zero, or positive, respectively. Does not modify NaNs.
+.IP \fBbnorm()\fR 4
+.IX Item "bnorm()"
+.Vb 1
+\& $x\->bnorm(); # normalize (no\-op)
+.Ve
+.Sp
+Normalize the number. This is a no-op and is provided only for backwards
+compatibility.
+.IP \fBbinc()\fR 4
+.IX Item "binc()"
+.Vb 1
+\& $x\->binc(); # increment x by 1
+.Ve
+.IP \fBbdec()\fR 4
+.IX Item "bdec()"
+.Vb 1
+\& $x\->bdec(); # decrement x by 1
+.Ve
+.IP \fBbadd()\fR 4
+.IX Item "badd()"
+.Vb 1
+\& $x\->badd($y); # addition (add $y to $x)
+.Ve
+.IP \fBbsub()\fR 4
+.IX Item "bsub()"
+.Vb 1
+\& $x\->bsub($y); # subtraction (subtract $y from $x)
+.Ve
+.IP \fBbmul()\fR 4
+.IX Item "bmul()"
+.Vb 1
+\& $x\->bmul($y); # multiplication (multiply $x by $y)
+.Ve
+.IP \fBbmuladd()\fR 4
+.IX Item "bmuladd()"
+.Vb 1
+\& $x\->bmuladd($y,$z);
+.Ve
+.Sp
+Multiply \f(CW$x\fR by \f(CW$y\fR, and then add \f(CW$z\fR to the result,
+.Sp
+This method was added in v1.87 of Math::BigInt (June 2007).
+.IP \fBbdiv()\fR 4
+.IX Item "bdiv()"
+.Vb 1
+\& $x\->bdiv($y); # divide, set $x to quotient
+.Ve
+.Sp
+Divides \f(CW$x\fR by \f(CW$y\fR by doing floored division (F\-division), where the quotient is
+the floored (rounded towards negative infinity) quotient of the two operands.
+In list context, returns the quotient and the remainder. The remainder is
+either zero or has the same sign as the second operand. In scalar context, only
+the quotient is returned.
+.Sp
+The quotient is always the greatest integer less than or equal to the
+real-valued quotient of the two operands, and the remainder (when it is
+non-zero) always has the same sign as the second operand; so, for example,
+.Sp
+.Vb 6
+\& 1 / 4 => ( 0, 1)
+\& 1 / \-4 => (\-1, \-3)
+\& \-3 / 4 => (\-1, 1)
+\& \-3 / \-4 => ( 0, \-3)
+\& \-11 / 2 => (\-5, 1)
+\& 11 / \-2 => (\-5, \-1)
+.Ve
+.Sp
+The behavior of the overloaded operator % agrees with the behavior of Perl's
+built-in % operator (as documented in the perlop manpage), and the equation
+.Sp
+.Vb 1
+\& $x == ($x / $y) * $y + ($x % $y)
+.Ve
+.Sp
+holds true for any finite \f(CW$x\fR and finite, non-zero \f(CW$y\fR.
+.Sp
+Perl's "use integer" might change the behaviour of % and / for scalars. This is
+because under 'use integer' Perl does what the underlying C library thinks is
+right, and this varies. However, "use integer" does not change the way things
+are done with Math::BigInt objects.
+.IP \fBbtdiv()\fR 4
+.IX Item "btdiv()"
+.Vb 1
+\& $x\->btdiv($y); # divide, set $x to quotient
+.Ve
+.Sp
+Divides \f(CW$x\fR by \f(CW$y\fR by doing truncated division (T\-division), where quotient is
+the truncated (rouneded towards zero) quotient of the two operands. In list
+context, returns the quotient and the remainder. The remainder is either zero
+or has the same sign as the first operand. In scalar context, only the quotient
+is returned.
+.IP \fBbmod()\fR 4
+.IX Item "bmod()"
+.Vb 1
+\& $x\->bmod($y); # modulus (x % y)
+.Ve
+.Sp
+Returns \f(CW$x\fR modulo \f(CW$y\fR, i.e., the remainder after floored division (F\-division).
+This method is like Perl's % operator. See "\fBbdiv()\fR".
+.IP \fBbtmod()\fR 4
+.IX Item "btmod()"
+.Vb 1
+\& $x\->btmod($y); # modulus
+.Ve
+.Sp
+Returns the remainer after truncated division (T\-division). See "\fBbtdiv()\fR".
+.IP \fBbmodinv()\fR 4
+.IX Item "bmodinv()"
+.Vb 1
+\& $x\->bmodinv($mod); # modular multiplicative inverse
+.Ve
+.Sp
+Returns the multiplicative inverse of \f(CW$x\fR modulo \f(CW$mod\fR. If
+.Sp
+.Vb 1
+\& $y = $x \-> copy() \-> bmodinv($mod)
+.Ve
+.Sp
+then \f(CW$y\fR is the number closest to zero, and with the same sign as \f(CW$mod\fR,
+satisfying
+.Sp
+.Vb 1
+\& ($x * $y) % $mod = 1 % $mod
+.Ve
+.Sp
+If \f(CW$x\fR and \f(CW$y\fR are non-zero, they must be relative primes, i.e.,
+\&\f(CW\*(C`bgcd($y, $mod)==1\*(C'\fR. '\f(CW\*(C`NaN\*(C'\fR' is returned when no modular multiplicative
+inverse exists.
+.IP \fBbmodpow()\fR 4
+.IX Item "bmodpow()"
+.Vb 2
+\& $num\->bmodpow($exp,$mod); # modular exponentiation
+\& # ($num**$exp % $mod)
+.Ve
+.Sp
+Returns the value of \f(CW$num\fR taken to the power \f(CW$exp\fR in the modulus
+\&\f(CW$mod\fR using binary exponentiation. \f(CW\*(C`bmodpow\*(C'\fR is far superior to
+writing
+.Sp
+.Vb 1
+\& $num ** $exp % $mod
+.Ve
+.Sp
+because it is much faster \- it reduces internal variables into
+the modulus whenever possible, so it operates on smaller numbers.
+.Sp
+\&\f(CW\*(C`bmodpow\*(C'\fR also supports negative exponents.
+.Sp
+.Vb 1
+\& bmodpow($num, \-1, $mod)
+.Ve
+.Sp
+is exactly equivalent to
+.Sp
+.Vb 1
+\& bmodinv($num, $mod)
+.Ve
+.IP \fBbpow()\fR 4
+.IX Item "bpow()"
+.Vb 1
+\& $x\->bpow($y); # power of arguments (x ** y)
+.Ve
+.Sp
+\&\f(CWbpow()\fR (and the rounding functions) now modifies the first argument and
+returns it, unlike the old code which left it alone and only returned the
+result. This is to be consistent with \f(CWbadd()\fR etc. The first three modifies
+\&\f(CW$x\fR, the last one won't:
+.Sp
+.Vb 4
+\& print bpow($x,$i),"\en"; # modify $x
+\& print $x\->bpow($i),"\en"; # ditto
+\& print $x **= $i,"\en"; # the same
+\& print $x ** $i,"\en"; # leave $x alone
+.Ve
+.Sp
+The form \f(CW\*(C`$x **= $y\*(C'\fR is faster than \f(CW\*(C`$x = $x ** $y;\*(C'\fR, though.
+.IP \fBblog()\fR 4
+.IX Item "blog()"
+.Vb 1
+\& $x\->blog($base, $accuracy); # logarithm of x to the base $base
+.Ve
+.Sp
+If \f(CW$base\fR is not defined, Euler's number (e) is used:
+.Sp
+.Vb 1
+\& print $x\->blog(undef, 100); # log(x) to 100 digits
+.Ve
+.IP \fBbexp()\fR 4
+.IX Item "bexp()"
+.Vb 1
+\& $x\->bexp($accuracy); # calculate e ** X
+.Ve
+.Sp
+Calculates the expression \f(CW\*(C`e ** $x\*(C'\fR where \f(CW\*(C`e\*(C'\fR is Euler's number.
+.Sp
+This method was added in v1.82 of Math::BigInt (April 2007).
+.Sp
+See also "\fBblog()\fR".
+.IP \fBbnok()\fR 4
+.IX Item "bnok()"
+.Vb 1
+\& $x\->bnok($y); # x over y (binomial coefficient n over k)
+.Ve
+.Sp
+Calculates the binomial coefficient n over k, also called the "choose"
+function, which is
+.Sp
+.Vb 3
+\& ( n ) n!
+\& | | = \-\-\-\-\-\-\-\-
+\& ( k ) k!(n\-k)!
+.Ve
+.Sp
+when n and k are non-negative. This method implements the full Kronenburg
+extension (Kronenburg, M.J. "The Binomial Coefficient for Negative Arguments."
+18 May 2011. http://arxiv.org/abs/1105.3689/) illustrated by the following
+pseudo-code:
+.Sp
+.Vb 8
+\& if n >= 0 and k >= 0:
+\& return binomial(n, k)
+\& if k >= 0:
+\& return (\-1)^k*binomial(\-n+k\-1, k)
+\& if k <= n:
+\& return (\-1)^(n\-k)*binomial(\-k\-1, n\-k)
+\& else
+\& return 0
+.Ve
+.Sp
+The behaviour is identical to the behaviour of the Maple and Mathematica
+function for negative integers n, k.
+.IP \fBbuparrow()\fR 4
+.IX Item "buparrow()"
+.PD 0
+.IP \fBuparrow()\fR 4
+.IX Item "uparrow()"
+.PD
+.Vb 2
+\& $a \-> buparrow($n, $b); # modifies $a
+\& $x = $a \-> uparrow($n, $b); # does not modify $a
+.Ve
+.Sp
+This method implements Knuth's up-arrow notation, where \f(CW$n\fR is a non-negative
+integer representing the number of up-arrows. \f(CW$n\fR = 0 gives multiplication, \f(CW$n\fR =
+1 gives exponentiation, \f(CW$n\fR = 2 gives tetration, \f(CW$n\fR = 3 gives hexation etc. The
+following illustrates the relation between the first values of \f(CW$n\fR.
+.Sp
+See <https://en.wikipedia.org/wiki/Knuth%27s_up\-arrow_notation>.
+.IP \fBbackermann()\fR 4
+.IX Item "backermann()"
+.PD 0
+.IP \fBackermann()\fR 4
+.IX Item "ackermann()"
+.PD
+.Vb 2
+\& $m \-> backermann($n); # modifies $a
+\& $x = $m \-> ackermann($n); # does not modify $a
+.Ve
+.Sp
+This method implements the Ackermann function:
+.Sp
+.Vb 3
+\& / n + 1 if m = 0
+\& A(m, n) = | A(m\-1, 1) if m > 0 and n = 0
+\& \e A(m\-1, A(m, n\-1)) if m > 0 and n > 0
+.Ve
+.Sp
+Its value grows rapidly, even for small inputs. For example, A(4, 2) is an
+integer of 19729 decimal digits.
+.Sp
+See https://en.wikipedia.org/wiki/Ackermann_function
+.IP \fBbsin()\fR 4
+.IX Item "bsin()"
+.Vb 2
+\& my $x = Math::BigInt\->new(1);
+\& print $x\->bsin(100), "\en";
+.Ve
+.Sp
+Calculate the sine of \f(CW$x\fR, modifying \f(CW$x\fR in place.
+.Sp
+In Math::BigInt, unless upgrading is in effect, the result is truncated to an
+integer.
+.Sp
+This method was added in v1.87 of Math::BigInt (June 2007).
+.IP \fBbcos()\fR 4
+.IX Item "bcos()"
+.Vb 2
+\& my $x = Math::BigInt\->new(1);
+\& print $x\->bcos(100), "\en";
+.Ve
+.Sp
+Calculate the cosine of \f(CW$x\fR, modifying \f(CW$x\fR in place.
+.Sp
+In Math::BigInt, unless upgrading is in effect, the result is truncated to an
+integer.
+.Sp
+This method was added in v1.87 of Math::BigInt (June 2007).
+.IP \fBbatan()\fR 4
+.IX Item "batan()"
+.Vb 2
+\& my $x = Math::BigFloat\->new(0.5);
+\& print $x\->batan(100), "\en";
+.Ve
+.Sp
+Calculate the arcus tangens of \f(CW$x\fR, modifying \f(CW$x\fR in place.
+.Sp
+In Math::BigInt, unless upgrading is in effect, the result is truncated to an
+integer.
+.Sp
+This method was added in v1.87 of Math::BigInt (June 2007).
+.IP \fBbatan2()\fR 4
+.IX Item "batan2()"
+.Vb 3
+\& my $x = Math::BigInt\->new(1);
+\& my $y = Math::BigInt\->new(1);
+\& print $y\->batan2($x), "\en";
+.Ve
+.Sp
+Calculate the arcus tangens of \f(CW$y\fR divided by \f(CW$x\fR, modifying \f(CW$y\fR in place.
+.Sp
+In Math::BigInt, unless upgrading is in effect, the result is truncated to an
+integer.
+.Sp
+This method was added in v1.87 of Math::BigInt (June 2007).
+.IP \fBbsqrt()\fR 4
+.IX Item "bsqrt()"
+.Vb 1
+\& $x\->bsqrt(); # calculate square root
+.Ve
+.Sp
+\&\f(CWbsqrt()\fR returns the square root truncated to an integer.
+.Sp
+If you want a better approximation of the square root, then use:
+.Sp
+.Vb 4
+\& $x = Math::BigFloat\->new(12);
+\& Math::BigFloat\->precision(0);
+\& Math::BigFloat\->round_mode(\*(Aqeven\*(Aq);
+\& print $x\->copy\->bsqrt(),"\en"; # 4
+\&
+\& Math::BigFloat\->precision(2);
+\& print $x\->bsqrt(),"\en"; # 3.46
+\& print $x\->bsqrt(3),"\en"; # 3.464
+.Ve
+.IP \fBbroot()\fR 4
+.IX Item "broot()"
+.Vb 1
+\& $x\->broot($N);
+.Ve
+.Sp
+Calculates the N'th root of \f(CW$x\fR.
+.IP \fBbfac()\fR 4
+.IX Item "bfac()"
+.Vb 1
+\& $x\->bfac(); # factorial of $x
+.Ve
+.Sp
+Returns the factorial of \f(CW$x\fR, i.e., \f(CW$x\fR*($x\-1)*($x\-2)*...*2*1, the product of
+all positive integers up to and including \f(CW$x\fR. \f(CW$x\fR must be > \-1. The
+factorial of N is commonly written as N!, or N!1, when using the multifactorial
+notation.
+.IP \fBbdfac()\fR 4
+.IX Item "bdfac()"
+.Vb 1
+\& $x\->bdfac(); # double factorial of $x
+.Ve
+.Sp
+Returns the double factorial of \f(CW$x\fR, i.e., \f(CW$x\fR*($x\-2)*($x\-4)*... \f(CW$x\fR must be
+> \-2. The double factorial of N is commonly written as N!!, or N!2, when using
+the multifactorial notation.
+.IP \fBbtfac()\fR 4
+.IX Item "btfac()"
+.Vb 1
+\& $x\->btfac(); # triple factorial of $x
+.Ve
+.Sp
+Returns the triple factorial of \f(CW$x\fR, i.e., \f(CW$x\fR*($x\-3)*($x\-6)*... \f(CW$x\fR must be
+> \-3. The triple factorial of N is commonly written as N!!!, or N!3, when using
+the multifactorial notation.
+.IP \fBbmfac()\fR 4
+.IX Item "bmfac()"
+.Vb 1
+\& $x\->bmfac($k); # $k\*(Aqth multifactorial of $x
+.Ve
+.Sp
+Returns the multi-factorial of \f(CW$x\fR, i.e., \f(CW$x\fR*($x\-$k)*($x\-2*$k)*... \f(CW$x\fR must
+be > \-$k. The multi-factorial of N is commonly written as N!K.
+.IP \fBbfib()\fR 4
+.IX Item "bfib()"
+.Vb 2
+\& $F = $n\->bfib(); # a single Fibonacci number
+\& @F = $n\->bfib(); # a list of Fibonacci numbers
+.Ve
+.Sp
+In scalar context, returns a single Fibonacci number. In list context, returns
+a list of Fibonacci numbers. The invocand is the last element in the output.
+.Sp
+The Fibonacci sequence is defined by
+.Sp
+.Vb 3
+\& F(0) = 0
+\& F(1) = 1
+\& F(n) = F(n\-1) + F(n\-2)
+.Ve
+.Sp
+In list context, F(0) and F(n) is the first and last number in the output,
+respectively. For example, if \f(CW$n\fR is 12, then \f(CW\*(C`@F = $n\->bfib()\*(C'\fR returns the
+following values, F(0) to F(12):
+.Sp
+.Vb 1
+\& 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
+.Ve
+.Sp
+The sequence can also be extended to negative index n using the re-arranged
+recurrence relation
+.Sp
+.Vb 1
+\& F(n\-2) = F(n) \- F(n\-1)
+.Ve
+.Sp
+giving the bidirectional sequence
+.Sp
+.Vb 2
+\& n \-7 \-6 \-5 \-4 \-3 \-2 \-1 0 1 2 3 4 5 6 7
+\& F(n) 13 \-8 5 \-3 2 \-1 1 0 1 1 2 3 5 8 13
+.Ve
+.Sp
+If \f(CW$n\fR is \-12, the following values, F(0) to F(12), are returned:
+.Sp
+.Vb 1
+\& 0, 1, \-1, 2, \-3, 5, \-8, 13, \-21, 34, \-55, 89, \-144
+.Ve
+.IP \fBblucas()\fR 4
+.IX Item "blucas()"
+.Vb 2
+\& $F = $n\->blucas(); # a single Lucas number
+\& @F = $n\->blucas(); # a list of Lucas numbers
+.Ve
+.Sp
+In scalar context, returns a single Lucas number. In list context, returns a
+list of Lucas numbers. The invocand is the last element in the output.
+.Sp
+The Lucas sequence is defined by
+.Sp
+.Vb 3
+\& L(0) = 2
+\& L(1) = 1
+\& L(n) = L(n\-1) + L(n\-2)
+.Ve
+.Sp
+In list context, L(0) and L(n) is the first and last number in the output,
+respectively. For example, if \f(CW$n\fR is 12, then \f(CW\*(C`@L = $n\->blucas()\*(C'\fR returns
+the following values, L(0) to L(12):
+.Sp
+.Vb 1
+\& 2, 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, 199, 322
+.Ve
+.Sp
+The sequence can also be extended to negative index n using the re-arranged
+recurrence relation
+.Sp
+.Vb 1
+\& L(n\-2) = L(n) \- L(n\-1)
+.Ve
+.Sp
+giving the bidirectional sequence
+.Sp
+.Vb 2
+\& n \-7 \-6 \-5 \-4 \-3 \-2 \-1 0 1 2 3 4 5 6 7
+\& L(n) 29 \-18 11 \-7 4 \-3 1 2 1 3 4 7 11 18 29
+.Ve
+.Sp
+If \f(CW$n\fR is \-12, the following values, L(0) to L(\-12), are returned:
+.Sp
+.Vb 1
+\& 2, 1, \-3, 4, \-7, 11, \-18, 29, \-47, 76, \-123, 199, \-322
+.Ve
+.IP \fBbrsft()\fR 4
+.IX Item "brsft()"
+.Vb 2
+\& $x\->brsft($n); # right shift $n places in base 2
+\& $x\->brsft($n, $b); # right shift $n places in base $b
+.Ve
+.Sp
+The latter is equivalent to
+.Sp
+.Vb 1
+\& $x \-> bdiv($b \-> copy() \-> bpow($n))
+.Ve
+.IP \fBblsft()\fR 4
+.IX Item "blsft()"
+.Vb 2
+\& $x\->blsft($n); # left shift $n places in base 2
+\& $x\->blsft($n, $b); # left shift $n places in base $b
+.Ve
+.Sp
+The latter is equivalent to
+.Sp
+.Vb 1
+\& $x \-> bmul($b \-> copy() \-> bpow($n))
+.Ve
+.SS "Bitwise methods"
+.IX Subsection "Bitwise methods"
+.IP \fBband()\fR 4
+.IX Item "band()"
+.Vb 1
+\& $x\->band($y); # bitwise and
+.Ve
+.IP \fBbior()\fR 4
+.IX Item "bior()"
+.Vb 1
+\& $x\->bior($y); # bitwise inclusive or
+.Ve
+.IP \fBbxor()\fR 4
+.IX Item "bxor()"
+.Vb 1
+\& $x\->bxor($y); # bitwise exclusive or
+.Ve
+.IP \fBbnot()\fR 4
+.IX Item "bnot()"
+.Vb 1
+\& $x\->bnot(); # bitwise not (two\*(Aqs complement)
+.Ve
+.Sp
+Two's complement (bitwise not). This is equivalent to, but faster than,
+.Sp
+.Vb 1
+\& $x\->binc()\->bneg();
+.Ve
+.SS "Rounding methods"
+.IX Subsection "Rounding methods"
+.IP \fBround()\fR 4
+.IX Item "round()"
+.Vb 1
+\& $x\->round($A,$P,$round_mode);
+.Ve
+.Sp
+Round \f(CW$x\fR to accuracy \f(CW$A\fR or precision \f(CW$P\fR using the round mode
+\&\f(CW$round_mode\fR.
+.IP \fBbround()\fR 4
+.IX Item "bround()"
+.Vb 1
+\& $x\->bround($N); # accuracy: preserve $N digits
+.Ve
+.Sp
+Rounds \f(CW$x\fR to an accuracy of \f(CW$N\fR digits.
+.IP \fBbfround()\fR 4
+.IX Item "bfround()"
+.Vb 1
+\& $x\->bfround($N);
+.Ve
+.Sp
+Rounds to a multiple of 10**$N. Examples:
+.Sp
+.Vb 1
+\& Input N Result
+\&
+\& 123456.123456 3 123500
+\& 123456.123456 2 123450
+\& 123456.123456 \-2 123456.12
+\& 123456.123456 \-3 123456.123
+.Ve
+.IP \fBbfloor()\fR 4
+.IX Item "bfloor()"
+.Vb 1
+\& $x\->bfloor();
+.Ve
+.Sp
+Round \f(CW$x\fR towards minus infinity, i.e., set \f(CW$x\fR to the largest integer less than
+or equal to \f(CW$x\fR.
+.IP \fBbceil()\fR 4
+.IX Item "bceil()"
+.Vb 1
+\& $x\->bceil();
+.Ve
+.Sp
+Round \f(CW$x\fR towards plus infinity, i.e., set \f(CW$x\fR to the smallest integer greater
+than or equal to \f(CW$x\fR).
+.IP \fBbint()\fR 4
+.IX Item "bint()"
+.Vb 1
+\& $x\->bint();
+.Ve
+.Sp
+Round \f(CW$x\fR towards zero.
+.SS "Other mathematical methods"
+.IX Subsection "Other mathematical methods"
+.IP \fBbgcd()\fR 4
+.IX Item "bgcd()"
+.Vb 2
+\& $x \-> bgcd($y); # GCD of $x and $y
+\& $x \-> bgcd($y, $z, ...); # GCD of $x, $y, $z, ...
+.Ve
+.Sp
+Returns the greatest common divisor (GCD).
+.IP \fBblcm()\fR 4
+.IX Item "blcm()"
+.Vb 2
+\& $x \-> blcm($y); # LCM of $x and $y
+\& $x \-> blcm($y, $z, ...); # LCM of $x, $y, $z, ...
+.Ve
+.Sp
+Returns the least common multiple (LCM).
+.SS "Object property methods"
+.IX Subsection "Object property methods"
+.IP \fBsign()\fR 4
+.IX Item "sign()"
+.Vb 1
+\& $x\->sign();
+.Ve
+.Sp
+Return the sign, of \f(CW$x\fR, meaning either \f(CW\*(C`+\*(C'\fR, \f(CW\*(C`\-\*(C'\fR, \f(CW\*(C`\-inf\*(C'\fR, \f(CW\*(C`+inf\*(C'\fR or NaN.
+.Sp
+If you want \f(CW$x\fR to have a certain sign, use one of the following methods:
+.Sp
+.Vb 5
+\& $x\->babs(); # \*(Aq+\*(Aq
+\& $x\->babs()\->bneg(); # \*(Aq\-\*(Aq
+\& $x\->bnan(); # \*(AqNaN\*(Aq
+\& $x\->binf(); # \*(Aq+inf\*(Aq
+\& $x\->binf(\*(Aq\-\*(Aq); # \*(Aq\-inf\*(Aq
+.Ve
+.IP \fBdigit()\fR 4
+.IX Item "digit()"
+.Vb 1
+\& $x\->digit($n); # return the nth digit, counting from right
+.Ve
+.Sp
+If \f(CW$n\fR is negative, returns the digit counting from left.
+.IP \fBdigitsum()\fR 4
+.IX Item "digitsum()"
+.Vb 1
+\& $x\->digitsum();
+.Ve
+.Sp
+Computes the sum of the base 10 digits and returns it.
+.IP \fBbdigitsum()\fR 4
+.IX Item "bdigitsum()"
+.Vb 1
+\& $x\->bdigitsum();
+.Ve
+.Sp
+Computes the sum of the base 10 digits and assigns the result to the invocand.
+.IP \fBlength()\fR 4
+.IX Item "length()"
+.Vb 2
+\& $x\->length();
+\& ($xl, $fl) = $x\->length();
+.Ve
+.Sp
+Returns the number of digits in the decimal representation of the number. In
+list context, returns the length of the integer and fraction part. For
+Math::BigInt objects, the length of the fraction part is always 0.
+.Sp
+The following probably doesn't do what you expect:
+.Sp
+.Vb 2
+\& $c = Math::BigInt\->new(123);
+\& print $c\->length(),"\en"; # prints 30
+.Ve
+.Sp
+It prints both the number of digits in the number and in the fraction part
+since print calls \f(CWlength()\fR in list context. Use something like:
+.Sp
+.Vb 1
+\& print scalar $c\->length(),"\en"; # prints 3
+.Ve
+.IP \fBmantissa()\fR 4
+.IX Item "mantissa()"
+.Vb 1
+\& $x\->mantissa();
+.Ve
+.Sp
+Return the signed mantissa of \f(CW$x\fR as a Math::BigInt.
+.IP \fBexponent()\fR 4
+.IX Item "exponent()"
+.Vb 1
+\& $x\->exponent();
+.Ve
+.Sp
+Return the exponent of \f(CW$x\fR as a Math::BigInt.
+.IP \fBparts()\fR 4
+.IX Item "parts()"
+.Vb 1
+\& $x\->parts();
+.Ve
+.Sp
+Returns the significand (mantissa) and the exponent as integers. In
+Math::BigFloat, both are returned as Math::BigInt objects.
+.IP \fBsparts()\fR 4
+.IX Item "sparts()"
+Returns the significand (mantissa) and the exponent as integers. In scalar
+context, only the significand is returned. The significand is the integer with
+the smallest absolute value. The output of \f(CWsparts()\fR corresponds to the
+output from \f(CWbsstr()\fR.
+.Sp
+In Math::BigInt, this method is identical to \f(CWparts()\fR.
+.IP \fBnparts()\fR 4
+.IX Item "nparts()"
+Returns the significand (mantissa) and exponent corresponding to normalized
+notation. In scalar context, only the significand is returned. For finite
+non-zero numbers, the significand's absolute value is greater than or equal to
+1 and less than 10. The output of \f(CWnparts()\fR corresponds to the output from
+\&\f(CWbnstr()\fR. In Math::BigInt, if the significand can not be represented as an
+integer, upgrading is performed or NaN is returned.
+.IP \fBeparts()\fR 4
+.IX Item "eparts()"
+Returns the significand (mantissa) and exponent corresponding to engineering
+notation. In scalar context, only the significand is returned. For finite
+non-zero numbers, the significand's absolute value is greater than or equal to
+1 and less than 1000, and the exponent is a multiple of 3. The output of
+\&\f(CWeparts()\fR corresponds to the output from \f(CWbestr()\fR. In Math::BigInt, if the
+significand can not be represented as an integer, upgrading is performed or NaN
+is returned.
+.IP \fBdparts()\fR 4
+.IX Item "dparts()"
+Returns the integer part and the fraction part. If the fraction part can not be
+represented as an integer, upgrading is performed or NaN is returned. The
+output of \f(CWdparts()\fR corresponds to the output from \f(CWbdstr()\fR.
+.IP \fBfparts()\fR 4
+.IX Item "fparts()"
+Returns the smallest possible numerator and denominator so that the numerator
+divided by the denominator gives back the original value. For finite numbers,
+both values are integers. Mnemonic: fraction.
+.IP \fBnumerator()\fR 4
+.IX Item "numerator()"
+Together with "\fBdenominator()\fR", returns the smallest integers so that the
+numerator divided by the denominator reproduces the original value. With
+Math::BigInt, \fBnumerator()\fR simply returns a copy of the invocand.
+.IP \fBdenominator()\fR 4
+.IX Item "denominator()"
+Together with "\fBnumerator()\fR", returns the smallest integers so that the
+numerator divided by the denominator reproduces the original value. With
+Math::BigInt, \fBdenominator()\fR always returns either a 1 or a NaN.
+.SS "String conversion methods"
+.IX Subsection "String conversion methods"
+.IP \fBbstr()\fR 4
+.IX Item "bstr()"
+Returns a string representing the number using decimal notation. In
+Math::BigFloat, the output is zero padded according to the current accuracy or
+precision, if any of those are defined.
+.IP \fBbsstr()\fR 4
+.IX Item "bsstr()"
+Returns a string representing the number using scientific notation where both
+the significand (mantissa) and the exponent are integers. The output
+corresponds to the output from \f(CWsparts()\fR.
+.Sp
+.Vb 5
+\& 123 is returned as "123e+0"
+\& 1230 is returned as "123e+1"
+\& 12300 is returned as "123e+2"
+\& 12000 is returned as "12e+3"
+\& 10000 is returned as "1e+4"
+.Ve
+.IP \fBbnstr()\fR 4
+.IX Item "bnstr()"
+Returns a string representing the number using normalized notation, the most
+common variant of scientific notation. For finite non-zero numbers, the
+absolute value of the significand is greater than or equal to 1 and less than
+10. The output corresponds to the output from \f(CWnparts()\fR.
+.Sp
+.Vb 5
+\& 123 is returned as "1.23e+2"
+\& 1230 is returned as "1.23e+3"
+\& 12300 is returned as "1.23e+4"
+\& 12000 is returned as "1.2e+4"
+\& 10000 is returned as "1e+4"
+.Ve
+.IP \fBbestr()\fR 4
+.IX Item "bestr()"
+Returns a string representing the number using engineering notation. For finite
+non-zero numbers, the absolute value of the significand is greater than or
+equal to 1 and less than 1000, and the exponent is a multiple of 3. The output
+corresponds to the output from \f(CWeparts()\fR.
+.Sp
+.Vb 5
+\& 123 is returned as "123e+0"
+\& 1230 is returned as "1.23e+3"
+\& 12300 is returned as "12.3e+3"
+\& 12000 is returned as "12e+3"
+\& 10000 is returned as "10e+3"
+.Ve
+.IP \fBbdstr()\fR 4
+.IX Item "bdstr()"
+Returns a string representing the number using decimal notation. The output
+corresponds to the output from \f(CWdparts()\fR.
+.Sp
+.Vb 5
+\& 123 is returned as "123"
+\& 1230 is returned as "1230"
+\& 12300 is returned as "12300"
+\& 12000 is returned as "12000"
+\& 10000 is returned as "10000"
+.Ve
+.IP \fBbfstr()\fR 4
+.IX Item "bfstr()"
+Returns a string representing the number using fractional notation. The output
+corresponds to the output from \f(CWfparts()\fR.
+.Sp
+.Vb 5
+\& 12.345 is returned as "2469/200"
+\& 123.45 is returned as "2469/20"
+\& 1234.5 is returned as "2469/2"
+\& 12345 is returned as "12345"
+\& 123450 is returned as "123450"
+.Ve
+.IP \fBto_hex()\fR 4
+.IX Item "to_hex()"
+.Vb 1
+\& $x\->to_hex();
+.Ve
+.Sp
+Returns a hexadecimal string representation of the number. See also \fBfrom_hex()\fR.
+.IP \fBto_bin()\fR 4
+.IX Item "to_bin()"
+.Vb 1
+\& $x\->to_bin();
+.Ve
+.Sp
+Returns a binary string representation of the number. See also \fBfrom_bin()\fR.
+.IP \fBto_oct()\fR 4
+.IX Item "to_oct()"
+.Vb 1
+\& $x\->to_oct();
+.Ve
+.Sp
+Returns an octal string representation of the number. See also \fBfrom_oct()\fR.
+.IP \fBto_bytes()\fR 4
+.IX Item "to_bytes()"
+.Vb 2
+\& $x = Math::BigInt\->new("1667327589");
+\& $s = $x\->to_bytes(); # $s = "cafe"
+.Ve
+.Sp
+Returns a byte string representation of the number using big endian byte order.
+The invocand must be a non-negative, finite integer. See also \fBfrom_bytes()\fR.
+.IP \fBto_base()\fR 4
+.IX Item "to_base()"
+.Vb 4
+\& $x = Math::BigInt\->new("250");
+\& $x\->to_base(2); # returns "11111010"
+\& $x\->to_base(8); # returns "372"
+\& $x\->to_base(16); # returns "fa"
+.Ve
+.Sp
+Returns a string representation of the number in the given base. If a collation
+sequence is given, the collation sequence determines which characters are used
+in the output.
+.Sp
+Here are some more examples
+.Sp
+.Vb 4
+\& $x = Math::BigInt\->new("16")\->to_base(3); # returns "121"
+\& $x = Math::BigInt\->new("44027")\->to_base(36); # returns "XYZ"
+\& $x = Math::BigInt\->new("58314")\->to_base(42); # returns "Why"
+\& $x = Math::BigInt\->new("4")\->to_base(2, "\-|"); # returns "|\-\-"
+.Ve
+.Sp
+See \fBfrom_base()\fR for information and examples.
+.IP \fBto_base_num()\fR 4
+.IX Item "to_base_num()"
+Converts the given number to the given base. This method is equivalent to
+\&\f(CW_to_base()\fR, but returns numbers in an array rather than characters in a
+string. In the output, the first element is the most significant. Unlike
+\&\f(CW_to_base()\fR, all input values may be arbitrarily large.
+.Sp
+.Vb 2
+\& $x = Math::BigInt\->new(13);
+\& $x\->to_base_num(2); # returns [1, 1, 0, 1]
+\&
+\& $x = Math::BigInt\->new(65191);
+\& $x\->to_base_num(128); # returns [3, 125, 39]
+.Ve
+.IP \fBas_hex()\fR 4
+.IX Item "as_hex()"
+.Vb 1
+\& $x\->as_hex();
+.Ve
+.Sp
+As, \f(CWto_hex()\fR, but with a "0x" prefix.
+.IP \fBas_bin()\fR 4
+.IX Item "as_bin()"
+.Vb 1
+\& $x\->as_bin();
+.Ve
+.Sp
+As, \f(CWto_bin()\fR, but with a "0b" prefix.
+.IP \fBas_oct()\fR 4
+.IX Item "as_oct()"
+.Vb 1
+\& $x\->as_oct();
+.Ve
+.Sp
+As, \f(CWto_oct()\fR, but with a "0" prefix.
+.IP \fBas_bytes()\fR 4
+.IX Item "as_bytes()"
+This is just an alias for \f(CWto_bytes()\fR.
+.SS "Other conversion methods"
+.IX Subsection "Other conversion methods"
+.IP \fBnumify()\fR 4
+.IX Item "numify()"
+.Vb 1
+\& print $x\->numify();
+.Ve
+.Sp
+Returns a Perl scalar from \f(CW$x\fR. It is used automatically whenever a scalar is
+needed, for instance in array index operations.
+.SS "Utility methods"
+.IX Subsection "Utility methods"
+These utility methods are made public
+.IP \fBdec_str_to_dec_flt_str()\fR 4
+.IX Item "dec_str_to_dec_flt_str()"
+Takes a string representing any valid number using decimal notation and converts
+it to a string representing the same number using decimal floating point
+notation. The output consists of five parts joined together: the sign of the
+significand, the absolute value of the significand as the smallest possible
+integer, the letter "e", the sign of the exponent, and the absolute value of the
+exponent. If the input is invalid, nothing is returned.
+.Sp
+.Vb 1
+\& $str2 = $class \-> dec_str_to_dec_flt_str($str1);
+.Ve
+.Sp
+Some examples
+.Sp
+.Vb 4
+\& Input Output
+\& 31400.00e\-4 +314e\-2
+\& \-0.00012300e8 \-123e+2
+\& 0 +0e+0
+.Ve
+.IP \fBhex_str_to_dec_flt_str()\fR 4
+.IX Item "hex_str_to_dec_flt_str()"
+Takes a string representing any valid number using hexadecimal notation and
+converts it to a string representing the same number using decimal floating
+point notation. The output has the same format as that of
+"\fBdec_str_to_dec_flt_str()\fR".
+.Sp
+.Vb 1
+\& $str2 = $class \-> hex_str_to_dec_flt_str($str1);
+.Ve
+.Sp
+Some examples
+.Sp
+.Vb 2
+\& Input Output
+\& 0xff +255e+0
+.Ve
+.Sp
+Some examples
+.IP \fBoct_str_to_dec_flt_str()\fR 4
+.IX Item "oct_str_to_dec_flt_str()"
+Takes a string representing any valid number using octal notation and converts
+it to a string representing the same number using decimal floating point
+notation. The output has the same format as that of
+"\fBdec_str_to_dec_flt_str()\fR".
+.Sp
+.Vb 1
+\& $str2 = $class \-> oct_str_to_dec_flt_str($str1);
+.Ve
+.IP \fBbin_str_to_dec_flt_str()\fR 4
+.IX Item "bin_str_to_dec_flt_str()"
+Takes a string representing any valid number using binary notation and converts
+it to a string representing the same number using decimal floating point
+notation. The output has the same format as that of
+"\fBdec_str_to_dec_flt_str()\fR".
+.Sp
+.Vb 1
+\& $str2 = $class \-> bin_str_to_dec_flt_str($str1);
+.Ve
+.IP \fBdec_str_to_dec_str()\fR 4
+.IX Item "dec_str_to_dec_str()"
+Takes a string representing any valid number using decimal notation and converts
+it to a string representing the same number using decimal notation. If the
+number represents an integer, the output consists of a sign and the absolute
+value. If the number represents a non-integer, the output consists of a sign,
+the integer part of the number, the decimal point ".", and the fraction part of
+the number without any trailing zeros. If the input is invalid, nothing is
+returned.
+.IP \fBhex_str_to_dec_str()\fR 4
+.IX Item "hex_str_to_dec_str()"
+Takes a string representing any valid number using hexadecimal notation and
+converts it to a string representing the same number using decimal notation. The
+output has the same format as that of "\fBdec_str_to_dec_str()\fR".
+.IP \fBoct_str_to_dec_str()\fR 4
+.IX Item "oct_str_to_dec_str()"
+Takes a string representing any valid number using octal notation and converts
+it to a string representing the same number using decimal notation. The
+output has the same format as that of "\fBdec_str_to_dec_str()\fR".
+.IP \fBbin_str_to_dec_str()\fR 4
+.IX Item "bin_str_to_dec_str()"
+Takes a string representing any valid number using binary notation and converts
+it to a string representing the same number using decimal notation. The output
+has the same format as that of "\fBdec_str_to_dec_str()\fR".
+.SH "ACCURACY and PRECISION"
+.IX Header "ACCURACY and PRECISION"
+Math::BigInt and Math::BigFloat have full support for accuracy and precision
+based rounding, both automatically after every operation, as well as manually.
+.PP
+This section describes the accuracy/precision handling in Math::BigInt and
+Math::BigFloat as it used to be and as it is now, complete with an explanation
+of all terms and abbreviations.
+.PP
+Not yet implemented things (but with correct description) are marked with '!',
+things that need to be answered are marked with '?'.
+.PP
+In the next paragraph follows a short description of terms used here (because
+these may differ from terms used by others people or documentation).
+.PP
+During the rest of this document, the shortcuts A (for accuracy), P (for
+precision), F (fallback) and R (rounding mode) are be used.
+.SS "Precision P"
+.IX Subsection "Precision P"
+Precision is a fixed number of digits before (positive) or after (negative) the
+decimal point. For example, 123.45 has a precision of \-2. 0 means an integer
+like 123 (or 120). A precision of 2 means at least two digits to the left of
+the decimal point are zero, so 123 with P = 1 becomes 120. Note that numbers
+with zeros before the decimal point may have different precisions, because 1200
+can have P = 0, 1 or 2 (depending on what the initial value was). It could also
+have p < 0, when the digits after the decimal point are zero.
+.PP
+The string output (of floating point numbers) is padded with zeros:
+.PP
+.Vb 9
+\& Initial value P A Result String
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& 1234.01 \-3 1000 1000
+\& 1234 \-2 1200 1200
+\& 1234.5 \-1 1230 1230
+\& 1234.001 1 1234 1234.0
+\& 1234.01 0 1234 1234
+\& 1234.01 2 1234.01 1234.01
+\& 1234.01 5 1234.01 1234.01000
+.Ve
+.PP
+For Math::BigInt objects, no padding occurs.
+.SS "Accuracy A"
+.IX Subsection "Accuracy A"
+Number of significant digits. Leading zeros are not counted. A number may have
+an accuracy greater than the non-zero digits when there are zeros in it or
+trailing zeros. For example, 123.456 has A of 6, 10203 has 5, 123.0506 has 7,
+123.45000 has 8 and 0.000123 has 3.
+.PP
+The string output (of floating point numbers) is padded with zeros:
+.PP
+.Vb 5
+\& Initial value P A Result String
+\& \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& 1234.01 3 1230 1230
+\& 1234.01 6 1234.01 1234.01
+\& 1234.1 8 1234.1 1234.1000
+.Ve
+.PP
+For Math::BigInt objects, no padding occurs.
+.SS "Fallback F"
+.IX Subsection "Fallback F"
+When both A and P are undefined, this is used as a fallback accuracy when
+dividing numbers.
+.SS "Rounding mode R"
+.IX Subsection "Rounding mode R"
+When rounding a number, different 'styles' or 'kinds' of rounding are possible.
+(Note that random rounding, as in Math::Round, is not implemented.)
+.PP
+\fIDirected rounding\fR
+.IX Subsection "Directed rounding"
+.PP
+These round modes always round in the same direction.
+.IP 'trunc' 4
+.IX Item "'trunc'"
+Round towards zero. Remove all digits following the rounding place, i.e.,
+replace them with zeros. Thus, 987.65 rounded to tens (P=1) becomes 980, and
+rounded to the fourth significant digit becomes 987.6 (A=4). 123.456 rounded to
+the second place after the decimal point (P=\-2) becomes 123.46. This
+corresponds to the IEEE 754 rounding mode 'roundTowardZero'.
+.PP
+\fIRounding to nearest\fR
+.IX Subsection "Rounding to nearest"
+.PP
+These rounding modes round to the nearest digit. They differ in how they
+determine which way to round in the ambiguous case when there is a tie.
+.IP 'even' 4
+.IX Item "'even'"
+Round towards the nearest even digit, e.g., when rounding to nearest integer,
+\&\-5.5 becomes \-6, 4.5 becomes 4, but 4.501 becomes 5. This corresponds to the
+IEEE 754 rounding mode 'roundTiesToEven'.
+.IP 'odd' 4
+.IX Item "'odd'"
+Round towards the nearest odd digit, e.g., when rounding to nearest integer,
+4.5 becomes 5, \-5.5 becomes \-5, but 5.501 becomes 6. This corresponds to the
+IEEE 754 rounding mode 'roundTiesToOdd'.
+.IP '+inf' 4
+.IX Item "'+inf'"
+Round towards plus infinity, i.e., always round up. E.g., when rounding to the
+nearest integer, 4.5 becomes 5, \-5.5 becomes \-5, and 4.501 also becomes 5. This
+corresponds to the IEEE 754 rounding mode 'roundTiesToPositive'.
+.IP '\-inf' 4
+.IX Item "'-inf'"
+Round towards minus infinity, i.e., always round down. E.g., when rounding to
+the nearest integer, 4.5 becomes 4, \-5.5 becomes \-6, but 4.501 becomes 5. This
+corresponds to the IEEE 754 rounding mode 'roundTiesToNegative'.
+.IP 'zero' 4
+.IX Item "'zero'"
+Round towards zero, i.e., round positive numbers down and negative numbers up.
+E.g., when rounding to the nearest integer, 4.5 becomes 4, \-5.5 becomes \-5, but
+4.501 becomes 5. This corresponds to the IEEE 754 rounding mode
+\&'roundTiesToZero'.
+.IP 'common' 4
+.IX Item "'common'"
+Round away from zero, i.e., round to the number with the largest absolute
+value. E.g., when rounding to the nearest integer, \-1.5 becomes \-2, 1.5 becomes
+2 and 1.49 becomes 1. This corresponds to the IEEE 754 rounding mode
+\&'roundTiesToAway'.
+.PP
+The handling of A & P in MBI/MBF (the old core code shipped with Perl versions
+<= 5.7.2) is like this:
+.IP Precision 4
+.IX Item "Precision"
+.Vb 3
+\& * bfround($p) is able to round to $p number of digits after the decimal
+\& point
+\& * otherwise P is unused
+.Ve
+.IP "Accuracy (significant digits)" 4
+.IX Item "Accuracy (significant digits)"
+.Vb 10
+\& * bround($a) rounds to $a significant digits
+\& * only bdiv() and bsqrt() take A as (optional) parameter
+\& + other operations simply create the same number (bneg etc), or
+\& more (bmul) of digits
+\& + rounding/truncating is only done when explicitly calling one
+\& of bround or bfround, and never for Math::BigInt (not implemented)
+\& * bsqrt() simply hands its accuracy argument over to bdiv.
+\& * the documentation and the comment in the code indicate two
+\& different ways on how bdiv() determines the maximum number
+\& of digits it should calculate, and the actual code does yet
+\& another thing
+\& POD:
+\& max($Math::BigFloat::div_scale,length(dividend)+length(divisor))
+\& Comment:
+\& result has at most max(scale, length(dividend), length(divisor)) digits
+\& Actual code:
+\& scale = max(scale, length(dividend)\-1,length(divisor)\-1);
+\& scale += length(divisor) \- length(dividend);
+\& So for lx = 3, ly = 9, scale = 10, scale will actually be 16 (10
+\& So for lx = 3, ly = 9, scale = 10, scale will actually be 16
+\& (10+9\-3). Actually, the \*(Aqdifference\*(Aq added to the scale is cal\-
+\& culated from the number of "significant digits" in dividend and
+\& divisor, which is derived by looking at the length of the man\-
+\& tissa. Which is wrong, since it includes the + sign (oops) and
+\& actually gets 2 for \*(Aq+100\*(Aq and 4 for \*(Aq+101\*(Aq. Oops again. Thus
+\& 124/3 with div_scale=1 will get you \*(Aq41.3\*(Aq based on the strange
+\& assumption that 124 has 3 significant digits, while 120/7 will
+\& get you \*(Aq17\*(Aq, not \*(Aq17.1\*(Aq since 120 is thought to have 2 signif\-
+\& icant digits. The rounding after the division then uses the
+\& remainder and $y to determine whether it must round up or down.
+\& ? I have no idea which is the right way. That\*(Aqs why I used a slightly more
+\& ? simple scheme and tweaked the few failing testcases to match it.
+.Ve
+.PP
+This is how it works now:
+.IP Setting/Accessing 4
+.IX Item "Setting/Accessing"
+.Vb 10
+\& * You can set the A global via Math::BigInt\->accuracy() or
+\& Math::BigFloat\->accuracy() or whatever class you are using.
+\& * You can also set P globally by using Math::SomeClass\->precision()
+\& likewise.
+\& * Globals are classwide, and not inherited by subclasses.
+\& * to undefine A, use Math::SomeClass\->accuracy(undef);
+\& * to undefine P, use Math::SomeClass\->precision(undef);
+\& * Setting Math::SomeClass\->accuracy() clears automatically
+\& Math::SomeClass\->precision(), and vice versa.
+\& * To be valid, A must be > 0, P can have any value.
+\& * If P is negative, this means round to the P\*(Aqth place to the right of the
+\& decimal point; positive values mean to the left of the decimal point.
+\& P of 0 means round to integer.
+\& * to find out the current global A, use Math::SomeClass\->accuracy()
+\& * to find out the current global P, use Math::SomeClass\->precision()
+\& * use $x\->accuracy() respective $x\->precision() for the local
+\& setting of $x.
+\& * Please note that $x\->accuracy() respective $x\->precision()
+\& return eventually defined global A or P, when $x\*(Aqs A or P is not
+\& set.
+.Ve
+.IP "Creating numbers" 4
+.IX Item "Creating numbers"
+.Vb 12
+\& * When you create a number, you can give the desired A or P via:
+\& $x = Math::BigInt\->new($number,$A,$P);
+\& * Only one of A or P can be defined, otherwise the result is NaN
+\& * If no A or P is give ($x = Math::BigInt\->new($number) form), then the
+\& globals (if set) will be used. Thus changing the global defaults later on
+\& will not change the A or P of previously created numbers (i.e., A and P of
+\& $x will be what was in effect when $x was created)
+\& * If given undef for A and P, NO rounding will occur, and the globals will
+\& NOT be used. This is used by subclasses to create numbers without
+\& suffering rounding in the parent. Thus a subclass is able to have its own
+\& globals enforced upon creation of a number by using
+\& $x = Math::BigInt\->new($number,undef,undef):
+\&
+\& use Math::BigInt::SomeSubclass;
+\& use Math::BigInt;
+\&
+\& Math::BigInt\->accuracy(2);
+\& Math::BigInt::SomeSubclass\->accuracy(3);
+\& $x = Math::BigInt::SomeSubclass\->new(1234);
+\&
+\& $x is now 1230, and not 1200. A subclass might choose to implement
+\& this otherwise, e.g. falling back to the parent\*(Aqs A and P.
+.Ve
+.IP Usage 4
+.IX Item "Usage"
+.Vb 7
+\& * If A or P are enabled/defined, they are used to round the result of each
+\& operation according to the rules below
+\& * Negative P is ignored in Math::BigInt, since Math::BigInt objects never
+\& have digits after the decimal point
+\& * Math::BigFloat uses Math::BigInt internally, but setting A or P inside
+\& Math::BigInt as globals does not tamper with the parts of a Math::BigFloat.
+\& A flag is used to mark all Math::BigFloat numbers as \*(Aqnever round\*(Aq.
+.Ve
+.IP Precedence 4
+.IX Item "Precedence"
+.Vb 10
+\& * It only makes sense that a number has only one of A or P at a time.
+\& If you set either A or P on one object, or globally, the other one will
+\& be automatically cleared.
+\& * If two objects are involved in an operation, and one of them has A in
+\& effect, and the other P, this results in an error (NaN).
+\& * A takes precedence over P (Hint: A comes before P).
+\& If neither of them is defined, nothing is used, i.e. the result will have
+\& as many digits as it can (with an exception for bdiv/bsqrt) and will not
+\& be rounded.
+\& * There is another setting for bdiv() (and thus for bsqrt()). If neither of
+\& A or P is defined, bdiv() will use a fallback (F) of $div_scale digits.
+\& If either the dividend\*(Aqs or the divisor\*(Aqs mantissa has more digits than
+\& the value of F, the higher value will be used instead of F.
+\& This is to limit the digits (A) of the result (just consider what would
+\& happen with unlimited A and P in the case of 1/3 :\-)
+\& * bdiv will calculate (at least) 4 more digits than required (determined by
+\& A, P or F), and, if F is not used, round the result
+\& (this will still fail in the case of a result like 0.12345000000001 with A
+\& or P of 5, but this can not be helped \- or can it?)
+\& * Thus you can have the math done by on Math::Big* class in two modi:
+\& + never round (this is the default):
+\& This is done by setting A and P to undef. No math operation
+\& will round the result, with bdiv() and bsqrt() as exceptions to guard
+\& against overflows. You must explicitly call bround(), bfround() or
+\& round() (the latter with parameters).
+\& Note: Once you have rounded a number, the settings will \*(Aqstick\*(Aq on it
+\& and \*(Aqinfect\*(Aq all other numbers engaged in math operations with it, since
+\& local settings have the highest precedence. So, to get SaferRound[tm],
+\& use a copy() before rounding like this:
+\&
+\& $x = Math::BigFloat\->new(12.34);
+\& $y = Math::BigFloat\->new(98.76);
+\& $z = $x * $y; # 1218.6984
+\& print $x\->copy()\->bround(3); # 12.3 (but A is now 3!)
+\& $z = $x * $y; # still 1218.6984, without
+\& # copy would have been 1210!
+\&
+\& + round after each op:
+\& After each single operation (except for testing like is_zero()), the
+\& method round() is called and the result is rounded appropriately. By
+\& setting proper values for A and P, you can have all\-the\-same\-A or
+\& all\-the\-same\-P modes. For example, Math::Currency might set A to undef,
+\& and P to \-2, globally.
+\&
+\& ?Maybe an extra option that forbids local A & P settings would be in order,
+\& ?so that intermediate rounding does not \*(Aqpoison\*(Aq further math?
+.Ve
+.IP "Overriding globals" 4
+.IX Item "Overriding globals"
+.Vb 10
+\& * you will be able to give A, P and R as an argument to all the calculation
+\& routines; the second parameter is A, the third one is P, and the fourth is
+\& R (shift right by one for binary operations like badd). P is used only if
+\& the first parameter (A) is undefined. These three parameters override the
+\& globals in the order detailed as follows, i.e. the first defined value
+\& wins:
+\& (local: per object, global: global default, parameter: argument to sub)
+\& + parameter A
+\& + parameter P
+\& + local A (if defined on both of the operands: smaller one is taken)
+\& + local P (if defined on both of the operands: bigger one is taken)
+\& + global A
+\& + global P
+\& + global F
+\& * bsqrt() will hand its arguments to bdiv(), as it used to, only now for two
+\& arguments (A and P) instead of one
+.Ve
+.IP "Local settings" 4
+.IX Item "Local settings"
+.Vb 5
+\& * You can set A or P locally by using $x\->accuracy() or
+\& $x\->precision()
+\& and thus force different A and P for different objects/numbers.
+\& * Setting A or P this way immediately rounds $x to the new value.
+\& * $x\->accuracy() clears $x\->precision(), and vice versa.
+.Ve
+.IP Rounding 4
+.IX Item "Rounding"
+.Vb 10
+\& * the rounding routines will use the respective global or local settings.
+\& bround() is for accuracy rounding, while bfround() is for precision
+\& * the two rounding functions take as the second parameter one of the
+\& following rounding modes (R):
+\& \*(Aqeven\*(Aq, \*(Aqodd\*(Aq, \*(Aq+inf\*(Aq, \*(Aq\-inf\*(Aq, \*(Aqzero\*(Aq, \*(Aqtrunc\*(Aq, \*(Aqcommon\*(Aq
+\& * you can set/get the global R by using Math::SomeClass\->round_mode()
+\& or by setting $Math::SomeClass::round_mode
+\& * after each operation, $result\->round() is called, and the result may
+\& eventually be rounded (that is, if A or P were set either locally,
+\& globally or as parameter to the operation)
+\& * to manually round a number, call $x\->round($A,$P,$round_mode);
+\& this will round the number by using the appropriate rounding function
+\& and then normalize it.
+\& * rounding modifies the local settings of the number:
+\&
+\& $x = Math::BigFloat\->new(123.456);
+\& $x\->accuracy(5);
+\& $x\->bround(4);
+\&
+\& Here 4 takes precedence over 5, so 123.5 is the result and $x\->accuracy()
+\& will be 4 from now on.
+.Ve
+.IP "Default values" 4
+.IX Item "Default values"
+.Vb 4
+\& * R: \*(Aqeven\*(Aq
+\& * F: 40
+\& * A: undef
+\& * P: undef
+.Ve
+.IP Remarks 4
+.IX Item "Remarks"
+.Vb 5
+\& * The defaults are set up so that the new code gives the same results as
+\& the old code (except in a few cases on bdiv):
+\& + Both A and P are undefined and thus will not be used for rounding
+\& after each operation.
+\& + round() is thus a no\-op, unless given extra parameters A and P
+.Ve
+.SH "Infinity and Not a Number"
+.IX Header "Infinity and Not a Number"
+While Math::BigInt has extensive handling of inf and NaN, certain quirks
+remain.
+.IP \fBoct()\fR/\fBhex()\fR 4
+.IX Item "oct()/hex()"
+These perl routines currently (as of Perl v.5.8.6) cannot handle passed inf.
+.Sp
+.Vb 9
+\& te@linux:~> perl \-wle \*(Aqprint 2 ** 3333\*(Aq
+\& Inf
+\& te@linux:~> perl \-wle \*(Aqprint 2 ** 3333 == 2 ** 3333\*(Aq
+\& 1
+\& te@linux:~> perl \-wle \*(Aqprint oct(2 ** 3333)\*(Aq
+\& 0
+\& te@linux:~> perl \-wle \*(Aqprint hex(2 ** 3333)\*(Aq
+\& Illegal hexadecimal digit \*(AqI\*(Aq ignored at \-e line 1.
+\& 0
+.Ve
+.Sp
+The same problems occur if you pass them Math::BigInt\->\fBbinf()\fR objects. Since
+overloading these routines is not possible, this cannot be fixed from
+Math::BigInt.
+.SH INTERNALS
+.IX Header "INTERNALS"
+You should neither care about nor depend on the internal representation; it
+might change without notice. Use \fBONLY\fR method calls like \f(CW\*(C`$x\->sign();\*(C'\fR
+instead relying on the internal representation.
+.SS "MATH LIBRARY"
+.IX Subsection "MATH LIBRARY"
+The mathematical computations are performed by a backend library. It is not
+required to specify which backend library to use, but some backend libraries
+are much faster than the default library.
+.PP
+\fIThe default library\fR
+.IX Subsection "The default library"
+.PP
+The default library is Math::BigInt::Calc, which is implemented in pure Perl
+and hence does not require a compiler.
+.PP
+\fISpecifying a library\fR
+.IX Subsection "Specifying a library"
+.PP
+The simple case
+.PP
+.Vb 1
+\& use Math::BigInt;
+.Ve
+.PP
+is equivalent to saying
+.PP
+.Vb 1
+\& use Math::BigInt try => \*(AqCalc\*(Aq;
+.Ve
+.PP
+You can use a different backend library with, e.g.,
+.PP
+.Vb 1
+\& use Math::BigInt try => \*(AqGMP\*(Aq;
+.Ve
+.PP
+which attempts to load the Math::BigInt::GMP library, and falls back to the
+default library if the specified library can't be loaded.
+.PP
+Multiple libraries can be specified by separating them by a comma, e.g.,
+.PP
+.Vb 1
+\& use Math::BigInt try => \*(AqGMP,Pari\*(Aq;
+.Ve
+.PP
+If you request a specific set of libraries and do not allow fallback to the
+default library, specify them using "only",
+.PP
+.Vb 1
+\& use Math::BigInt only => \*(AqGMP,Pari\*(Aq;
+.Ve
+.PP
+If you prefer a specific set of libraries, but want to see a warning if the
+fallback library is used, specify them using "lib",
+.PP
+.Vb 1
+\& use Math::BigInt lib => \*(AqGMP,Pari\*(Aq;
+.Ve
+.PP
+The following first tries to find Math::BigInt::Foo, then Math::BigInt::Bar, and
+if this also fails, reverts to Math::BigInt::Calc:
+.PP
+.Vb 1
+\& use Math::BigInt try => \*(AqFoo,Math::BigInt::Bar\*(Aq;
+.Ve
+.PP
+\fIWhich library to use?\fR
+.IX Subsection "Which library to use?"
+.PP
+\&\fBNote\fR: General purpose packages should not be explicit about the library to
+use; let the script author decide which is best.
+.PP
+Math::BigInt::GMP, Math::BigInt::Pari, and Math::BigInt::GMPz are in
+cases involving big numbers much faster than Math::BigInt::Calc. However
+these libraries are slower when dealing with very small numbers (less than about
+20 digits) and when converting very large numbers to decimal (for instance for
+printing, rounding, calculating their length in decimal etc.).
+.PP
+So please select carefully what library you want to use.
+.PP
+Different low-level libraries use different formats to store the numbers, so
+mixing them won't work. You should not depend on the number having a specific
+internal format.
+.PP
+See the respective math library module documentation for further details.
+.PP
+\fILoading multiple libraries\fR
+.IX Subsection "Loading multiple libraries"
+.PP
+The first library that is successfully loaded is the one that will be used. Any
+further attempts at loading a different module will be ignored. This is to avoid
+the situation where module A requires math library X, and module B requires math
+library Y, causing modules A and B to be incompatible. For example,
+.PP
+.Vb 2
+\& use Math::BigInt; # loads default "Calc"
+\& use Math::BigFloat only => "GMP"; # ignores "GMP"
+.Ve
+.SS SIGN
+.IX Subsection "SIGN"
+The sign is either '+', '\-', 'NaN', '+inf' or '\-inf'.
+.PP
+A sign of 'NaN' is used to represent the result when input arguments are not
+numbers or as a result of 0/0. '+inf' and '\-inf' represent plus respectively
+minus infinity. You get '+inf' when dividing a positive number by 0, and '\-inf'
+when dividing any negative number by 0.
+.SH EXAMPLES
+.IX Header "EXAMPLES"
+.Vb 1
+\& use Math::BigInt;
+\&
+\& sub bigint { Math::BigInt\->new(shift); }
+\&
+\& $x = Math::BigInt\->bstr("1234") # string "1234"
+\& $x = "$x"; # same as bstr()
+\& $x = Math::BigInt\->bneg("1234"); # Math::BigInt "\-1234"
+\& $x = Math::BigInt\->babs("\-12345"); # Math::BigInt "12345"
+\& $x = Math::BigInt\->bnorm("\-0.00"); # Math::BigInt "0"
+\& $x = bigint(1) + bigint(2); # Math::BigInt "3"
+\& $x = bigint(1) + "2"; # ditto ("2" becomes a Math::BigInt)
+\& $x = bigint(1); # Math::BigInt "1"
+\& $x = $x + 5 / 2; # Math::BigInt "3"
+\& $x = $x ** 3; # Math::BigInt "27"
+\& $x *= 2; # Math::BigInt "54"
+\& $x = Math::BigInt\->new(0); # Math::BigInt "0"
+\& $x\-\-; # Math::BigInt "\-1"
+\& $x = Math::BigInt\->badd(4,5) # Math::BigInt "9"
+\& print $x\->bsstr(); # 9e+0
+.Ve
+.PP
+Examples for rounding:
+.PP
+.Vb 2
+\& use Math::BigFloat;
+\& use Test::More;
+\&
+\& $x = Math::BigFloat\->new(123.4567);
+\& $y = Math::BigFloat\->new(123.456789);
+\& Math::BigFloat\->accuracy(4); # no more A than 4
+\&
+\& is ($x\->copy()\->bround(),123.4); # even rounding
+\& print $x\->copy()\->bround(),"\en"; # 123.4
+\& Math::BigFloat\->round_mode(\*(Aqodd\*(Aq); # round to odd
+\& print $x\->copy()\->bround(),"\en"; # 123.5
+\& Math::BigFloat\->accuracy(5); # no more A than 5
+\& Math::BigFloat\->round_mode(\*(Aqodd\*(Aq); # round to odd
+\& print $x\->copy()\->bround(),"\en"; # 123.46
+\& $y = $x\->copy()\->bround(4),"\en"; # A = 4: 123.4
+\& print "$y, ",$y\->accuracy(),"\en"; # 123.4, 4
+\&
+\& Math::BigFloat\->accuracy(undef); # A not important now
+\& Math::BigFloat\->precision(2); # P important
+\& print $x\->copy()\->bnorm(),"\en"; # 123.46
+\& print $x\->copy()\->bround(),"\en"; # 123.46
+.Ve
+.PP
+Examples for converting:
+.PP
+.Vb 2
+\& my $x = Math::BigInt\->new(\*(Aq0b1\*(Aq.\*(Aq01\*(Aq x 123);
+\& print "bin: ",$x\->as_bin()," hex:",$x\->as_hex()," dec: ",$x,"\en";
+.Ve
+.SH "NUMERIC LITERALS"
+.IX Header "NUMERIC LITERALS"
+After \f(CW\*(C`use Math::BigInt \*(Aq:constant\*(Aq\*(C'\fR all numeric literals in the given scope
+are converted to \f(CW\*(C`Math::BigInt\*(C'\fR objects. This conversion happens at compile
+time. Every non-integer is convert to a NaN.
+.PP
+For example,
+.PP
+.Vb 1
+\& perl \-MMath::BigInt=:constant \-le \*(Aqprint 2**150\*(Aq
+.Ve
+.PP
+prints the exact value of \f(CW\*(C`2**150\*(C'\fR. Note that without conversion of constants
+to objects the expression \f(CW\*(C`2**150\*(C'\fR is calculated using Perl scalars, which
+leads to an inaccurate result.
+.PP
+Please note that strings are not affected, so that
+.PP
+.Vb 1
+\& use Math::BigInt qw/:constant/;
+\&
+\& $x = "1234567890123456789012345678901234567890"
+\& + "123456789123456789";
+.Ve
+.PP
+does give you what you expect. You need an explicit Math::BigInt\->\fBnew()\fR around
+at least one of the operands. You should also quote large constants to prevent
+loss of precision:
+.PP
+.Vb 1
+\& use Math::BigInt;
+\&
+\& $x = Math::BigInt\->new("1234567889123456789123456789123456789");
+.Ve
+.PP
+Without the quotes Perl first converts the large number to a floating point
+constant at compile time, and then converts the result to a Math::BigInt object
+at run time, which results in an inaccurate result.
+.SS "Hexadecimal, octal, and binary floating point literals"
+.IX Subsection "Hexadecimal, octal, and binary floating point literals"
+Perl (and this module) accepts hexadecimal, octal, and binary floating point
+literals, but use them with care with Perl versions before v5.32.0, because some
+versions of Perl silently give the wrong result. Below are some examples of
+different ways to write the number decimal 314.
+.PP
+Hexadecimal floating point literals:
+.PP
+.Vb 3
+\& 0x1.3ap+8 0X1.3AP+8
+\& 0x1.3ap8 0X1.3AP8
+\& 0x13a0p\-4 0X13A0P\-4
+.Ve
+.PP
+Octal floating point literals (with "0" prefix):
+.PP
+.Vb 3
+\& 01.164p+8 01.164P+8
+\& 01.164p8 01.164P8
+\& 011640p\-4 011640P\-4
+.Ve
+.PP
+Octal floating point literals (with "0o" prefix) (requires v5.34.0):
+.PP
+.Vb 3
+\& 0o1.164p+8 0O1.164P+8
+\& 0o1.164p8 0O1.164P8
+\& 0o11640p\-4 0O11640P\-4
+.Ve
+.PP
+Binary floating point literals:
+.PP
+.Vb 3
+\& 0b1.0011101p+8 0B1.0011101P+8
+\& 0b1.0011101p8 0B1.0011101P8
+\& 0b10011101000p\-2 0B10011101000P\-2
+.Ve
+.SH PERFORMANCE
+.IX Header "PERFORMANCE"
+Using the form \f(CW$x\fR += \f(CW$y\fR; etc over \f(CW$x\fR = \f(CW$x\fR + \f(CW$y\fR is faster, since a copy of \f(CW$x\fR
+must be made in the second case. For long numbers, the copy can eat up to 20%
+of the work (in the case of addition/subtraction, less for
+multiplication/division). If \f(CW$y\fR is very small compared to \f(CW$x\fR, the form \f(CW$x\fR += \f(CW$y\fR
+is MUCH faster than \f(CW$x\fR = \f(CW$x\fR + \f(CW$y\fR since making the copy of \f(CW$x\fR takes more time
+then the actual addition.
+.PP
+With a technique called copy-on-write, the cost of copying with overload could
+be minimized or even completely avoided. A test implementation of COW did show
+performance gains for overloaded math, but introduced a performance loss due to
+a constant overhead for all other operations. So Math::BigInt does currently
+not COW.
+.PP
+The rewritten version of this module (vs. v0.01) is slower on certain
+operations, like \f(CWnew()\fR, \f(CWbstr()\fR and \f(CWnumify()\fR. The reason are that it
+does now more work and handles much more cases. The time spent in these
+operations is usually gained in the other math operations so that code on the
+average should get (much) faster. If they don't, please contact the author.
+.PP
+Some operations may be slower for small numbers, but are significantly faster
+for big numbers. Other operations are now constant (O(1), like \f(CWbneg()\fR,
+\&\f(CWbabs()\fR etc), instead of O(N) and thus nearly always take much less time.
+These optimizations were done on purpose.
+.PP
+If you find the Calc module to slow, try to install any of the replacement
+modules and see if they help you.
+.SS "Alternative math libraries"
+.IX Subsection "Alternative math libraries"
+You can use an alternative library to drive Math::BigInt. See the section
+"MATH LIBRARY" for more information.
+.PP
+For more benchmark results see <http://bloodgate.com/perl/benchmarks.html>.
+.SH SUBCLASSING
+.IX Header "SUBCLASSING"
+.SS "Subclassing Math::BigInt"
+.IX Subsection "Subclassing Math::BigInt"
+The basic design of Math::BigInt allows simple subclasses with very little
+work, as long as a few simple rules are followed:
+.IP \(bu 4
+The public API must remain consistent, i.e. if a sub-class is overloading
+addition, the sub-class must use the same name, in this case \fBbadd()\fR. The reason
+for this is that Math::BigInt is optimized to call the object methods directly.
+.IP \(bu 4
+The private object hash keys like \f(CW\*(C`$x\->{sign}\*(C'\fR may not be changed, but
+additional keys can be added, like \f(CW\*(C`$x\->{_custom}\*(C'\fR.
+.IP \(bu 4
+Accessor functions are available for all existing object hash keys and should
+be used instead of directly accessing the internal hash keys. The reason for
+this is that Math::BigInt itself has a pluggable interface which permits it to
+support different storage methods.
+.PP
+More complex sub-classes may have to replicate more of the logic internal of
+Math::BigInt if they need to change more basic behaviors. A subclass that needs
+to merely change the output only needs to overload \f(CWbstr()\fR.
+.PP
+All other object methods and overloaded functions can be directly inherited
+from the parent class.
+.PP
+At the very minimum, any subclass needs to provide its own \f(CWnew()\fR and can
+store additional hash keys in the object. There are also some package globals
+that must be defined, e.g.:
+.PP
+.Vb 5
+\& # Globals
+\& $accuracy = undef;
+\& $precision = \-2; # round to 2 decimal places
+\& $round_mode = \*(Aqeven\*(Aq;
+\& $div_scale = 40;
+.Ve
+.PP
+Additionally, you might want to provide the following two globals to allow
+auto-upgrading and auto-downgrading to work correctly:
+.PP
+.Vb 2
+\& $upgrade = undef;
+\& $downgrade = undef;
+.Ve
+.PP
+This allows Math::BigInt to correctly retrieve package globals from the
+subclass, like \f(CW$SubClass::precision\fR. See t/Math/BigInt/Subclass.pm or
+t/Math/BigFloat/SubClass.pm completely functional subclass examples.
+.PP
+Don't forget to
+.PP
+.Vb 1
+\& use overload;
+.Ve
+.PP
+in your subclass to automatically inherit the overloading from the parent. If
+you like, you can change part of the overloading, look at Math::String for an
+example.
+.SH UPGRADING
+.IX Header "UPGRADING"
+When used like this:
+.PP
+.Vb 1
+\& use Math::BigInt upgrade => \*(AqFoo::Bar\*(Aq;
+.Ve
+.PP
+certain operations 'upgrade' their calculation and thus the result to the class
+Foo::Bar. Usually this is used in conjunction with Math::BigFloat:
+.PP
+.Vb 1
+\& use Math::BigInt upgrade => \*(AqMath::BigFloat\*(Aq;
+.Ve
+.PP
+As a shortcut, you can use the module bignum:
+.PP
+.Vb 1
+\& use bignum;
+.Ve
+.PP
+Also good for one-liners:
+.PP
+.Vb 1
+\& perl \-Mbignum \-le \*(Aqprint 2 ** 255\*(Aq
+.Ve
+.PP
+This makes it possible to mix arguments of different classes (as in 2.5 + 2) as
+well es preserve accuracy (as in \fBsqrt\fR\|(3)).
+.PP
+Beware: This feature is not fully implemented yet.
+.SS Auto-upgrade
+.IX Subsection "Auto-upgrade"
+The following methods upgrade themselves unconditionally; that is if upgrade is
+in effect, they always hands up their work:
+.PP
+.Vb 1
+\& div bsqrt blog bexp bpi bsin bcos batan batan2
+.Ve
+.PP
+All other methods upgrade themselves only when one (or all) of their arguments
+are of the class mentioned in \f(CW$upgrade\fR.
+.SH EXPORTS
+.IX Header "EXPORTS"
+\&\f(CW\*(C`Math::BigInt\*(C'\fR exports nothing by default, but can export the following
+methods:
+.PP
+.Vb 2
+\& bgcd
+\& blcm
+.Ve
+.SH CAVEATS
+.IX Header "CAVEATS"
+Some things might not work as you expect them. Below is documented what is
+known to be troublesome:
+.IP "Comparing numbers as strings" 4
+.IX Item "Comparing numbers as strings"
+Both \f(CWbstr()\fR and \f(CWbsstr()\fR as well as stringify via overload drop the
+leading '+'. This is to be consistent with Perl and to make \f(CW\*(C`cmp\*(C'\fR (especially
+with overloading) to work as you expect. It also solves problems with
+\&\f(CW\*(C`Test.pm\*(C'\fR and Test::More, which stringify arguments before comparing them.
+.Sp
+Mark Biggar said, when asked about to drop the '+' altogether, or make only
+\&\f(CW\*(C`cmp\*(C'\fR work:
+.Sp
+.Vb 4
+\& I agree (with the first alternative), don\*(Aqt add the \*(Aq+\*(Aq on positive
+\& numbers. It\*(Aqs not as important anymore with the new internal form
+\& for numbers. It made doing things like abs and neg easier, but
+\& those have to be done differently now anyway.
+.Ve
+.Sp
+So, the following examples now works as expected:
+.Sp
+.Vb 2
+\& use Test::More tests => 1;
+\& use Math::BigInt;
+\&
+\& my $x = Math::BigInt \-> new(3*3);
+\& my $y = Math::BigInt \-> new(3*3);
+\&
+\& is($x,3*3, \*(Aqmultiplication\*(Aq);
+\& print "$x eq 9" if $x eq $y;
+\& print "$x eq 9" if $x eq \*(Aq9\*(Aq;
+\& print "$x eq 9" if $x eq 3*3;
+.Ve
+.Sp
+Additionally, the following still works:
+.Sp
+.Vb 3
+\& print "$x == 9" if $x == $y;
+\& print "$x == 9" if $x == 9;
+\& print "$x == 9" if $x == 3*3;
+.Ve
+.Sp
+There is now a \f(CWbsstr()\fR method to get the string in scientific notation aka
+\&\f(CW1e+2\fR instead of \f(CW100\fR. Be advised that overloaded 'eq' always uses \fBbstr()\fR
+for comparison, but Perl represents some numbers as 100 and others as 1e+308.
+If in doubt, convert both arguments to Math::BigInt before comparing them as
+strings:
+.Sp
+.Vb 2
+\& use Test::More tests => 3;
+\& use Math::BigInt;
+\&
+\& $x = Math::BigInt\->new(\*(Aq1e56\*(Aq);
+\& $y = 1e56;
+\& is($x,$y); # fails
+\& is($x\->bsstr(), $y); # okay
+\& $y = Math::BigInt\->new($y);
+\& is($x, $y); # okay
+.Ve
+.Sp
+Alternatively, simply use \f(CW\*(C`<=>\*(C'\fR for comparisons, this always gets it
+right. There is not yet a way to get a number automatically represented as a
+string that matches exactly the way Perl represents it.
+.Sp
+See also the section about "Infinity and Not a Number" for problems in
+comparing NaNs.
+.IP \fBint()\fR 4
+.IX Item "int()"
+\&\f(CWint()\fR returns (at least for Perl v5.7.1 and up) another Math::BigInt, not a
+Perl scalar:
+.Sp
+.Vb 4
+\& $x = Math::BigInt\->new(123);
+\& $y = int($x); # 123 as a Math::BigInt
+\& $x = Math::BigFloat\->new(123.45);
+\& $y = int($x); # 123 as a Math::BigFloat
+.Ve
+.Sp
+If you want a real Perl scalar, use \f(CWnumify()\fR:
+.Sp
+.Vb 1
+\& $y = $x\->numify(); # 123 as a scalar
+.Ve
+.Sp
+This is seldom necessary, though, because this is done automatically, like when
+you access an array:
+.Sp
+.Vb 1
+\& $z = $array[$x]; # does work automatically
+.Ve
+.IP "Modifying and =" 4
+.IX Item "Modifying and ="
+Beware of:
+.Sp
+.Vb 2
+\& $x = Math::BigFloat\->new(5);
+\& $y = $x;
+.Ve
+.Sp
+This makes a second reference to the \fBsame\fR object and stores it in \f(CW$y\fR. Thus
+anything that modifies \f(CW$x\fR (except overloaded operators) also modifies \f(CW$y\fR, and
+vice versa. Or in other words, \f(CW\*(C`=\*(C'\fR is only safe if you modify your
+Math::BigInt objects only via overloaded math. As soon as you use a method call
+it breaks:
+.Sp
+.Vb 2
+\& $x\->bmul(2);
+\& print "$x, $y\en"; # prints \*(Aq10, 10\*(Aq
+.Ve
+.Sp
+If you want a true copy of \f(CW$x\fR, use:
+.Sp
+.Vb 1
+\& $y = $x\->copy();
+.Ve
+.Sp
+You can also chain the calls like this, this first makes a copy and then
+multiply it by 2:
+.Sp
+.Vb 1
+\& $y = $x\->copy()\->bmul(2);
+.Ve
+.Sp
+See also the documentation for overload.pm regarding \f(CW\*(C`=\*(C'\fR.
+.IP "Overloading \-$x" 4
+.IX Item "Overloading -$x"
+The following:
+.Sp
+.Vb 1
+\& $x = \-$x;
+.Ve
+.Sp
+is slower than
+.Sp
+.Vb 1
+\& $x\->bneg();
+.Ve
+.Sp
+since overload calls \f(CW\*(C`sub($x,0,1);\*(C'\fR instead of \f(CWneg($x)\fR. The first variant
+needs to preserve \f(CW$x\fR since it does not know that it later gets overwritten.
+This makes a copy of \f(CW$x\fR and takes O(N), but \f(CW$x\fR\->\fBbneg()\fR is O(1).
+.IP "Mixing different object types" 4
+.IX Item "Mixing different object types"
+With overloaded operators, it is the first (dominating) operand that determines
+which method is called. Here are some examples showing what actually gets
+called in various cases.
+.Sp
+.Vb 2
+\& use Math::BigInt;
+\& use Math::BigFloat;
+\&
+\& $mbf = Math::BigFloat\->new(5);
+\& $mbi2 = Math::BigInt\->new(5);
+\& $mbi = Math::BigInt\->new(2);
+\& # what actually gets called:
+\& $float = $mbf + $mbi; # $mbf\->badd($mbi)
+\& $float = $mbf / $mbi; # $mbf\->bdiv($mbi)
+\& $integer = $mbi + $mbf; # $mbi\->badd($mbf)
+\& $integer = $mbi2 / $mbi; # $mbi2\->bdiv($mbi)
+\& $integer = $mbi2 / $mbf; # $mbi2\->bdiv($mbf)
+.Ve
+.Sp
+For instance, Math::BigInt\->\fBbdiv()\fR always returns a Math::BigInt, regardless of
+whether the second operant is a Math::BigFloat. To get a Math::BigFloat you
+either need to call the operation manually, make sure each operand already is a
+Math::BigFloat, or cast to that type via Math::BigFloat\->\fBnew()\fR:
+.Sp
+.Vb 1
+\& $float = Math::BigFloat\->new($mbi2) / $mbi; # = 2.5
+.Ve
+.Sp
+Beware of casting the entire expression, as this would cast the
+result, at which point it is too late:
+.Sp
+.Vb 1
+\& $float = Math::BigFloat\->new($mbi2 / $mbi); # = 2
+.Ve
+.Sp
+Beware also of the order of more complicated expressions like:
+.Sp
+.Vb 2
+\& $integer = ($mbi2 + $mbi) / $mbf; # int / float => int
+\& $integer = $mbi2 / Math::BigFloat\->new($mbi); # ditto
+.Ve
+.Sp
+If in doubt, break the expression into simpler terms, or cast all operands
+to the desired resulting type.
+.Sp
+Scalar values are a bit different, since:
+.Sp
+.Vb 2
+\& $float = 2 + $mbf;
+\& $float = $mbf + 2;
+.Ve
+.Sp
+both result in the proper type due to the way the overloaded math works.
+.Sp
+This section also applies to other overloaded math packages, like Math::String.
+.Sp
+One solution to you problem might be autoupgrading|upgrading. See the
+pragmas bignum, bigint and bigrat for an easy way to do this.
+.SH BUGS
+.IX Header "BUGS"
+Please report any bugs or feature requests to
+\&\f(CW\*(C`bug\-math\-bigint at rt.cpan.org\*(C'\fR, or through the web interface at
+<https://rt.cpan.org/Ticket/Create.html?Queue=Math\-BigInt> (requires login).
+We will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+.SH SUPPORT
+.IX Header "SUPPORT"
+You can find documentation for this module with the perldoc command.
+.PP
+.Vb 1
+\& perldoc Math::BigInt
+.Ve
+.PP
+You can also look for information at:
+.IP \(bu 4
+GitHub
+.Sp
+<https://github.com/pjacklam/p5\-Math\-BigInt>
+.IP \(bu 4
+RT: CPAN's request tracker
+.Sp
+<https://rt.cpan.org/Dist/Display.html?Name=Math\-BigInt>
+.IP \(bu 4
+MetaCPAN
+.Sp
+<https://metacpan.org/release/Math\-BigInt>
+.IP \(bu 4
+CPAN Testers Matrix
+.Sp
+<http://matrix.cpantesters.org/?dist=Math\-BigInt>
+.IP \(bu 4
+CPAN Ratings
+.Sp
+<https://cpanratings.perl.org/dist/Math\-BigInt>
+.IP \(bu 4
+The Bignum mailing list
+.RS 4
+.IP \(bu 4
+Post to mailing list
+.Sp
+\&\f(CW\*(C`bignum at lists.scsys.co.uk\*(C'\fR
+.IP \(bu 4
+View mailing list
+.Sp
+<http://lists.scsys.co.uk/pipermail/bignum/>
+.IP \(bu 4
+Subscribe/Unsubscribe
+.Sp
+<http://lists.scsys.co.uk/cgi\-bin/mailman/listinfo/bignum>
+.RE
+.RS 4
+.RE
+.SH LICENSE
+.IX Header "LICENSE"
+This program is free software; you may redistribute it and/or modify it under
+the same terms as Perl itself.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+Math::BigFloat and Math::BigRat as well as the backends
+Math::BigInt::FastCalc, Math::BigInt::GMP, and Math::BigInt::Pari.
+.PP
+The pragmas bignum, bigint and bigrat also might be of interest
+because they solve the autoupgrading/downgrading issue, at least partly.
+.SH AUTHORS
+.IX Header "AUTHORS"
+.IP \(bu 4
+Mark Biggar, overloaded interface by Ilya Zakharevich, 1996\-2001.
+.IP \(bu 4
+Completely rewritten by Tels <http://bloodgate.com>, 2001\-2008.
+.IP \(bu 4
+Florian Ragwitz <flora@cpan.org>, 2010.
+.IP \(bu 4
+Peter John Acklam <pjacklam@gmail.com>, 2011\-.
+.PP
+Many people contributed in one or more ways to the final beast, see the file
+CREDITS for an (incomplete) list. If you miss your name, please drop me a
+mail. Thank you!