Commit 7bc2aa67 authored by Robert Griesemer's avatar Robert Griesemer

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/159297Reviewed-by: default avatarRuss Cox <rsc@golang.org>
Reviewed-by: default avatarEmmanuel Odeke <emm.odeke@gmail.com>
parent 58365b34
...@@ -224,7 +224,7 @@ func (z *Float) pow5(n uint64) *Float { ...@@ -224,7 +224,7 @@ func (z *Float) pow5(n uint64) *Float {
// sign = "+" | "-" . // sign = "+" | "-" .
// prefix = "0" ( "x" | "X" | "b" | "B" ) . // prefix = "0" ( "x" | "X" | "b" | "B" ) .
// mantissa = digits | digits "." [ digits ] | "." digits . // mantissa = digits | digits "." [ digits ] | "." digits .
// exponent = ( "E" | "e" | "p" ) [ sign ] digits . // exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits .
// digits = digit { digit } . // digits = digit { digit } .
// digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . // digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" .
// infinity = [ sign ] ( "inf" | "Inf" ) . // infinity = [ sign ] ( "inf" | "Inf" ) .
...@@ -238,7 +238,7 @@ func (z *Float) pow5(n uint64) *Float { ...@@ -238,7 +238,7 @@ func (z *Float) pow5(n uint64) *Float {
// The octal prefix "0" is not supported (a leading "0" is simply // The octal prefix "0" is not supported (a leading "0" is simply
// considered a "0"). // 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 // for instance "0x1.fffffffffffffp1023" (using base 0) represents the
// maximum float64 value. For hexadecimal mantissae, the exponent must // maximum float64 value. For hexadecimal mantissae, the exponent must
// be binary, if present (an "e" or "E" exponent indicator cannot be // be binary, if present (an "e" or "E" exponent indicator cannot be
......
...@@ -108,6 +108,7 @@ func TestFloatSetFloat64String(t *testing.T) { ...@@ -108,6 +108,7 @@ func TestFloatSetFloat64String(t *testing.T) {
{"0b001p-3", 0.125}, {"0b001p-3", 0.125},
{"0b.001p3", 1}, {"0b.001p3", 1},
{"0b0.01p2", 1}, {"0b0.01p2", 1},
{"0b0.01P+2", 1},
// hexadecimal mantissa and exponent // hexadecimal mantissa and exponent
{"0x0", 0}, {"0x0", 0},
...@@ -117,6 +118,7 @@ func TestFloatSetFloat64String(t *testing.T) { ...@@ -117,6 +118,7 @@ func TestFloatSetFloat64String(t *testing.T) {
{"0xff", 255}, {"0xff", 255},
{"0X.8p1", 1}, {"0X.8p1", 1},
{"-0X0.00008p16", -0.5}, {"-0X0.00008p16", -0.5},
{"-0X0.00008P+16", -0.5},
{"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64}, {"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64},
{"0x1.fffffffffffffp1023", math.MaxFloat64}, {"0x1.fffffffffffffp1023", math.MaxFloat64},
} { } {
......
...@@ -130,10 +130,10 @@ func (z *Rat) SetString(s string) (*Rat, bool) { ...@@ -130,10 +130,10 @@ func (z *Rat) SetString(s string) (*Rat, bool) {
} }
// scanExponent scans the longest possible prefix of r representing a decimal // scanExponent scans the longest possible prefix of r representing a decimal
// ('e', 'E') or binary ('p') exponent, if any. It returns the exponent, the // ('e', 'E') or binary ('p', 'P') exponent, if any. It returns the exponent,
// exponent base (10 or 2), or a read or syntax error, if any. // 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 = "+" | "-" . // sign = "+" | "-" .
// digits = digit { digit } . // digits = digit { digit } .
// digit = "0" ... "9" . // digit = "0" ... "9" .
...@@ -153,7 +153,7 @@ func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err err ...@@ -153,7 +153,7 @@ func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err err
switch ch { switch ch {
case 'e', 'E': case 'e', 'E':
// ok // ok
case 'p': case 'p', 'P':
if binExpOk { if binExpOk {
base = 2 base = 2
break // ok break // ok
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment