aboutsummaryrefslogtreecommitdiff
path: root/src/math
diff options
context:
space:
mode:
authorWèi Cōngruì <crvv.mail@gmail.com>2018-01-11 13:11:12 +0800
committerRobert Griesemer <gri@golang.org>2018-03-29 23:14:13 +0000
commit4b265fb74736ffaba2ad5cc96f43e442ae0d9850 (patch)
treeee1fce462b2b29701791ca76dd19a3d271df7bab /src/math
parent9967582f770f62f72a349ec276e00dba8639aa26 (diff)
downloadgo-4b265fb74736ffaba2ad5cc96f43e442ae0d9850.tar.xz
math: fix Ldexp when result is below ldexp(2, -1075)
Before this change, the smallest result Ldexp can handle was ldexp(2, -1075), which is SmallestNonzeroFloat64. There are some numbers below it should also be rounded to SmallestNonzeroFloat64. The change fixes this. Fixes #23407 Change-Id: I76f4cb005a6e9ccdd95b5e5c734079fd5d29e4aa Reviewed-on: https://go-review.googlesource.com/87338 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/math')
-rw-r--r--src/math/all_test.go4
-rw-r--r--src/math/ldexp.go6
2 files changed, 7 insertions, 3 deletions
diff --git a/src/math/all_test.go b/src/math/all_test.go
index a145c5e60b..1ac8ce886c 100644
--- a/src/math/all_test.go
+++ b/src/math/all_test.go
@@ -1967,6 +1967,8 @@ var vfldexpBC = []fi{
{-1, -1075},
{1, 1024},
{-1, 1024},
+ {1.0000000000000002, -1075},
+ {1, -1075},
}
var ldexpBC = []float64{
SmallestNonzeroFloat64,
@@ -1977,6 +1979,8 @@ var ldexpBC = []float64{
Copysign(0, -1),
Inf(1),
Inf(-1),
+ SmallestNonzeroFloat64,
+ 0,
}
var logbBC = []float64{
diff --git a/src/math/ldexp.go b/src/math/ldexp.go
index b5d2a5e7e8..aa50a49ade 100644
--- a/src/math/ldexp.go
+++ b/src/math/ldexp.go
@@ -25,7 +25,7 @@ func ldexp(frac float64, exp int) float64 {
exp += e
x := Float64bits(frac)
exp += int(x>>shift)&mask - bias
- if exp < -1074 {
+ if exp < -1075 {
return Copysign(0, frac) // underflow
}
if exp > 1023 { // overflow
@@ -36,8 +36,8 @@ func ldexp(frac float64, exp int) float64 {
}
var m float64 = 1
if exp < -1022 { // denormal
- exp += 52
- m = 1.0 / (1 << 52) // 2**-52
+ exp += 53
+ m = 1.0 / (1 << 53) // 2**-53
}
x &^= mask << shift
x |= uint64(exp+bias) << shift