1
0
mirror of https://github.com/golang/go synced 2024-11-20 05:54:43 -07:00

Support exponential notation in RatFromString.

R=gri
APPROVED=gri
DELTA=30  (25 added, 0 deleted, 5 changed)
OCL=31796
CL=31799
This commit is contained in:
Austin Clements 2009-07-17 15:09:43 -07:00
parent e86dcf1603
commit 25b4be5a55
2 changed files with 29 additions and 4 deletions

View File

@ -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;
} }

View File

@ -213,9 +213,15 @@ func TestRatConv(t *testing.T) {
test(4, slen == 7); test(4, slen == 7);
rat_eq(5, ratFromString("0.", 0, nil), rat_zero); rat_eq(5, ratFromString("0.", 0, nil), rat_zero);
rat_eq(6, ratFromString("0.001f", 10, nil), bignum.Rat(1, 1000)); 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(7, ratFromString(".1", 0, nil), bignum.Rat(1, 10));
rat_eq(8, ratFromString("-0003.145926", 10, &slen), bignum.Rat(-3145926, 1000000)); rat_eq(8, ratFromString("10101.0101", 2, nil), bignum.Rat(0x155, 1<<4));
test(9, slen == 12); 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);
} }