aboutsummaryrefslogtreecommitdiff
path: root/src/strconv
diff options
context:
space:
mode:
authorNigel Tao <nigeltao@golang.org>2020-10-22 23:59:00 +1100
committerNigel Tao <nigeltao@golang.org>2020-10-22 21:12:43 +0000
commit4ce9ea52c9ac48f85fba1233b6e7d563f89dff8b (patch)
tree79fbfd45859e78c9b8d4f9a74f98d456b2cd8642 /src/strconv
parentc92bfac01e9e8319822f472fd11a51bf28762125 (diff)
downloadgo-4ce9ea52c9ac48f85fba1233b6e7d563f89dff8b.tar.gz
go-4ce9ea52c9ac48f85fba1233b6e7d563f89dff8b.zip
strconv: fix Eisel-Lemire for negative zero
This is somewhat academic (and no tests failed before this commit), since func atof64 only calls func eiselLemire when func atof64exact fails, and func atof64exact doesn't fail when parsing positive or negative zeroes. But it's still worth fixing. Change-Id: Ibe6ef4c8fd96827673b711d5456003fbc447e39c Reviewed-on: https://go-review.googlesource.com/c/go/+/264140 Trust: Nigel Tao <nigeltao@golang.org> Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/strconv')
-rw-r--r--src/strconv/eisel_lemire.go7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/strconv/eisel_lemire.go b/src/strconv/eisel_lemire.go
index 00fadbdb96..5cd22a7e37 100644
--- a/src/strconv/eisel_lemire.go
+++ b/src/strconv/eisel_lemire.go
@@ -22,14 +22,17 @@ import (
"math/bits"
)
-func eiselLemire(man uint64, exp10 int, neg bool) (ret float64, ok bool) {
+func eiselLemire(man uint64, exp10 int, neg bool) (f float64, ok bool) {
// The terse comments in this function body refer to sections of the
// https://nigeltao.github.io/blog/2020/eisel-lemire.html blog post.
// Exp10 Range.
const exp10Min, exp10Max = -307, +288
if man == 0 {
- return 0, true
+ if neg {
+ f = math.Float64frombits(0x80000000_00000000) // Negative zero.
+ }
+ return f, true
}
if exp10 < exp10Min || exp10Max < exp10 {
return 0, false