This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge gv_AVadd(), gv_HVadd() and gv_SVadd() into gv_add_by_type().
[perl5.git] / lib / bigrat.pl
index 008beff..2d3738f 100644 (file)
@@ -1,8 +1,16 @@
 package bigrat;
 require "bigint.pl";
-
+#
+# This library is no longer being maintained, and is included for backward
+# compatibility with Perl 4 programs which may require it.
+#
+# In particular, this should not be used as an example of modern Perl
+# programming techniques.
+#
 # Arbitrary size rational math package
 #
+# by Mark Biggar
+#
 # Input values to these routines consist of strings of the form 
 #   m|^\s*[+-]?[\d\s]+(/[\d\s]+)?$|.
 # Examples:
@@ -53,6 +61,7 @@ sub norm { #(bint, bint) return rat_num
        'NaN';
     } else {
        local($gcd) = &'bgcd($num,$dom);
+       $gcd =~ s/^-/+/;
        if ($gcd ne '+1') { 
            $num = &'bdiv($num,$gcd);
            $dom = &'bdiv($dom,$gcd);
@@ -60,63 +69,63 @@ sub norm { #(bint, bint) return rat_num
            $num = &'bnorm($num);
            $dom = &'bnorm($dom);
        }
-       substr($dom,0,1) = '';
+       substr($dom,$[,1) = '';
        "$num/$dom";
     }
 }
 
 # negation
 sub main'rneg { #(rat_num) return rat_num
-    local($_) = &'rnorm($_[0]);
+    local($_) = &'rnorm(@_);
     tr/-+/+-/ if ($_ ne '+0/1');
     $_;
 }
 
 # absolute value
 sub main'rabs { #(rat_num) return $rat_num
-    local($_) = &'rnorm($_[0]);
-    substr($_,0,1) = '+' unless $_ eq 'NaN';
+    local($_) = &'rnorm(@_);
+    substr($_,$[,1) = '+' unless $_ eq 'NaN';
     $_;
 }
 
 # multipication
 sub main'rmul { #(rat_num, rat_num) return rat_num
-    local($xn,$xd) = split('/',&'rnorm($_[0]));
-    local($yn,$yd) = split('/',&'rnorm($_[1]));
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
     &norm(&'bmul($xn,$yn),&'bmul($xd,$yd));
 }
 
 # division
 sub main'rdiv { #(rat_num, rat_num) return rat_num
-    local($xn,$xd) = split('/',&'rnorm($_[0]));
-    local($yn,$yd) = split('/',&'rnorm($_[1]));
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
     &norm(&'bmul($xn,$yd),&'bmul($xd,$yn));
 }
 \f
 # addition
 sub main'radd { #(rat_num, rat_num) return rat_num
-    local($xn,$xd) = split('/',&'rnorm($_[0]));
-    local($yn,$yd) = split('/',&'rnorm($_[1]));
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
     &norm(&'badd(&'bmul($xn,$yd),&'bmul($yn,$xd)),&'bmul($xd,$yd));
 }
 
 # subtraction
 sub main'rsub { #(rat_num, rat_num) return rat_num
-    local($xn,$xd) = split('/',&'rnorm($_[0]));
-    local($yn,$yd) = split('/',&'rnorm($_[1]));
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
     &norm(&'bsub(&'bmul($xn,$yd),&'bmul($yn,$xd)),&'bmul($xd,$yd));
 }
 
 # comparison
 sub main'rcmp { #(rat_num, rat_num) return cond_code
-    local($xn,$xd) = split('/',&'rnorm($_[0]));
-    local($yn,$yd) = split('/',&'rnorm($_[1]));
+    local($xn,$xd) = split('/',&'rnorm($_[$[]));
+    local($yn,$yd) = split('/',&'rnorm($_[$[+1]));
     &bigint'cmp(&'bmul($xn,$yd),&'bmul($yn,$xd));
 }
 
 # int and frac parts
 sub main'rmod { #(rat_num) return (rat_num,rat_num)
-    local($xn,$xd) = split('/',&'rnorm($_[0]));
+    local($xn,$xd) = split('/',&'rnorm(@_));
     local($i,$f) = &'bdiv($xn,$xd);
     if (wantarray) {
        ("$i/1", "$f/$xd");
@@ -128,7 +137,7 @@ sub main'rmod { #(rat_num) return (rat_num,rat_num)
 # square root by Newtons method.
 #   cycles specifies the number of iterations default: 5
 sub main'rsqrt { #(fnum_str[, cycles]) return fnum_str
-    local($x, $scale) = (&'rnorm($_[0]), $_[1]);
+    local($x, $scale) = (&'rnorm($_[$[]), $_[$[+1]);
     if ($x eq 'NaN') {
        'NaN';
     } elsif ($x =~ /^-/) {