]> Cypherpunks repositories - gostls13.git/commitdiff
strconv: fix bug in extended-float based conversion.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 22 Dec 2011 22:28:35 +0000 (17:28 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 22 Dec 2011 22:28:35 +0000 (17:28 -0500)
A test intended for denormals erroneously returned true also for
infinities, leading to bad overflows and wrong error estimates.

R=rsc
CC=golang-dev, remy
https://golang.org/cl/5489091

src/pkg/strconv/atof_test.go
src/pkg/strconv/extfloat.go

index e68634c0d88013923e9a4c10d01b8e69050d20f8..3fa637d2bc6b42a261f99fb2891a94d7cefdd83c 100644 (file)
@@ -114,6 +114,9 @@ var atoftests = []atofTest{
        {"2.2250738585072012e-308", "2.2250738585072014e-308", nil},
        // http://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
        {"2.2250738585072011e-308", "2.225073858507201e-308", nil},
+
+       // A very large number (initially wrongly parsed by the fast algorithm).
+       {"4.630813248087435e+307", "4.630813248087435e+307", nil},
 }
 
 type atofSimpleTest struct {
@@ -200,7 +203,7 @@ func TestAtofRandom(t *testing.T) {
                x, _ := ParseFloat(test.s, 64)
                switch {
                default:
-                       t.Errorf("number %s badly parsed as %b (expected %b)", test.s, test.x, x)
+                       t.Errorf("number %s badly parsed as %b (expected %b)", test.s, x, test.x)
                case x == test.x:
                case math.IsNaN(test.x) && math.IsNaN(x):
                }
index 5f66dc6239f0466335e15410452b9a7a971f38be..980052a778bc45813c807a2b7719f51673e4cfce 100644 (file)
@@ -291,7 +291,7 @@ func (f *extFloat) AssignDecimal(d *decimal) (ok bool) {
        const denormalExp = -1023 - 63
        flt := &float64info
        var extrabits uint
-       if f.exp <= denormalExp || f.exp >= 1023-64 {
+       if f.exp <= denormalExp {
                extrabits = uint(63 - flt.mantbits + 1 + uint(denormalExp-f.exp))
        } else {
                extrabits = uint(63 - flt.mantbits)