diff options
Diffstat (limited to 'upstream/debian-bookworm/man3/Math::BigFloat.3perl')
-rw-r--r-- | upstream/debian-bookworm/man3/Math::BigFloat.3perl | 1030 |
1 files changed, 1030 insertions, 0 deletions
diff --git a/upstream/debian-bookworm/man3/Math::BigFloat.3perl b/upstream/debian-bookworm/man3/Math::BigFloat.3perl new file mode 100644 index 00000000..644ffc89 --- /dev/null +++ b/upstream/debian-bookworm/man3/Math::BigFloat.3perl @@ -0,0 +1,1030 @@ +.\" Automatically generated by Pod::Man 4.14 (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 +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. 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::BigFloat 3perl" +.TH Math::BigFloat 3perl "2023-11-25" "perl v5.36.0" "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::BigFloat \- arbitrary size floating point math package +.SH "SYNOPSIS" +.IX Header "SYNOPSIS" +.Vb 1 +\& use Math::BigFloat; +\& +\& # Configuration methods (may be used as class methods and instance methods) +\& +\& Math::BigFloat\->accuracy(); # get class accuracy +\& Math::BigFloat\->accuracy($n); # set class accuracy +\& Math::BigFloat\->precision(); # get class precision +\& Math::BigFloat\->precision($n); # set class precision +\& Math::BigFloat\->round_mode(); # get class rounding mode +\& Math::BigFloat\->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::BigFloat\->config("lib"); # name of backend math library +\& +\& # Constructor methods (when the class methods below are used as instance +\& # methods, the value is assigned the invocand) +\& +\& $x = Math::BigFloat\->new($str); # defaults to 0 +\& $x = Math::BigFloat\->new(\*(Aq0x123\*(Aq); # from hexadecimal +\& $x = Math::BigFloat\->new(\*(Aq0o377\*(Aq); # from octal +\& $x = Math::BigFloat\->new(\*(Aq0b101\*(Aq); # from binary +\& $x = Math::BigFloat\->from_hex(\*(Aq0xc.afep+3\*(Aq); # from hex +\& $x = Math::BigFloat\->from_hex(\*(Aqcafe\*(Aq); # ditto +\& $x = Math::BigFloat\->from_oct(\*(Aq1.3267p\-4\*(Aq); # from octal +\& $x = Math::BigFloat\->from_oct(\*(Aq01.3267p\-4\*(Aq); # ditto +\& $x = Math::BigFloat\->from_oct(\*(Aq0o1.3267p\-4\*(Aq); # ditto +\& $x = Math::BigFloat\->from_oct(\*(Aq0377\*(Aq); # ditto +\& $x = Math::BigFloat\->from_bin(\*(Aq0b1.1001p\-4\*(Aq); # from binary +\& $x = Math::BigFloat\->from_bin(\*(Aq0101\*(Aq); # ditto +\& $x = Math::BigFloat\->from_ieee754($b, "binary64"); # from IEEE\-754 bytes +\& $x = Math::BigFloat\->bzero(); # create a +0 +\& $x = Math::BigFloat\->bone(); # create a +1 +\& $x = Math::BigFloat\->bone(\*(Aq\-\*(Aq); # create a \-1 +\& $x = Math::BigFloat\->binf(); # create a +inf +\& $x = Math::BigFloat\->binf(\*(Aq\-\*(Aq); # create a \-inf +\& $x = Math::BigFloat\->bnan(); # create a Not\-A\-Number +\& $x = Math::BigFloat\->bpi(); # returns pi +\& +\& $y = $x\->copy(); # make a copy (unlike $y = $x) +\& $y = $x\->as_int(); # return as BigInt +\& +\& # 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\->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\->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 BigInt +\& $x\->exponent(); # return exponent as BigInt +\& $x\->parts(); # return (mantissa,exponent) as 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\->bdstr(); # string in decimal notation +\& $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 +\& $x\->to_ieee754($format); # to bytes encoded according to IEEE 754\-2008 +\& +\& # Other conversion methods +\& +\& $x\->numify(); # return as scalar (might overflow or underflow) +.Ve +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +Math::BigFloat provides support for arbitrary precision floating point. +Overloading is also provided for Perl operators. +.PP +All operators (including basic math operations) are overloaded if you +declare your big floating point numbers as +.PP +.Vb 1 +\& $x = Math::BigFloat \-> new(\*(Aq12_3.456_789_123_456_789E\-2\*(Aq); +.Ve +.PP +Operations with overloaded operators preserve the arguments, which is +exactly what you expect. +.SS "Input" +.IX Subsection "Input" +Input values to these routines may be any scalar number or string that looks +like a number. Anything that is accepted by Perl as a literal numeric constant +should be accepted by this module. +.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, \*(L"01.4p+0\*(R" gives 1.5, \*(L"00.4p+0\*(R" gives 0.5, but \*(L"0.4p+0\*(R" +gives a NaN. And while \*(L"0377\*(R" gives 255, \*(L"0377p0\*(R" gives 255. +.IP "\(bu" 4 +If the string has a \*(L"0x\*(R" or \*(L"0X\*(R" prefix, it is interpreted as a hexadecimal +number. +.IP "\(bu" 4 +If the string has a \*(L"0o\*(R" or \*(L"0O\*(R" prefix, it is interpreted as an octal number. A +floating point literal with a \*(L"0\*(R" prefix is also interpreted as an octal number. +.IP "\(bu" 4 +If the string has a \*(L"0b\*(R" or \*(L"0B\*(R" 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, 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 \*(L"p\*(R" or \*(L"P\*(R", not \*(L"e\*(R" or +\&\*(L"E\*(R" 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 +\& +\& 0x1.921fb5p+1 3.14159262180328369140625e+0 +\& 0o1.2677025p1 2.71828174591064453125 +\& 01.2677025p1 2.71828174591064453125 +\& 0b1.1001p\-4 9.765625e\-2 +.Ve +.SS "Output" +.IX Subsection "Output" +Output values are usually Math::BigFloat objects. +.PP +Boolean operators \f(CW\*(C`is_zero()\*(C'\fR, \f(CW\*(C`is_one()\*(C'\fR, \f(CW\*(C`is_inf()\*(C'\fR, etc. return true or +false. +.PP +Comparison operators \f(CW\*(C`bcmp()\*(C'\fR and \f(CW\*(C`bacmp()\*(C'\fR) return \-1, 0, 1, or +undef. +.SH "METHODS" +.IX Header "METHODS" +Math::BigFloat supports all methods that Math::BigInt supports, except it +calculates non-integer results when possible. Please see Math::BigInt for a +full description of each method. Below are just the most important differences: +.SS "Configuration methods" +.IX Subsection "Configuration methods" +.IP "\fBaccuracy()\fR" 4 +.IX Item "accuracy()" +.Vb 3 +\& $x\->accuracy(5); # local for $x +\& CLASS\->accuracy(5); # global for all members of CLASS +\& # Note: This also applies to new()! +\& +\& $A = $x\->accuracy(); # read out accuracy that affects $x +\& $A = CLASS\->accuracy(); # read out global accuracy +.Ve +.Sp +Set or get the global or local accuracy, aka how many significant digits the +results have. If you set a global accuracy, then this also applies to \fBnew()\fR! +.Sp +Warning! The accuracy \fIsticks\fR, e.g. once you created a number under the +influence of \f(CW\*(C`CLASS\->accuracy($A)\*(C'\fR, all results from math operations with +that number will also be rounded. +.Sp +In most cases, you should probably round the results explicitly using one of +\&\*(L"\fBround()\fR\*(R" in Math::BigInt, \*(L"\fBbround()\fR\*(R" in Math::BigInt or \*(L"\fBbfround()\fR\*(R" in Math::BigInt +or by passing the desired accuracy to the math operation as additional +parameter: +.Sp +.Vb 4 +\& my $x = Math::BigInt\->new(30000); +\& my $y = Math::BigInt\->new(7); +\& print scalar $x\->copy()\->bdiv($y, 2); # print 4300 +\& print scalar $x\->copy()\->bdiv($y)\->bround(2); # print 4300 +.Ve +.IP "\fBprecision()\fR" 4 +.IX Item "precision()" +.Vb 4 +\& $x\->precision(\-2); # local for $x, round at the second +\& # digit right of the dot +\& $x\->precision(2); # ditto, round at the second digit +\& # left of the dot +\& +\& CLASS\->precision(5); # Global for all members of CLASS +\& # This also applies to new()! +\& CLASS\->precision(\-5); # ditto +\& +\& $P = CLASS\->precision(); # read out global precision +\& $P = $x\->precision(); # read out precision that affects $x +.Ve +.Sp +Note: You probably want to use \*(L"\fBaccuracy()\fR\*(R" instead. With \*(L"\fBaccuracy()\fR\*(R" you +set the number of digits each result should have, with \*(L"\fBprecision()\fR\*(R" you +set the place where to round! +.SS "Constructor methods" +.IX Subsection "Constructor methods" +.IP "\fBfrom_hex()\fR" 4 +.IX Item "from_hex()" +.Vb 2 +\& $x \-> from_hex("0x1.921fb54442d18p+1"); +\& $x = Math::BigFloat \-> from_hex("0x1.921fb54442d18p+1"); +.Ve +.Sp +Interpret input as a hexadecimal string.A prefix (\*(L"0x\*(R", \*(L"x\*(R", ignoring case) is +optional. A single underscore character (\*(L"_\*(R") may be placed between any two +digits. If the input is invalid, a NaN is returned. The exponent is in base 2 +using decimal digits. +.Sp +If called as an instance method, the value is assigned to the invocand. +.IP "\fBfrom_oct()\fR" 4 +.IX Item "from_oct()" +.Vb 2 +\& $x \-> from_oct("1.3267p\-4"); +\& $x = Math::BigFloat \-> from_oct("1.3267p\-4"); +.Ve +.Sp +Interpret input as an octal string. A single underscore character (\*(L"_\*(R") may be +placed between any two digits. If the input is invalid, a NaN is returned. The +exponent is in base 2 using decimal digits. +.Sp +If called as an instance method, the value is assigned to the invocand. +.IP "\fBfrom_bin()\fR" 4 +.IX Item "from_bin()" +.Vb 2 +\& $x \-> from_bin("0b1.1001p\-4"); +\& $x = Math::BigFloat \-> from_bin("0b1.1001p\-4"); +.Ve +.Sp +Interpret input as a hexadecimal string. A prefix (\*(L"0b\*(R" or \*(L"b\*(R", ignoring case) +is optional. A single underscore character (\*(L"_\*(R") may be placed between any two +digits. If the input is invalid, a NaN is returned. The exponent is in base 2 +using decimal digits. +.Sp +If called as an instance method, the value is assigned to the invocand. +.IP "\fBfrom_ieee754()\fR" 4 +.IX Item "from_ieee754()" +Interpret the input as a value encoded as described in \s-1IEEE754\-2008.\s0 The input +can be given as a byte string, hex string or binary string. The input is +assumed to be in big-endian byte-order. +.Sp +.Vb 4 +\& # both $dbl and $mbf are 3.141592... +\& $bytes = "\ex40\ex09\ex21\exfb\ex54\ex44\ex2d\ex18"; +\& $dbl = unpack "d>", $bytes; +\& $mbf = Math::BigFloat \-> from_ieee754($bytes, "binary64"); +.Ve +.IP "\fBbpi()\fR" 4 +.IX Item "bpi()" +.Vb 1 +\& print Math::BigFloat\->bpi(100), "\en"; +.Ve +.Sp +Calculate \s-1PI\s0 to N digits (including the 3 before the dot). The result is +rounded according to the current rounding mode, which defaults to \*(L"even\*(R". +.Sp +This method was added in v1.87 of Math::BigInt (June 2007). +.SS "Arithmetic methods" +.IX Subsection "Arithmetic methods" +.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 2 +\& $q = $x\->bdiv($y); +\& ($q, $r) = $x\->bdiv($y); +.Ve +.Sp +In scalar context, divides \f(CW$x\fR by \f(CW$y\fR and returns the result to the given or +default accuracy/precision. In list context, does floored division +(F\-division), returning an integer \f(CW$q\fR and a remainder \f(CW$r\fR so that \f(CW$x\fR = \f(CW$q\fR * \f(CW$y\fR + +\&\f(CW$r\fR. The remainer (modulo) is equal to what is returned by \f(CW\*(C`$x\->bmod($y)\*(C'\fR. +.IP "\fBbmod()\fR" 4 +.IX Item "bmod()" +.Vb 1 +\& $x\->bmod($y); +.Ve +.Sp +Returns \f(CW$x\fR modulo \f(CW$y\fR. When \f(CW$x\fR is finite, and \f(CW$y\fR is finite and non-zero, the +result is identical to the remainder after floored division (F\-division). If, +in addition, both \f(CW$x\fR and \f(CW$y\fR are integers, the result is identical to the result +from Perl's % operator. +.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). +.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 \*(L"choose\*(R" +function. The result is equivalent to: +.Sp +.Vb 3 +\& ( n ) n! +\& | \- | = \-\-\-\-\-\-\- +\& ( k ) k!(n\-k)! +.Ve +.Sp +This method was added in v1.84 of Math::BigInt (April 2007). +.IP "\fBbsin()\fR" 4 +.IX Item "bsin()" +.Vb 2 +\& my $x = Math::BigFloat\->new(1); +\& print $x\->bsin(100), "\en"; +.Ve +.Sp +Calculate the sinus of \f(CW$x\fR, modifying \f(CW$x\fR in place. +.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::BigFloat\->new(1); +\& print $x\->bcos(100), "\en"; +.Ve +.Sp +Calculate the cosinus of \f(CW$x\fR, modifying \f(CW$x\fR in place. +.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(1); +\& print $x\->batan(100), "\en"; +.Ve +.Sp +Calculate the arcus tanges of \f(CW$x\fR, modifying \f(CW$x\fR in place. See also \*(L"\fBbatan2()\fR\*(R". +.Sp +This method was added in v1.87 of Math::BigInt (June 2007). +.IP "\fBbatan2()\fR" 4 +.IX Item "batan2()" +.Vb 3 +\& my $y = Math::BigFloat\->new(2); +\& my $x = Math::BigFloat\->new(3); +\& print $y\->batan2($x), "\en"; +.Ve +.Sp +Calculate the arcus tanges of \f(CW$y\fR divided by \f(CW$x\fR, modifying \f(CW$y\fR in place. +See also \*(L"\fBbatan()\fR\*(R". +.Sp +This method was added in v1.87 of Math::BigInt (June 2007). +.IP "\fBas_float()\fR" 4 +.IX Item "as_float()" +This method is called when Math::BigFloat encounters an object it doesn't know +how to handle. For instance, assume \f(CW$x\fR is a Math::BigFloat, or subclass +thereof, and \f(CW$y\fR is defined, but not a Math::BigFloat, 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(CW\*(C`as_float()\*(C'\fR. The method \f(CW\*(C`as_float()\*(C'\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 +In Math::BigFloat, \f(CW\*(C`as_float()\*(C'\fR has the same effect as \f(CW\*(C`copy()\*(C'\fR. +.IP "\fBto_ieee754()\fR" 4 +.IX Item "to_ieee754()" +Encodes the invocand as a byte string in the given format as specified in \s-1IEEE +754\-2008.\s0 Note that the encoded value is the nearest possible representation of +the value. This value might not be exactly the same as the value in the +invocand. +.Sp +.Vb 2 +\& # $x = 3.1415926535897932385 +\& $x = Math::BigFloat \-> bpi(30); +\& +\& $b = $x \-> to_ieee754("binary64"); # encode as 8 bytes +\& $h = unpack "H*", $b; # "400921fb54442d18" +\& +\& # 3.141592653589793115997963... +\& $y = Math::BigFloat \-> from_ieee754($h, "binary64"); +.Ve +.Sp +All binary formats in \s-1IEEE 754\-2008\s0 are accepted. For convenience, som aliases +are recognized: \*(L"half\*(R" for \*(L"binary16\*(R", \*(L"single\*(R" for \*(L"binary32\*(R", \*(L"double\*(R" for +\&\*(L"binary64\*(R", \*(L"quadruple\*(R" for \*(L"binary128\*(R", \*(L"octuple\*(R" for \*(L"binary256\*(R", and +\&\*(L"sexdecuple\*(R" for \*(L"binary512\*(R". +.Sp +See also <https://en.wikipedia.org/wiki/IEEE_754>. +.SS "\s-1ACCURACY AND PRECISION\s0" +.IX Subsection "ACCURACY AND PRECISION" +See also: Rounding. +.PP +Math::BigFloat supports both precision (rounding to a certain place before or +after the dot) and accuracy (rounding to a certain number of digits). For a +full documentation, examples and tips on these topics please see the large +section about rounding in Math::BigInt. +.PP +Since things like \f(CWsqrt(2)\fR or \f(CW\*(C`1 / 3\*(C'\fR must presented with a limited +accuracy lest a operation consumes all resources, each operation produces +no more than the requested number of digits. +.PP +If there is no global precision or accuracy set, \fBand\fR the operation in +question was not called with a requested precision or accuracy, \fBand\fR the +input \f(CW$x\fR has no accuracy or precision set, then a fallback parameter will +be used. For historical reasons, it is called \f(CW\*(C`div_scale\*(C'\fR and can be accessed +via: +.PP +.Vb 2 +\& $d = Math::BigFloat\->div_scale(); # query +\& Math::BigFloat\->div_scale($n); # set to $n digits +.Ve +.PP +The default value for \f(CW\*(C`div_scale\*(C'\fR is 40. +.PP +In case the result of one operation has more digits than specified, +it is rounded. The rounding mode taken is either the default mode, or the one +supplied to the operation after the \fIscale\fR: +.PP +.Vb 7 +\& $x = Math::BigFloat\->new(2); +\& Math::BigFloat\->accuracy(5); # 5 digits max +\& $y = $x\->copy()\->bdiv(3); # gives 0.66667 +\& $y = $x\->copy()\->bdiv(3,6); # gives 0.666667 +\& $y = $x\->copy()\->bdiv(3,6,undef,\*(Aqodd\*(Aq); # gives 0.666667 +\& Math::BigFloat\->round_mode(\*(Aqzero\*(Aq); +\& $y = $x\->copy()\->bdiv(3,6); # will also give 0.666667 +.Ve +.PP +Note that \f(CW\*(C`Math::BigFloat\->accuracy()\*(C'\fR and \f(CW\*(C`Math::BigFloat\->precision()\*(C'\fR +set the global variables, and thus \fBany\fR newly created number will be subject +to the global rounding \fBimmediately\fR. This means that in the examples above, the +\&\f(CW3\fR as argument to \f(CW\*(C`bdiv()\*(C'\fR will also get an accuracy of \fB5\fR. +.PP +It is less confusing to either calculate the result fully, and afterwards +round it explicitly, or use the additional parameters to the math +functions like so: +.PP +.Vb 4 +\& use Math::BigFloat; +\& $x = Math::BigFloat\->new(2); +\& $y = $x\->copy()\->bdiv(3); +\& print $y\->bround(5),"\en"; # gives 0.66667 +\& +\& or +\& +\& use Math::BigFloat; +\& $x = Math::BigFloat\->new(2); +\& $y = $x\->copy()\->bdiv(3,5); # gives 0.66667 +\& print "$y\en"; +.Ve +.SS "Rounding" +.IX Subsection "Rounding" +.IP "bfround ( +$scale )" 4 +.IX Item "bfround ( +$scale )" +Rounds to the \f(CW$scale\fR'th place left from the '.', counting from the dot. +The first digit is numbered 1. +.IP "bfround ( \-$scale )" 4 +.IX Item "bfround ( -$scale )" +Rounds to the \f(CW$scale\fR'th place right from the '.', counting from the dot. +.IP "bfround ( 0 )" 4 +.IX Item "bfround ( 0 )" +Rounds to an integer. +.IP "bround ( +$scale )" 4 +.IX Item "bround ( +$scale )" +Preserves accuracy to \f(CW$scale\fR digits from the left (aka significant digits) and +pads the rest with zeros. If the number is between 1 and \-1, the significant +digits count from the first non-zero after the '.' +.IP "bround ( \-$scale ) and bround ( 0 )" 4 +.IX Item "bround ( -$scale ) and bround ( 0 )" +These are effectively no-ops. +.PP +All rounding functions take as a second parameter a rounding mode from one of +the following: 'even', 'odd', '+inf', '\-inf', 'zero', 'trunc' or 'common'. +.PP +The default rounding mode is 'even'. By using +\&\f(CW\*(C`Math::BigFloat\->round_mode($round_mode);\*(C'\fR you can get and set the default +mode for subsequent rounding. The usage of \f(CW\*(C`$Math::BigFloat::$round_mode\*(C'\fR is +no longer supported. +The second parameter to the round functions then overrides the default +temporarily. +.PP +The \f(CW\*(C`as_number()\*(C'\fR function returns a BigInt from a Math::BigFloat. It uses +\&'trunc' as rounding mode to make it equivalent to: +.PP +.Vb 2 +\& $x = 2.5; +\& $y = int($x) + 2; +.Ve +.PP +You can override this by passing the desired rounding mode as parameter to +\&\f(CW\*(C`as_number()\*(C'\fR: +.PP +.Vb 2 +\& $x = Math::BigFloat\->new(2.5); +\& $y = $x\->as_number(\*(Aqodd\*(Aq); # $y = 3 +.Ve +.SH "NUMERIC LITERALS" +.IX Header "NUMERIC LITERALS" +After \f(CW\*(C`use Math::BigFloat \*(Aq:constant\*(Aq\*(C'\fR all numeric literals in the given scope +are converted to \f(CW\*(C`Math::BigFloat\*(C'\fR objects. This conversion happens at compile +time. +.PP +For example, +.PP +.Vb 1 +\& perl \-MMath::BigFloat=:constant \-le \*(Aqprint 2e\-150\*(Aq +.Ve +.PP +prints the exact value of \f(CW\*(C`2e\-150\*(C'\fR. Note that without conversion of constants +the expression \f(CW\*(C`2e\-150\*(C'\fR is calculated using Perl scalars, which leads to an +inaccuracte result. +.PP +Note that strings are not affected, so that +.PP +.Vb 1 +\& use Math::BigFloat qw/:constant/; +\& +\& $y = "1234567890123456789012345678901234567890" +\& + "123456789123456789"; +.Ve +.PP +does not give you what you expect. You need an explicit Math::BigFloat\->\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::BigFloat; +\& +\& $x = Math::BigFloat\->new("1234567889123456789123456789123456789"); +.Ve +.PP +Without the quotes Perl converts the large number to a floating point constant +at compile time, and then converts the result to a Math::BigFloat object at +runtime, 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 \*(L"0\*(R" 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 \*(L"0o\*(R" 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 +.SS "Math library" +.IX Subsection "Math library" +Math with the numbers is done (by default) by a module called +Math::BigInt::Calc. This is equivalent to saying: +.PP +.Vb 1 +\& use Math::BigFloat lib => "Calc"; +.Ve +.PP +You can change this by using: +.PP +.Vb 1 +\& use Math::BigFloat lib => "GMP"; +.Ve +.PP +\&\fBNote\fR: General purpose packages should not be explicit about the library to +use; let the script author decide which is best. +.PP +Note: The keyword 'lib' will warn when the requested library could not be +loaded. To suppress the warning use 'try' instead: +.PP +.Vb 1 +\& use Math::BigFloat try => "GMP"; +.Ve +.PP +If your script works with huge numbers and Calc is too slow for them, you can +also for the loading of one of these libraries and if none of them can be used, +the code will die: +.PP +.Vb 1 +\& use Math::BigFloat only => "GMP,Pari"; +.Ve +.PP +The following would first try to find Math::BigInt::Foo, then Math::BigInt::Bar, +and when this also fails, revert to Math::BigInt::Calc: +.PP +.Vb 1 +\& use Math::BigFloat lib => "Foo,Math::BigInt::Bar"; +.Ve +.PP +See the respective low-level library documentation for further details. +.PP +See Math::BigInt for more details about using a different low-level library. +.SS "Using Math::BigInt::Lite" +.IX Subsection "Using Math::BigInt::Lite" +For backwards compatibility reasons it is still possible to +request a different storage class for use with Math::BigFloat: +.PP +.Vb 1 +\& use Math::BigFloat with => \*(AqMath::BigInt::Lite\*(Aq; +.Ve +.PP +However, this request is ignored, as the current code now uses the low-level +math library for directly storing the number parts. +.SH "EXPORTS" +.IX Header "EXPORTS" +\&\f(CW\*(C`Math::BigFloat\*(C'\fR exports nothing by default, but can export the \f(CW\*(C`bpi()\*(C'\fR method: +.PP +.Vb 1 +\& use Math::BigFloat qw/bpi/; +\& +\& print bpi(10), "\en"; +.Ve +.SH "CAVEATS" +.IX Header "CAVEATS" +Do not try to be clever to insert some operations in between switching +libraries: +.PP +.Vb 4 +\& require Math::BigFloat; +\& my $matter = Math::BigFloat\->bone() + 4; # load BigInt and Calc +\& Math::BigFloat\->import( lib => \*(AqPari\*(Aq ); # load Pari, too +\& my $anti_matter = Math::BigFloat\->bone()+4; # now use Pari +.Ve +.PP +This will create objects with numbers stored in two different backend libraries, +and \fB\s-1VERY BAD THINGS\s0\fR will happen when you use these together: +.PP +.Vb 1 +\& my $flash_and_bang = $matter + $anti_matter; # Don\*(Aqt do this! +.Ve +.IP "stringify, \fBbstr()\fR" 4 +.IX Item "stringify, bstr()" +Both stringify and \fBbstr()\fR now drop the leading '+'. The old code would return +\&'+1.23', the new returns '1.23'. See the documentation in Math::BigInt for +reasoning and details. +.IP "\fBbrsft()\fR" 4 +.IX Item "brsft()" +The following will probably not print what you expect: +.Sp +.Vb 2 +\& my $c = Math::BigFloat\->new(\*(Aq3.14159\*(Aq); +\& print $c\->brsft(3,10),"\en"; # prints 0.00314153.1415 +.Ve +.Sp +It prints both quotient and remainder, since print calls \f(CW\*(C`brsft()\*(C'\fR in list +context. Also, \f(CW\*(C`$c\->brsft()\*(C'\fR will modify \f(CW$c\fR, so be careful. +You probably want to use +.Sp +.Vb 3 +\& print scalar $c\->copy()\->brsft(3,10),"\en"; +\& # or if you really want to modify $c +\& print scalar $c\->brsft(3,10),"\en"; +.Ve +.Sp +instead. +.IP "Modifying and =" 4 +.IX Item "Modifying and =" +Beware of: +.Sp +.Vb 2 +\& $x = Math::BigFloat\->new(5); +\& $y = $x; +.Ve +.Sp +It will not do what you think, e.g. making a copy of \f(CW$x\fR. Instead it just 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 will modify \f(CW$y\fR (except overloaded math operators), and vice +versa. See Math::BigInt for details and how to avoid that. +.IP "\fBprecision()\fR vs. \fBaccuracy()\fR" 4 +.IX Item "precision() vs. accuracy()" +A common pitfall is to use \*(L"\fBprecision()\fR\*(R" when you want to round a result to +a certain number of digits: +.Sp +.Vb 1 +\& use Math::BigFloat; +\& +\& Math::BigFloat\->precision(4); # does not do what you +\& # think it does +\& my $x = Math::BigFloat\->new(12345); # rounds $x to "12000"! +\& print "$x\en"; # print "12000" +\& my $y = Math::BigFloat\->new(3); # rounds $y to "0"! +\& print "$y\en"; # print "0" +\& $z = $x / $y; # 12000 / 0 => NaN! +\& print "$z\en"; +\& print $z\->precision(),"\en"; # 4 +.Ve +.Sp +Replacing \*(L"\fBprecision()\fR\*(R" with \*(L"\fBaccuracy()\fR\*(R" is probably not what you want, either: +.Sp +.Vb 1 +\& use Math::BigFloat; +\& +\& Math::BigFloat\->accuracy(4); # enables global rounding: +\& my $x = Math::BigFloat\->new(123456); # rounded immediately +\& # to "12350" +\& print "$x\en"; # print "123500" +\& my $y = Math::BigFloat\->new(3); # rounded to "3 +\& print "$y\en"; # print "3" +\& print $z = $x\->copy()\->bdiv($y),"\en"; # 41170 +\& print $z\->accuracy(),"\en"; # 4 +.Ve +.Sp +What you want to use instead is: +.Sp +.Vb 1 +\& use Math::BigFloat; +\& +\& my $x = Math::BigFloat\->new(123456); # no rounding +\& print "$x\en"; # print "123456" +\& my $y = Math::BigFloat\->new(3); # no rounding +\& print "$y\en"; # print "3" +\& print $z = $x\->copy()\->bdiv($y,4),"\en"; # 41150 +\& print $z\->accuracy(),"\en"; # undef +.Ve +.Sp +In addition to computing what you expected, the last example also does \fBnot\fR +\&\*(L"taint\*(R" the result with an accuracy or precision setting, which would +influence any further operation. +.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::BigFloat +.Ve +.PP +You can also look for information at: +.IP "\(bu" 4 +GitHub +.Sp +<https://github.com/pjacklam/p5\-Math\-BigInt> +.IP "\(bu" 4 +\&\s-1RT: CPAN\s0'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 +\&\s-1CPAN\s0 Testers Matrix +.Sp +<http://matrix.cpantesters.org/?dist=Math\-BigInt> +.IP "\(bu" 4 +\&\s-1CPAN\s0 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::BigInt and Math::BigInt as well as the backends +Math::BigInt::FastCalc, Math::BigInt::GMP, and Math::BigInt::Pari. +.PP +The pragmas bignum, bigint and bigrat. +.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> in 2001\-2008. +.IP "\(bu" 4 +Florian Ragwitz <flora@cpan.org>, 2010. +.IP "\(bu" 4 +Peter John Acklam <pjacklam@gmail.com>, 2011\-. |