1
0
mirror of https://github.com/golang/go synced 2024-11-23 12:40:11 -07:00

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 <rsc@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
This commit is contained in:
Robert Griesemer 2019-01-23 15:36:41 -08:00
parent 58365b34bb
commit 7bc2aa670f
3 changed files with 8 additions and 6 deletions

View File

@ -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

View File

@ -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},
} {

View File

@ -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