diff options
author | Robert Griesemer <gri@golang.org> | 2014-05-21 08:53:47 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2014-05-21 08:53:47 -0700 |
commit | 765b4a3f8651d7523f46f7e6f3839ae4b704b4f2 (patch) | |
tree | 85fa11221d39374fecbe9bd446616a773e301af2 /test/float_lit2.go | |
parent | 7d4cb4d63f8a0039d5c4ecdfcc03c5de231ecfd4 (diff) | |
download | go-765b4a3f8651d7523f46f7e6f3839ae4b704b4f2.tar.gz go-765b4a3f8651d7523f46f7e6f3839ae4b704b4f2.zip |
test/float_lit2.go: compute test values from first principles
These constants pass go/types constant conversions as well.
LGTM=r
R=r
CC=golang-codereviews
https://golang.org/cl/91590047
Diffstat (limited to 'test/float_lit2.go')
-rw-r--r-- | test/float_lit2.go | 75 |
1 files changed, 65 insertions, 10 deletions
diff --git a/test/float_lit2.go b/test/float_lit2.go index 30951a702c..a68ba2180e 100644 --- a/test/float_lit2.go +++ b/test/float_lit2.go @@ -12,20 +12,75 @@ import ( "fmt" ) +const ( + m32bits = 23 // number of float32 mantissa bits + e32max = 127 // max. float32 exponent + maxExp32 = e32max - m32bits + maxMant32 = 1<<(m32bits+1) - 1 + + maxFloat32_0 = (maxMant32 - 0) << maxExp32 + maxFloat32_1 = (maxMant32 - 1) << maxExp32 + maxFloat32_2 = (maxMant32 - 2) << maxExp32 +) + +func init() { + if maxExp32 != 104 { + panic("incorrect maxExp32") + } + if maxMant32 != 16777215 { + panic("incorrect maxMant32") + } + if maxFloat32_0 != 340282346638528859811704183484516925440 { + panic("incorrect maxFloat32_0") + } +} + +const ( + m64bits = 52 // number of float64 mantissa bits + e64max = 1023 // max. float64 exponent + maxExp64 = e64max - m64bits + maxMant64 = 1<<(m64bits+1) - 1 + + // These expressions are not permitted due to implementation restrictions. + // maxFloat64_0 = (maxMant64-0) << maxExp64 + // maxFloat64_1 = (maxMant64-1) << maxExp64 + // maxFloat64_2 = (maxMant64-2) << maxExp64 + + // These equivalent values were computed using math/big. + maxFloat64_0 = 1.7976931348623157e308 + maxFloat64_1 = 1.7976931348623155e308 + maxFloat64_2 = 1.7976931348623153e308 +) + +func init() { + if maxExp64 != 971 { + panic("incorrect maxExp64") + } + if maxMant64 != 9007199254740991 { + panic("incorrect maxMant64") + } +} + var cvt = []struct { val interface{} binary string }{ - {float32(-340282356779733661637539395458142568447), "-16777215p+104"}, - {float32(-340282326356119256160033759537265639424), "-16777214p+104"}, - {float32(340282326356119256160033759537265639424), "16777214p+104"}, - {float32(340282356779733661637539395458142568447), "16777215p+104"}, - {float64(-1.797693134862315807937289714053e+308), "-9007199254740991p+971"}, - {float64(-1.797693134862315708145274237317e+308), "-9007199254740991p+971"}, - {float64(-1.797693134862315608353258760581e+308), "-9007199254740990p+971"}, - {float64(1.797693134862315608353258760581e+308), "9007199254740990p+971"}, - {float64(1.797693134862315708145274237317e+308), "9007199254740991p+971"}, - {float64(1.797693134862315807937289714053e+308), "9007199254740991p+971"}, + + {float32(maxFloat32_0), fmt.Sprintf("%dp+%d", maxMant32-0, maxExp32)}, + {float32(maxFloat32_1), fmt.Sprintf("%dp+%d", maxMant32-1, maxExp32)}, + {float32(maxFloat32_2), fmt.Sprintf("%dp+%d", maxMant32-2, maxExp32)}, + + {float64(maxFloat64_0), fmt.Sprintf("%dp+%d", maxMant64-0, maxExp64)}, + {float64(maxFloat64_1), fmt.Sprintf("%dp+%d", maxMant64-1, maxExp64)}, + {float64(maxFloat64_2), fmt.Sprintf("%dp+%d", maxMant64-2, maxExp64)}, + + {float32(-maxFloat32_0), fmt.Sprintf("-%dp+%d", maxMant32-0, maxExp32)}, + {float32(-maxFloat32_1), fmt.Sprintf("-%dp+%d", maxMant32-1, maxExp32)}, + {float32(-maxFloat32_2), fmt.Sprintf("-%dp+%d", maxMant32-2, maxExp32)}, + + {float64(-maxFloat64_0), fmt.Sprintf("-%dp+%d", maxMant64-0, maxExp64)}, + {float64(-maxFloat64_1), fmt.Sprintf("-%dp+%d", maxMant64-1, maxExp64)}, + {float64(-maxFloat64_2), fmt.Sprintf("-%dp+%d", maxMant64-2, maxExp64)}, } func main() { |