diff options
author | John Peacock <jpeacock@rowman.com> | 2000-08-01 05:38:12 -0400 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2000-08-17 04:07:10 +0000 |
commit | 3deb277dac3b5f1492bde2aa49ab00aeb793ba7b (patch) | |
tree | 439f7c9899625ce7c050ddb6507e47d9a50364c7 /lib/Math | |
parent | b060a406751953a32a71f4f78250712ec107c8e2 (diff) | |
download | perl-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.pm | 26 | ||||
-rw-r--r-- | lib/Math/BigInt.pm | 1 |
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}, |