From 55ecda4ffd1899463db19bf224106fd73de21898 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 17 Sep 2015 18:10:20 -0700 Subject: [PATCH] spec: clarify numeric conversions where IEEE-754 produces -0.0 The spec defines precise numeric constants which do not overflow. Consequently, +/-Inf and NaN values were excluded. The case was not clear for -0.0 but they are mostly of interest to determine the sign of infinities which don't exist. That said, the conversion rules explicitly say that T(x) (for a numeric x and floating-point type T) is the value after rounding per IEEE-754. The result is constant if x is constant. Rounding per IEEE-754 can produce a -0.0 which we cannot represent as a constant. Thus, the spec is inconsistent. Attempt to fix the inconsistency by adjusting the rounding rule rather than letting -0.0 into the language. For more details, see the issue below. Open to discussion. Fixes #12576. Change-Id: Ibe3c676372ab16d9229f1f9daaf316f761e074ee Reviewed-on: https://go-review.googlesource.com/14727 Reviewed-by: Rob Pike Reviewed-by: Ian Lance Taylor Reviewed-by: Russ Cox --- doc/go_spec.html | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index 6c4eac152d..873c127bdd 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -558,7 +558,9 @@ and are discussed in that section.

-Numeric constants represent values of arbitrary precision and do not overflow. +Numeric constants represent exact values of arbitrary precision and do not overflow. +Consequently, there are no constants denoting the IEEE-754 negative zero, infinity, +and not-a-number values.

@@ -593,16 +595,6 @@ respectively, depending on whether it is a boolean, rune, integer, floating-poin complex, or string constant.

-

-There are no constants denoting the IEEE-754 infinity and not-a-number values, -but the math package's -Inf, -NaN, -IsInf, and -IsNaN -functions return and test for those values at run time. -

-

Implementation restriction: Although numeric constants have arbitrary precision in the language, a compiler may implement them using an @@ -3795,7 +3787,8 @@ type T in any of these cases: T is a floating-point type, and x is representable by a value of type T after rounding using - IEEE 754 round-to-even rules. + IEEE 754 round-to-even rules, but with an IEEE -0.0 + further rounded to an unsigned 0.0. The constant T(x) is the rounded value.

  • @@ -3815,6 +3808,7 @@ uint(iota) // iota value of type uint float32(2.718281828) // 2.718281828 of type float32 complex128(1) // 1.0 + 0.0i of type complex128 float32(0.49999999) // 0.5 of type float32 +float64(-1e-1000) // 0.0 of type float64 string('x') // "x" of type string string(0x266c) // "♬" of type string MyString("foo" + "bar") // "foobar" of type MyString -- 2.48.1