diff --git a/src/pkg/strconv/atof_test.go b/src/pkg/strconv/atof_test.go index e68634c0d88..3fa637d2bc6 100644 --- a/src/pkg/strconv/atof_test.go +++ b/src/pkg/strconv/atof_test.go @@ -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): } diff --git a/src/pkg/strconv/extfloat.go b/src/pkg/strconv/extfloat.go index 5f66dc6239f..980052a778b 100644 --- a/src/pkg/strconv/extfloat.go +++ b/src/pkg/strconv/extfloat.go @@ -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)