]> Cypherpunks repositories - gostls13.git/commitdiff
big: fix panic and round correctly in Rat.FloatString
authorAnthony Martin <ality@pbrane.org>
Thu, 7 Oct 2010 14:10:48 +0000 (16:10 +0200)
committerRobert Griesemer <gri@golang.org>
Thu, 7 Oct 2010 14:10:48 +0000 (16:10 +0200)
R=gri, rsc
CC=golang-dev
https://golang.org/cl/2212044

src/pkg/big/rat.go
src/pkg/big/rat_test.go

index 22ae8d2d8b4ea34908abf37cfdd9e7940fcce591..40c6ef5bd6af76e58f87929bb98dfcd8308ea033 100644 (file)
@@ -294,25 +294,34 @@ func (z *Rat) FloatString(prec int) string {
 
        q, r := nat{}.div(nat{}, z.a.abs, z.b)
 
-       s := q.string(10)
-       if z.a.neg {
-               s = "-" + s
+       p := natOne
+       if prec > 0 {
+               p = nat{}.expNN(natTen, nat{}.setUint64(uint64(prec)), nil)
        }
 
-       p := nat{}.expNN(natTen, nat{Word(prec)}, nil)
        r = r.mul(r, p)
        r, r2 := r.div(nat{}, r, z.b)
 
        // see if we need to round up
-       r2 = r2.mul(r2, natTwo)
+       r2 = r2.add(r2, r2)
        if z.b.cmp(r2) <= 0 {
                r = r.add(r, natOne)
+               if r.cmp(p) >= 0 {
+                       q = nat{}.add(q, natOne)
+                       r = nat{}.sub(r, p)
+               }
+       }
+
+       s := q.string(10)
+       if z.a.neg {
+               s = "-" + s
        }
 
-       rs := r.string(10)
-       leadingZeros := prec - len(rs)
-       s += "." + strings.Repeat("0", leadingZeros) + rs
-       s = strings.TrimRight(s, "0")
+       if prec > 0 {
+               rs := r.string(10)
+               leadingZeros := prec - len(rs)
+               s += "." + strings.Repeat("0", leadingZeros) + rs
+       }
 
        return s
 }
index ccc9cf60563ea8a03b23040de6d4d2b84ad7f34a..ff2bb9978b21777cd1eb7fc57e3cd274c5767e81 100644 (file)
@@ -71,6 +71,11 @@ var floatStringTests = []floatStringTest{
        floatStringTest{".25", 1, "0.3"},
        floatStringTest{"-1/3", 3, "-0.333"},
        floatStringTest{"-2/3", 4, "-0.6667"},
+       floatStringTest{"0.96", 1, "1.0"},
+       floatStringTest{"0.999", 2, "1.00"},
+       floatStringTest{"0.9", 0, "1"},
+       floatStringTest{".25", -1, "0"},
+       floatStringTest{".55", -1, "1"},
 }
 
 func TestFloatString(t *testing.T) {