From 2afebbdf35baaf289328c86a7579c8961617ecf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Thu, 22 Dec 2011 17:28:35 -0500 Subject: [PATCH] strconv: fix bug in extended-float based conversion. 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 | 5 ++++- src/pkg/strconv/extfloat.go | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) 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)