NAME
Math::decNumber - Arbitrary-precision decimal arithmetic using the decNumber library.
SYNOPSIS
use strict;
use warnings;
use Math::decNumber 'd_';
my $a = 0; # $a binary
$a += 0.1 for (1..1000);
print "$a\n"; # print 99.9999999999986
$a = d_(0); # $a decimal
$a += 0.1 for (1..1000);
print "$a\n"; # print 100.0
DESCRIPTION
The Math::decNumber module is a Perl interface to the decNumber C library. This library allows us to do arithmetic calculations in decimal and not in binary as usual. The decimal arithmetic is preferred for business and financial applications. This library complies with the IEEE 754 Standard for Floating Point Arithmetic.
Numbers
The floating-point data used by this module are
the normal floating-point decimal numbers of the form
sM*10**e
wheres
is the sign (+ or -),M
(the significand or mantissa) is a positive number with a maximum ofndigits
decimal digits ande
(the exponent) an integer such thatemin <= e <= emax
.The default values are
ndigits = 34
,emin = -6143
andemax = 6144
.The smallest positive normal floating-point number is
1*10**emin
. The non- zero floating-point numbers with magnitude less than1*10**emin
are called subnormal (or denormalized). The subnormal numbers don't have the full precision of the normal numbers but they permit underflow to be gradual (no gap between0
and1*10**emin
).There are two zeros
+0
and-0
. This two zeros are distinguishable arithmetically only by either division-by-zero ( producing appropriately signed infinities ) or else by theCopySign
function.the two infinities,
+Infinity
(orInfinity
or+Inf
) and-Infinity
(or-Inf
).Two NaNs,
NaN
(quiet NaN) andsNaN
(signaling NaN). NaN means "Not a Number" or more precisely "Not any Number". NaN must not be confused with undefined.For every infinite or finite number
$x
, the predicate$x == $x
is true and the predicate$x != $x
is false. But, for NaNsNaN == NaN
is false andNaN != NaN
is true.Most operations propagate quiet NaNs without signaling exceptions, and signal the invalid operation exception when given a signaling NaN operand.
A simple exemple:
#!/usr/bin/perl
use strict;
use warnings;
use v5.10;
use Math::decNumber ':all';
say "1/0 = ", 1/d_(0); # 1/0 = Infinity
say "1/-0 = ", 1/-d_(0); # 1/-0 = -Infinity
say "1/Inf = ", 1/d_('Inf'); # 1/Inf = 0E-6176
say "Inf + 3 = ", d_('Inf')+3; # Inf + 3 = Infinity
say "Inf - Inf = ", d_('Inf')-d_('Inf'); # Inf - Inf = NaN
say "sqrt(-1) = ", sqrt(d_ -1); # sqrt(-1) = NaN
say d_('NaN') == d_('NaN')?'true':'false'; # false
say d_('NaN') != d_('NaN')?'true':'false'; # true
Context
Parameters
The context parameters determine how the calculations are done and the results produced.
$old_ndigits = ContextPrecision( [ndigits] )
Get/Set the number
ndigits
of decimal digits used for the calculations (or the number of digits to that a result is rounded).use Math::decNumber qw( ContextPrecision d_ ); my $save = ContextPrecision(100); # change precision and save old value my $r = sqrt d_(2); # do calculation print "$r\n"; ContextPrecision($save); # restore old precision
$old_rounding_mode = ContextRounding( [rounding_mode] )
Get/Set the rounding algorithm to be used if rounding is necessary during an operation. The rounding modes available are:
ROUND_CEILING Round towards +Infinity. ROUND_DOWN Round towards 0 (truncation). ROUND_FLOOR Round towards -Infinity. ROUND_HALF_DOWN Round to nearest; if equidistant, round down. ROUND_HALF_EVEN Round to nearest; if equidistant, round so that the final digit is even. ROUND_HALF_UP Round to nearest; if equidistant, round up. ROUND_UP Round away from 0. ROUND_05UP The same as DEC_ROUND_UP, except that rounding up only occurs if the digit to be rounded up is 0 or 5 and after Overflow the result is the same as for DEC_ROUND_DOWN.
Example:
use Math::decNumber qw( :all ); ContextPrecision(6); ContextRounding(ROUND_FLOOR); my $a = d_('12345.6789'); print "$a\n"; # print 12345.6
$old_max_exponent = ContextMaxExponent( [exponent] )
Get/Set the magnitude of the largest adjusted exponent
emax
that is permitted (a value in the range 0 through 999,999,999).If the adjusted exponent for a result or conversion would be larger than
emax
then an overflow results.$old_min_exponent = ContextMinExponent( [exponent] )
Get/Set the smallest adjusted exponent
emin
that is permitted for normal numbers (a value in the range -999,999,999 through 0).emin
is usually set to-emax
or to-(emax-1)
.If the adjusted exponent for a result or conversion would be smaller than emin then the result is subnormal. If the result is also inexact, an underflow results.
$old_clamp_mode = ContextClamp( [0 | 1] )
The clamp field controls explicit exponent clamping, as is applied when a result is encoded in one of the compressed formats. When 0, a result exponent is limited to a maximum of
emax
and a minimum ofemin
(for example, the exponent of a zero result will be clamped to be in this range). When 1, a result exponent has the same minimum but is limited to a maximum ofemax-(ndigits-1)
. As well as clamping zeros, this may cause the coefficient of a result to be padded with zeros on the right in order to bring the exponent within range.$old_traps_mode = ContextTraps( [traps_mode] )
The traps field is used to indicate which of the exceptional conditions should cause a trap. See "Exception handling".
$old_mode = ContextExtended( [0 | 1] )
The extended field controls the level of arithmetic supported. When 1, special values are possible, some extra checking required for IEEE 754 conformance is enabled, and subnormal numbers can result from operations.
By default, the module is compiled with the DECSUBSET tuning parameter set to 0 (for speed improvement) so the function does nothing and always returns 1. The Context is always extended.
This function is useful only if the module is compiled with DECSUBSET set to 1 in Makefile.PL.
Status
To each exceptional condition that may arise during operations corresponds a status flag in the context. The constant names of this status flags are:
DEC_Conversion_syntax DEC_Division_by_zero
DEC_Division_impossible DEC_Division_undefined
DEC_Insufficient_storage DEC_Inexact
DEC_Invalid_context DEC_Invalid_operation
DEC_Lost_digits DEC_Overflow
DEC_Clamped DEC_Rounded
DEC_Subnormal DEC_Underflow
When a condition occurs, the corresponding flag in the context takes the value 1 (and remains set until cleared) and a exception is raised if the corresponding trap is enabled (see "Exception handling").
For convenience, the flags are grouped in
- flags which cause a result to become qNaN
DEC_NaNs = ( DEC_Conversion_syntax | DEC_Division_impossible |
DEC_Division_undefined | DEC_Insufficient_storage |
DEC_Invalid_context | DEC_Invalid_operation )
- flags which are normally errors (result is qNaN, infinite, or 0)
DEC_Errors = ( DEC_Division_by_zero | DEC_NaNs |
DEC_Overflow | DEC_Underflow )
- flags which are normally for information only (finite results)
DEC_Information = ( DEC_Clamped | DEC_Rounded |
DEC_Inexact | DEC_Lost_digits )
ContextClearStatus( $status )
This function resets one or more status flags in the status field.
ContextClearStatus( DEC_Subnormal | DEC_Underflow ) # reset the 2 specified bits
$status = ContextGetStatus( )
This function returns the current status field of the context.
$string = ContextStatusToString( )
@strings = ContextStatusToString( )
In scalar context, this function returns a string describing a status bit. If no bits are set in the status field, the string "No status" is returned. If more than one bit is set, the string "Multiple status" is returned.
In list context, the function returns a list of strings describing each status bit set.
ContextSetStatus( $status )
This function is used to set one or more status bits in the status field of the context.
If any of the bits being set have the corresponding bit set in the traps field, a trap is raised (regardless of whether the bit is already set in the status field). Only one trap is raised even if more than one bit is being set.
Normally, only library modules use this function. Applications may clear status bits but should not set them (except, perhaps, for testing).
ContextSetStatusQuiet( status )
This function is identical to
ContextSetStatus
except that the context traps field is ignored (i.e., no trap is raised).ContextSetStatusFromString( $string )
This function is used to set a status bit in the status field of the context, using the name of the bit as returned by the
ContextStatusToString
function.If the bit being set has the corresponding bit set in the traps field, a trap is raised (regardless of whether the bit is already set in the status field).
ContextSetStatusFromStringQuiet( $string )
This function is identical to
ContextSetStatusFromString
except that the context traps field is ignored (i.e., no trap is raised).$result = ContextSaveStatus( $mask )
This function is used to save one or more status bits from the status field of the context. Returns the integer which is the logical And of the context status field and the
$mask
.$result = ContextTestStatus( $mask )
This function is used to test one or more status bits in a context. Returns the integer which is the logical And of the context status field and
$mask
.$result = ContextTestSavedStatus( $status, $mask )
This function is used to test one or more status bits in a saved
$status
field. Returns the integer which is the logical And of$status
and$mask
.ContextRestoreStatus( $status, $mask )
This function restores one or more status bits in the status field of the context from a saved
$status
field.Note that setting a bit using this function does not cause a trap contrary to the function
ContextSetStatus
.ContextZeroStatus( )
This function clears (set to zero) all the status bits in the status field of the context.
Functions
Conversion functions
$number = FromString( $string )
Converts a character string in a decNumber. The conversion is exact provided that the numeric string has no more significant digits than
ndigits
and the adjusted exponent is in the range [emin
,emax
].If
$string
can not be interpreted as number, the function returnsNaN
(Not a Number).use v5.10; use Math::decNumber 'FromString'; say FromString('12345.67'); # print 12345.67 say FromString('12345.67e-2'); # print 123.4567 say FromString(' 12345.67'); # print NaN
@numbers = d_( $string [, $string2, ...] )
With a single argument,
d_($string)
converts the string as the functionFromString
but removes any leading or trailing spaces. With several arguments it returns the list of conversion of its arguments.use Math::decNumber 'd_'; my ($x, $y, $z) = d_ '-123.45', " 23456e-3", -345.67; print "$x : $y : $z\n"; # print -123.45 : 23.456 : -345.67
$string = ToString( $number )
Converts
$number
to a character string, using scientific notation if an exponent is needed (that is, there will be just one digit before any decimal point). This function is used for the stringification of a decNumber.use v5.10; use Math::decNumber qw(d_ ToString); my $x = d_ '1234.5e+15'; say $x; # print 1.2345E+18 say ToString($x); # idem
$string = ToEngString( $number )
Converts
$number
to a character string, using engineering notation (where the exponent will be a multiple of three, and there may be up to three digits before any decimal point) if an exponent is needed.use v5.10; use Math::decNumber qw(d_ ToEngString); my $x = d_ '1234.5e+14'; say $x; # print 1.2345E+17 say ToEngString($x); # print 123.45E+15
Arithmetic functions
$number = Abs( $a )
Returns the absolute value of
$a
. Theabs
Perl function is overload byAbs
, soabs($a) := Abs($a)
.$number = Add( $a, $b )
Returns the sum of
$a
and$b
. The+
operator is overload by this function, so$a + $b := Add($a, $b)
.$number = Divide( $a, $b )
Returns
$a
divided by$b
. The/
operator is overload by this function, so$a / $b := Divide($a, $b)
.$number = DivideInteger( $a, $b )
Returns the integer part of the result of dividing
$a
by the$b
.$number = Exp( $a )
Exponential function: returns
e
to the power of$a
. Theexp
Perl function is overload byExp
, soexp($a) := Exp($a)
.$number = FMA( $a, $b, $c )
The FusedMultiplyAdd function: returns
$a * $b + $c
but the intermediate result$a * $b
is not rounded and will not cause overflow or underflow. Only the final result is rounded and checked.Example:
use v5.10; use Math::decNumber qw( ContextPrecision d_ FMA ); ContextPrecision(16); my $a = d_ '-246913578024696'; my $b = d_ '+4.9999999999999'; my $c = d_ '+1234567890123456'; say $a * $b + $c; # print 1 say FMA($a, $b, $c); # print 0.6913578024696
With
ContextPrecision(30)
the two results are equal to0.6913578024696
.This function allows, in general, more accurate dot product, matrix multiplications, polynomial evaluations (Horner scheme) ...etc.
$number = Ln( $a )
Returns the natural logarithm (logarithm in base
e
) of$a
.Finite results will always be full precision and inexact, except when
$a
is equal to1
, which gives an exact result of0
. Inexact results will almost always be correctly rounded, but may be up to 1 ulp (unit in last place) in error in rare cases.The
log
Perl function is overload byLn
, solog($a) := Ln($a)
.$number = Log10( $a )
Returns the logarithm in base ten of
$a
, rounded if necessary using the digits setting in the context and using the round-half-even rounding algorithm.$a
must be positive or a zero.Finite results will always be full precision and inexact, except when
$a
is equal to an integral power of ten, in which case the result is the exact integer. Inexact results will almost always be correctly rounded, but may be up to 1 ulp (unit in last place) in error in rare cases.$number = Max( $a, $b )
This function compares
$a
and$b
numerically and returns the larger.Unusually, if one operand is a quiet
NaN
and the other a number, then the number is returned.$number = MaxMag( $a, $b )
This function compares the magnitude of
$a
and$b
numerically and returns the larger. It is identical toMax
except that the signs of the operands are ignored.$number = Min( $a, $b )
This function compares
$a
and$b
numerically and returns the smaller.Unusually, if one operand is a quiet
NaN
and the other a number, then the number is returned.$number = MinMag ( $a, $b )
This function compares the magnitude of
$a
and$b
numerically and returns the smaller. It is identical toMin
except that the signs of the operands are ignored.$number = Minus( $a )
Returns the result of subtracting
$a
from0
. That is, it is negated, following the usual arithmetic rules:Minus( $a ) := -$a
.$number = Multiply( $a, $b )
Returns the product of
$a
and$b
. The*
operator is overload by this function, so$a * $b := Multiply($a, $b)
.$number = NextMinus( $a )
Returns the closest value to
$a
in the direction of-Infinity
.This function is a generalization of the IEEE 754
nextDown
operation.Note:
NextMinus( $a ) == -NextPlus( -$a )
$number = NextPlus( $a )
Returns the closest value to
$a
in the direction of+Infinity
.This function is a generalization of the IEEE 754
nextUp
operation.use Math::decNumber qw( :all ); ContextPrecision(8); my $a = d_ '12.34'; printf "NextMinus($a) = %s\n", NextMinus($a); # NextMinus(12.34) = 12.339999 printf "NextPlus ($a) = %s\n", NextPlus($a); # NextPlus (12.34) = 12.340001
There is no
printf
field specifier fordecNumber
. We use%s
to force the stringification.$number = NextToward( $a, $b )
Returns the closest value to
$a
in the direction of$b
.This function is a generalization of the proposed IEEE 754
nextAfter
operation.$number = Plus( $a )
Returns the result of adding
$a
to0
.$number = Power( $a, $b )
Returns the result of raising
$a
to the power of$b
, rounded if necessary using the settings in the context.Results will be exact when
$b
has an integral value and the result does not need to be rounded, and also will be exact in certain special cases, such as when$a
is a zero.Inexact results will always be full precision, and will almost always be correctly rounded, but may be up to 1 ulp (unit in last place) in error in rare cases.
The
**
operator is overload by this function, so$a ** $b := Power($a, $b)
.use v5.10; use Math::decNumber qw( :all ); say d_(3) ** 0.5; # 1.732050807568877293527446341505872 say sqrt(d_ 3); # 1.732050807568877293527446341505872
$number = Remainder( $a, $b )
Integer-divides
$a
by$b
and returns the remainder from the division. For$a
and$b
finite, and if$b != 0
we haveRemainder( $a, $b ) = $a - DivideInteger( $a, $b ) * $b
$number = RemainderNear( $a, $b )
For
$a
and$b
finite, and if$b != 0
we haveRemainderNear( $a, $b ) = $a - $n * $b
where$n
is the integer nearest the number$a/$b
.use v5.10; use Math::decNumber qw( :all ); say Remainder(d_ 17, 6); # print 5 because 17 = 6*2+5 say RemainderNear(d_ 17, 6); # print -1 because 17 = 6*3-1
$number = Rotate( $a, $b )
Returns a copy of
$a
with the digits of its coefficient rotated to the left (if$b
is positive) or to the right (if$b
is negative) without adjusting the exponent or the sign. If$a
has fewer digits thanndigits
the coefficient is padded with zeros on the left before the rotate. Any insignificant leading zeros in the result are removed, as usual.$b
is the count of digits to rotate; it must be an integer (that is, it must have an exponent of 0) and must be in the range-ndigits
through+ndigits
.use v5.10; use Math::decNumber qw(:all); ContextPrecision(10); # ndigits = 10 say Rotate(d_ '012345', 3); # print 12345000 say Rotate(d_ '012345', -2); # print 4500000123
$number = Shift( $a, $b )
Returns a copy of
$a
with the digits of its coefficient shifted to the left (if$b
is positive) or to the right (if$b
is negative) without adjusting the exponent or the sign. The coefficient is padded with zeros on the left or right, as necessary. Any leading zeros in the result are ignored, as usual.$b
is the count of digits to shift; it must be an integer (that is, it must have an exponent of 0) and must be in the range-ndigits
through+ndigits
.The
<<
and>>
Perl operators are overloaded byShift
:$a<<$b := Shift($a, $b)
and$a>>$b := Shift($a, -$b)
.use v5.10; use Math::decNumber qw(:all); ContextPrecision(10); # ndigits = 10 say Shift(d_ '012345', 3); # print 12345000 say Shift(d_ '012345', -2); # print 123
$number = SquareRoot( $a )
Returns the square root of
$a
, rounded if necessary using the digits setting in the context and using the round-half-even rounding algorithm.The
sqrt
Perl function is overload bySquareRoot
, sosqrt($a) := SquareRoot($a)
.$number = Subtract( $a, $b )
Returns the result of subtracting
$b
from$a
.The
-
operator is overload by this function, so$a - $b := Subtract($a, $b)
.$number = ToIntegralExact( $a )
Returns
$a
, with any fractional part removed if necessary using the rounding mode in the context.The
Inexact
flag is set if the result is numerically different from$a
. Other than that, no flags are set (unless the operand is a signalingNaN
). The result may have a positive exponent.$number = ToIntegralValue($a )
Returns
$a
, with any fractional part removed if necessary using the rounding mode in the context.No flags, not even
Inexact
, are set (unless the operand is a signalingNaN
). The result may have a positive exponent.
Formatting
$number = LogB( $a )
Return the adjusted exponent of
$a
, that is to say, roughly speaking, the exponent of the power of 10 in the scientific notation of$a
.For positive finite
a
, the value oflogB(a
) isfloor(log10(a))
.use v5.10; use Math::decNumber qw( :all ); say LogB(d_ 12345.67); # print 4 --> 12345.67 = 1.234567e4 say LogB(d_ 0.001234); # print -3 --> 0.001234 = 1.234e-3
$number = Quantize( $a, $b )
This function is used to modify the number
$a
so that its exponent has a specific value, equal to that of$b
. TheRescale
function may also be used for this purpose, but requires the exponent to be given as a decimal number. When$b
is a finite number, its exponent is used as the requested exponent (it provides a pattern for the result). Its coefficient and sign are ignored. The number is set to a value which is numerically equal (except for any rounding) to the$b
, modified as necessary so that it has the requested exponent.use v5.10; use Math::decNumber qw(d_ Quantize); my $x = d_ '1234.5678'; my $y = Quantize( $x, d_ "1.00" ); say $y; # print 1234.57
$number = Rescale( $a, $b )
This function is used to rescale the number
$a
so that its exponent has a specific value, given by$b
. TheQuantize
function may also be used for this purpose, and is often easier to use.use v5.10; use Math::decNumber qw(d_ Rescale); my $x = d_ '1234.5678'; my $y = Rescale( $x, d_ -2 ); say $y; # print 1234.57
$number = ScaleB( $a, $b )
This function is used to adjust (scale) the exponent of a
$a
: it returns the result of multiplying$a
by ten raised to the power of$b
.$b
must be an integer.use v5.10; use Math::decNumber qw( :all ); say ScaleB(d_ 12345.67, -2); # print 123.4567 say ScaleB(d_ 0.001234, 3); # print 1.234
We have:
1 <= ScaleB($a, -LogB($a)) < 10
when$a
is positive and finite.$number = Trim( $a )
Removes insignificant trailing zeros from
$a
, unconditionally.
Logical functions
The logical functions expect their arguments to be logical operands. A logical operand is a decNumber whose exponent and sign are both zero, and whose digits are all either 0 or 1.
$number = And( $a, $b )
Returns digit-wise logical and of the logical operands
$a
and$b
. The&
Perl operator is overload by this function, so$a & $b := And($a, $b)
.use v5.10; use Math::decNumber 'd_'; say d_('10101101') & d_('11100000'); # print 10100000
$number = Invert( $a )
Returns the digit-wise inversion of
$a
(A 0 digit becomes 1 and vice versa.) The~
Perl operator is overload by this function, so~$a := Invert($a)
.use v5.10; use Math::decNumber 'd_'; # default precision 34 say ~d_(0); # print 1111111111111111111111111111111111
$number = Or( $a, $b )
Returns digit-wise logical or of the logical operands
$a
and$b
. The|
Perl operator is overload by this function, so$a | $b := Or($a, $b)
.use v5.10; use Math::decNumber 'd_'; say d_('10101101') | d_('11100110'); # print 11101111
$number = Xor( $a, $b )
Returns digit-wise logical xor of the logical operands
$a
and$b
. The^
Perl operator is overload by this function, so$a ^ $b := Xor($a, $b)
.use v5.10; use Math::decNumber 'd_'; say d_('10101101') ^ d_('01100110'); # print 11001011
Comparison
$number = Compare( $a, $b )
This function compares
$a
and$b
numerically. If the$a
is less than$b
then the function returns the value-1
. If they are equal it returns0
. If$a
is greater than$b
then it returns the value1
. If the operands are not comparable (that is, one or both is aNaN
) the result will beNaN
.The
<=>
Perl operator is overloaded by this function, so$a <=> $b := Compare($a, $b)
.use v5.10; use Math::decNumber qw(:all); say Compare(d_(1)/0, d_ 3); # print 1 (+Inf > 3) say Compare(d_(0)/0, d_ 3); # print NaN (NaN and 3 are not comparable)
$number = CompareSignal( $a, $b )
This function is identical to
Compare
except that allNaN
s (including quietNaN
s) signal.$number = CompareTotal( $a, $ b )
This function compares
$a
and$b
using the IEEE 754 total ordering. If the$a
is less than$b
in the total order then the function returns the value-1
. If they are equal it returns0
. If$a
is greater than$b
then it returns the value1
. The total order differs from the numerical comparison in that:-NaN < -sNaN < -Infinity < -finites < -0 < +0 < +finites < +Infinity < +sNaN < +NaN
.use v5.10; use Math::decNumber qw(:all); say CompareTotal(d_(1)/0, d_ 3); # print 1 (+Inf > 3) say CompareTotal(d_(0)/0, d_ 3); # print 1 (+NaN > 3)
$number = CompareTotalMag( $a, $b )
This function compares the magnitude of
$a
and$b
using the IEEE 754 total ordering. It is identical toCompareTotal
except that the signs of the operands are ignored and taken to be 0 (non-negative).$number = SameQuantum( $a, $b )
This function is used to test whether the exponents of two numbers are equal. The coefficients and signs of the operands (
$a
and$b
) are ignored. If the exponents of the operands are equal, or if they are bothInfinitie
s or they are bothNaN
s, it returns1
. In all other cases, it returns0
.use v5.10; use Math::decNumber qw(d_ SameQuantum); say SameQuantum(d_ '12e3', '12000e3' ); # print 1 say SameQuantum(d_ '12e3', '120e2' ); # print 0
Test functions
$boolean = IsCanonical( $a )
Tests whether the encoding of
$a
is canonical. Returns always true, because decNumbers always have canonical encodings (the function is provided for compatibility with the IEEE 754).$boolean = IsFinite( $a )
Returns 1 (true) if
$a
is finite, or 0 (false) otherwise (that is, it is an infinity or aNaN
).$boolean = IsInfinite( $a )
Returns 1 (true) if
$a
is infinite, or 0 (false) otherwise (that is, it is a finite number or aNaN
).$boolean = IsNaN( $a )
Returns 1 (true) if
$a
is aNaN
, or 0 (false) otherwise.$boolean = IsNegative( $a )
Returns 1 (true) if
$a
is negative, or 0 (false) otherwise.$boolean = IsNormal( $a )
Returns 1 (true) if
$a
is normal (that is, finite, non-zero, and not subnormal), or 0 (false) otherwise.$boolean = IsQNaN( $a )
Returns 1 (true) if
$a
is aQuiet NaN
, or 0 (false) otherwise.$boolean = IsSNaN( $a )
Returns 1 (true) if
$a
is aSignaling NaN
, or 0 (false) otherwise.$boolean = IsSpecial( $a )
Returns 1 (true) if
$a
is special (Infinity orNaN
), or 0 (false) otherwise.$boolean = IsSubnormal( $a )
Returns 1 (true) if
$a
is subnormal (that is, finite, non-zero, and magnitude less than10**emin
), or 0 (false) otherwise.$boolean = IsZero( $a )
Returns 1 (true) if
$a
is zero, or 0 (false) otherwise.
Utility functions
$int_class = Class( $a )
Returns the number of the class of
$a
in the enumeration:sNaN 0 NaN 1 -Infinity 2 -Normal 3 -Subnormal 4 -Zero 5 +Zero 6 +Subnormal 7 +Normal 8 +Infinity 9
This number can be converted to a character string using
ClassToString
.$string = ClassToString( $a | $int_class )
Returns the name of the class of
$a
or corresponding to the number$int_class
.$number = Reduce( $a )
Returns the simplest (shortest) form of
$a
.use v5.10; use Math::decNumber qw(d_ Reduce); my $x = d_ '123000.000'; say $x; # print 123000.000 say Reduce($x); # print 1.23E+5
$int = Radix( )
This function returns the radix (number base) used by the package. This always returns 10.
$number = Copy( $a )
Returns a copy of
$a
.$number = CopyAbs( $a )
This function is identical to
Copy
except that the sign of the result is always+
.$number = CopyNegate( $a )
This function is identical to
Copy
except that the sign of the result is the inverse of the sign of$a
.$number = CopySign( $a, $b )
This function is identical to
Copy
except that the sign of the result is the sign of$b
.$string = Version( )
Returns description of the version of the decNumber library being run.
Exception handling
With Math::decNumber
all operations and functions return a result. By default, there is no exception. For example, the script:
use strict;
use warnings;
use v5.10;
use Math::decNumber ':all';
for my $x (1..3) {
say 1/sqrt(d_(2) - $x);
}
prints:
1
Infinity
NaN
When one of the Math::decNumber
functions sets a bit in the context status, the bit is compared with the corresponding bit in the traps field. If that bit is set (is 1) then a Floating-Point Exception signal (FPE
) is raised. At that point, a signal handler function (previously installed) is called.
use strict;
use warnings;
use v5.10;
use Math::decNumber ':all';
ContextTraps(DEC_Division_by_zero); # to trap division by zero
$SIG{FPE} = \&signal_handler; # install the signal handler
sub signal_handler { # a simple signal handler
die "Division by zero: it's illegal!";
}
for my $x (1..3) {
say 1/sqrt(d_(2) - $x);
}
prints:
1
Division by zero: it's illegal! at ...etc
See "signals" in perlipc.
Export
The module exports nothing by default: the function names and constants must be explicitly exported.
Export Tags:
:ROUND_
exports the
ROUND_*
"ContextRounding" modes constants.:DEC_
exports the
DEC_*
Trap-enabler and "Status" flags and constants.:all
exports all.
SEE ALSO
Math::Decimal, Math::Decimal64.
The author of the decNumber library, Mike Cowlishaw, has a very rich web page about decimal arithmetic:
The General Decimal Arithmetic website - http://speleotrove.com/decimal/
AUTHOR
Jean-Louis Morel, <jl_morel@bribes.org>
COPYRIGHT AND LICENSE
Copyright (c) 2014 by J-L Morel
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.0 or, at your option, any later version of Perl 5 you may have available.
ICU License for the decNumber C library - ICU 1.8.1 and later
COPYRIGHT AND PERMISSION NOTICE
Copyright (c) 1995-2010 International Business Machines Corporation and others
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.
All trademarks and registered trademarks mentioned herein are the property of their respective owners.