summaryrefslogtreecommitdiff
path: root/lib/Math
diff options
context:
space:
mode:
authorJohn Peacock <jpeacock@rowman.com>2000-08-01 05:38:12 -0400
committerJarkko Hietaniemi <jhi@iki.fi>2000-08-17 04:07:10 +0000
commit3deb277dac3b5f1492bde2aa49ab00aeb793ba7b (patch)
tree439f7c9899625ce7c050ddb6507e47d9a50364c7 /lib/Math
parentb060a406751953a32a71f4f78250712ec107c8e2 (diff)
downloadperl-3deb277dac3b5f1492bde2aa49ab00aeb793ba7b.tar.gz
Re: [PATCH]Re: Questions about Math::BigFloat
Message-ID: <3986D2C4.54B78FE4@UnivPress.com> p4raw-id: //depot/perl@6673
Diffstat (limited to 'lib/Math')
-rw-r--r--lib/Math/BigFloat.pm26
-rw-r--r--lib/Math/BigInt.pm1
2 files changed, 20 insertions, 7 deletions
diff --git a/lib/Math/BigFloat.pm b/lib/Math/BigFloat.pm
index d8d643ca3e..74a023e0d8 100644
--- a/lib/Math/BigFloat.pm
+++ b/lib/Math/BigFloat.pm
@@ -4,6 +4,7 @@ use Math::BigInt;
use Exporter; # just for use to be happy
@ISA = (Exporter);
+$VERSION = '0.01'; # never had version before
use overload
'+' => sub {new Math::BigFloat &fadd},
@@ -85,6 +86,7 @@ sub fnorm { #(string) return fnum_str
# normalize number -- for internal use
sub norm { #(mantissa, exponent) return fnum_str
local($_, $exp) = @_;
+ $exp = 0 unless defined $exp;
if ($_ eq 'NaN') {
'NaN';
} else {
@@ -174,12 +176,14 @@ sub round { #(int_str, int_str, int_str) return int_str
} else {
local($cmp) = Math::BigInt::bcmp(Math::BigInt::bmul($r,'+2'),$base);
if ( $cmp < 0 ||
- ($cmp == 0 &&
- ( $rnd_mode eq 'zero' ||
+ ($cmp == 0 && (
+ ($rnd_mode eq 'zero' ) ||
($rnd_mode eq '-inf' && (substr($q,$[,1) eq '+')) ||
($rnd_mode eq '+inf' && (substr($q,$[,1) eq '-')) ||
- ($rnd_mode eq 'even' && $q =~ /[24680]$/) ||
- ($rnd_mode eq 'odd' && $q =~ /[13579]$/) )) ) {
+ ($rnd_mode eq 'even' && $q =~ /[13579]$/ ) ||
+ ($rnd_mode eq 'odd' && $q =~ /[24680]$/ ) )
+ )
+ ) {
$q; # round down
} else {
Math::BigInt::badd($q, ((substr($q,$[,1) eq '-') ? '-1' : '+1'));
@@ -244,9 +248,17 @@ sub fcmp #(fnum_str, fnum_str) return cond_code
if ($xm eq '+0' || $ym eq '+0') {
return $xm <=> $ym;
}
- ord($y) <=> ord($x)
- || ($xe <=> $ye) * (substr($x,$[,1).'1')
- || Math::BigInt::cmp($xm,$ym);
+ if ( $xe < $ye ) # adjust the exponents to be equal
+ {
+ $ym .= '0' x ($ye - $xe);
+ $ye = $xe;
+ }
+ elsif ( $ye < $xe ) # same here
+ {
+ $xm .= '0' x ($xe - $ye);
+ $xe = $ye;
+ }
+ return Math::BigInt::cmp($xm,$ym);
}
}
diff --git a/lib/Math/BigInt.pm b/lib/Math/BigInt.pm
index a43969c2b2..808e5522b9 100644
--- a/lib/Math/BigInt.pm
+++ b/lib/Math/BigInt.pm
@@ -1,4 +1,5 @@
package Math::BigInt;
+$VERSION='0.01';
use overload
'+' => sub {new Math::BigInt &badd},