]> Cypherpunks repositories - gostls13.git/commitdiff
Support exponential notation in RatFromString.
authorAustin Clements <aclements@csail.mit.edu>
Fri, 17 Jul 2009 22:09:43 +0000 (15:09 -0700)
committerAustin Clements <aclements@csail.mit.edu>
Fri, 17 Jul 2009 22:09:43 +0000 (15:09 -0700)
R=gri
APPROVED=gri
DELTA=30  (25 added, 0 deleted, 5 changed)
OCL=31796
CL=31799

src/pkg/bignum/bignum.go
src/pkg/bignum/bignum_test.go

index 4fe6d044425dd0d8671b2c25ce0132da7eed87d0..4cd520fbe26995b36284c118ea93769650fdf4ab 100755 (executable)
@@ -1527,5 +1527,24 @@ func RatFromString(s string, base uint) (*Rational, uint, int) {
                }
        }
 
-       return MakeRat(a, b), base, alen + blen;
+       // read exponent, if any
+       var elen int;
+       mlen := alen + blen;
+       if mlen < len(s) {
+               ch := s[mlen];
+               if ch == 'e' || ch == 'E' {
+                       var e *Integer;
+                       e, base, elen = IntFromString(s[mlen + 1 : len(s)], abase);
+                       elen++;
+                       assert(base == abase);
+                       m := Nat(10).Pow(uint(e.mant.Value()));
+                       if e.sign {
+                               b = b.Mul(m);
+                       } else {
+                               a = a.MulNat(m);
+                       }
+               }
+       }
+
+       return MakeRat(a, b), base, alen + blen + elen;
 }
index 4f6f3f6f66f3ff6acd5521379b70e46bc5534d70..88bdf563abfce1a2e2dade40f7aaa323fcadb280 100644 (file)
@@ -213,9 +213,15 @@ func TestRatConv(t *testing.T) {
        test(4, slen == 7);
        rat_eq(5, ratFromString("0.", 0, nil), rat_zero);
        rat_eq(6, ratFromString("0.001f", 10, nil), bignum.Rat(1, 1000));
-       rat_eq(7, ratFromString("10101.0101", 2, nil), bignum.Rat(0x155, 1<<4));
-       rat_eq(8, ratFromString("-0003.145926", 10, &slen), bignum.Rat(-3145926, 1000000));
-       test(9, slen == 12);
+       rat_eq(7, ratFromString(".1", 0, nil), bignum.Rat(1, 10));
+       rat_eq(8, ratFromString("10101.0101", 2, nil), bignum.Rat(0x155, 1<<4));
+       rat_eq(9, ratFromString("-0003.145926", 10, &slen), bignum.Rat(-3145926, 1000000));
+       test(10, slen == 12);
+       rat_eq(11, ratFromString("1e2", 0, nil), bignum.Rat(100, 1));
+       rat_eq(12, ratFromString("1e-2", 0, nil), bignum.Rat(1, 100));
+       rat_eq(13, ratFromString("1.1e2", 0, nil), bignum.Rat(110, 1));
+       rat_eq(14, ratFromString(".1e2x", 0, &slen), bignum.Rat(10, 1));
+       test(15, slen == 4);
 }