From: Wèi Cōngruì Date: Thu, 11 Jan 2018 05:11:12 +0000 (+0800) Subject: math: fix Ldexp when result is below ldexp(2, -1075) X-Git-Tag: go1.11beta1~1043 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=4b265fb74736ffaba2ad5cc96f43e442ae0d9850;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- 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