From: Robert Griesemer Date: Wed, 23 Jan 2019 23:36:41 +0000 (-0800) Subject: math/big: permit upper-case 'P' binary exponent (not just 'p') X-Git-Tag: go1.13beta1~1495 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7bc2aa670f47266d3c5a840d748a1f2e805b89d7;p=gostls13.git math/big: permit upper-case 'P' binary exponent (not just 'p') The current implementation accepted binary exponents but restricted them to 'p'. This change permits both 'p' and 'P'. R=Go1.13 Updates #29008. Change-Id: I7a89ccb86af4438f17b0422be7cb630ffcf43272 Reviewed-on: https://go-review.googlesource.com/c/159297 Reviewed-by: Russ Cox Reviewed-by: Emmanuel Odeke --- diff --git a/src/math/big/floatconv.go b/src/math/big/floatconv.go index 95d1bf84e2..5cc9e24f4c 100644 --- a/src/math/big/floatconv.go +++ b/src/math/big/floatconv.go @@ -224,7 +224,7 @@ func (z *Float) pow5(n uint64) *Float { // sign = "+" | "-" . // prefix = "0" ( "x" | "X" | "b" | "B" ) . // mantissa = digits | digits "." [ digits ] | "." digits . -// exponent = ( "E" | "e" | "p" ) [ sign ] digits . +// exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . // digits = digit { digit } . // digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . // infinity = [ sign ] ( "inf" | "Inf" ) . @@ -238,7 +238,7 @@ func (z *Float) pow5(n uint64) *Float { // The octal prefix "0" is not supported (a leading "0" is simply // considered a "0"). // -// A "p" exponent indicates a binary (rather then decimal) exponent; +// A "p" or "P" exponent indicates a binary (rather then decimal) exponent; // for instance "0x1.fffffffffffffp1023" (using base 0) represents the // maximum float64 value. For hexadecimal mantissae, the exponent must // be binary, if present (an "e" or "E" exponent indicator cannot be diff --git a/src/math/big/floatconv_test.go b/src/math/big/floatconv_test.go index 269e2652e8..6db9bf2e46 100644 --- a/src/math/big/floatconv_test.go +++ b/src/math/big/floatconv_test.go @@ -108,6 +108,7 @@ func TestFloatSetFloat64String(t *testing.T) { {"0b001p-3", 0.125}, {"0b.001p3", 1}, {"0b0.01p2", 1}, + {"0b0.01P+2", 1}, // hexadecimal mantissa and exponent {"0x0", 0}, @@ -117,6 +118,7 @@ func TestFloatSetFloat64String(t *testing.T) { {"0xff", 255}, {"0X.8p1", 1}, {"-0X0.00008p16", -0.5}, + {"-0X0.00008P+16", -0.5}, {"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64}, {"0x1.fffffffffffffp1023", math.MaxFloat64}, } { diff --git a/src/math/big/ratconv.go b/src/math/big/ratconv.go index 5656280e84..bd2509f168 100644 --- a/src/math/big/ratconv.go +++ b/src/math/big/ratconv.go @@ -130,10 +130,10 @@ func (z *Rat) SetString(s string) (*Rat, bool) { } // scanExponent scans the longest possible prefix of r representing a decimal -// ('e', 'E') or binary ('p') exponent, if any. It returns the exponent, the -// exponent base (10 or 2), or a read or syntax error, if any. +// ('e', 'E') or binary ('p', 'P') exponent, if any. It returns the exponent, +// the exponent base (10 or 2), or a read or syntax error, if any. // -// exponent = ( "E" | "e" | "p" ) [ sign ] digits . +// exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . // sign = "+" | "-" . // digits = digit { digit } . // digit = "0" ... "9" . @@ -153,7 +153,7 @@ func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err err switch ch { case 'e', 'E': // ok - case 'p': + case 'p', 'P': if binExpOk { base = 2 break // ok