Home | History | Annotate | Download | only in strconv
      1 // Copyright 2009 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package strconv
      6 
      7 // decimal to binary floating point conversion.
      8 // Algorithm:
      9 //   1) Store input in multiprecision decimal.
     10 //   2) Multiply/divide decimal by powers of two until in range [0.5, 1)
     11 //   3) Multiply by 2^precision and round to get mantissa.
     12 
     13 import "math"
     14 
     15 var optimize = true // can change for testing
     16 
     17 func equalIgnoreCase(s1, s2 string) bool {
     18 	if len(s1) != len(s2) {
     19 		return false
     20 	}
     21 	for i := 0; i < len(s1); i++ {
     22 		c1 := s1[i]
     23 		if 'A' <= c1 && c1 <= 'Z' {
     24 			c1 += 'a' - 'A'
     25 		}
     26 		c2 := s2[i]
     27 		if 'A' <= c2 && c2 <= 'Z' {
     28 			c2 += 'a' - 'A'
     29 		}
     30 		if c1 != c2 {
     31 			return false
     32 		}
     33 	}
     34 	return true
     35 }
     36 
     37 func special(s string) (f float64, ok bool) {
     38 	if len(s) == 0 {
     39 		return
     40 	}
     41 	switch s[0] {
     42 	default:
     43 		return
     44 	case '+':
     45 		if equalIgnoreCase(s, "+inf") || equalIgnoreCase(s, "+infinity") {
     46 			return math.Inf(1), true
     47 		}
     48 	case '-':
     49 		if equalIgnoreCase(s, "-inf") || equalIgnoreCase(s, "-infinity") {
     50 			return math.Inf(-1), true
     51 		}
     52 	case 'n', 'N':
     53 		if equalIgnoreCase(s, "nan") {
     54 			return math.NaN(), true
     55 		}
     56 	case 'i', 'I':
     57 		if equalIgnoreCase(s, "inf") || equalIgnoreCase(s, "infinity") {
     58 			return math.Inf(1), true
     59 		}
     60 	}
     61 	return
     62 }
     63 
     64 func (b *decimal) set(s string) (ok bool) {
     65 	i := 0
     66 	b.neg = false
     67 	b.trunc = false
     68 
     69 	// optional sign
     70 	if i >= len(s) {
     71 		return
     72 	}
     73 	switch {
     74 	case s[i] == '+':
     75 		i++
     76 	case s[i] == '-':
     77 		b.neg = true
     78 		i++
     79 	}
     80 
     81 	// digits
     82 	sawdot := false
     83 	sawdigits := false
     84 	for ; i < len(s); i++ {
     85 		switch {
     86 		case s[i] == '.':
     87 			if sawdot {
     88 				return
     89 			}
     90 			sawdot = true
     91 			b.dp = b.nd
     92 			continue
     93 
     94 		case '0' <= s[i] && s[i] <= '9':
     95 			sawdigits = true
     96 			if s[i] == '0' && b.nd == 0 { // ignore leading zeros
     97 				b.dp--
     98 				continue
     99 			}
    100 			if b.nd < len(b.d) {
    101 				b.d[b.nd] = s[i]
    102 				b.nd++
    103 			} else if s[i] != '0' {
    104 				b.trunc = true
    105 			}
    106 			continue
    107 		}
    108 		break
    109 	}
    110 	if !sawdigits {
    111 		return
    112 	}
    113 	if !sawdot {
    114 		b.dp = b.nd
    115 	}
    116 
    117 	// optional exponent moves decimal point.
    118 	// if we read a very large, very long number,
    119 	// just be sure to move the decimal point by
    120 	// a lot (say, 100000).  it doesn't matter if it's
    121 	// not the exact number.
    122 	if i < len(s) && (s[i] == 'e' || s[i] == 'E') {
    123 		i++
    124 		if i >= len(s) {
    125 			return
    126 		}
    127 		esign := 1
    128 		if s[i] == '+' {
    129 			i++
    130 		} else if s[i] == '-' {
    131 			i++
    132 			esign = -1
    133 		}
    134 		if i >= len(s) || s[i] < '0' || s[i] > '9' {
    135 			return
    136 		}
    137 		e := 0
    138 		for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
    139 			if e < 10000 {
    140 				e = e*10 + int(s[i]) - '0'
    141 			}
    142 		}
    143 		b.dp += e * esign
    144 	}
    145 
    146 	if i != len(s) {
    147 		return
    148 	}
    149 
    150 	ok = true
    151 	return
    152 }
    153 
    154 // readFloat reads a decimal mantissa and exponent from a float
    155 // string representation. It sets ok to false if the number could
    156 // not fit return types or is invalid.
    157 func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) {
    158 	const uint64digits = 19
    159 	i := 0
    160 
    161 	// optional sign
    162 	if i >= len(s) {
    163 		return
    164 	}
    165 	switch {
    166 	case s[i] == '+':
    167 		i++
    168 	case s[i] == '-':
    169 		neg = true
    170 		i++
    171 	}
    172 
    173 	// digits
    174 	sawdot := false
    175 	sawdigits := false
    176 	nd := 0
    177 	ndMant := 0
    178 	dp := 0
    179 	for ; i < len(s); i++ {
    180 		switch c := s[i]; true {
    181 		case c == '.':
    182 			if sawdot {
    183 				return
    184 			}
    185 			sawdot = true
    186 			dp = nd
    187 			continue
    188 
    189 		case '0' <= c && c <= '9':
    190 			sawdigits = true
    191 			if c == '0' && nd == 0 { // ignore leading zeros
    192 				dp--
    193 				continue
    194 			}
    195 			nd++
    196 			if ndMant < uint64digits {
    197 				mantissa *= 10
    198 				mantissa += uint64(c - '0')
    199 				ndMant++
    200 			} else if s[i] != '0' {
    201 				trunc = true
    202 			}
    203 			continue
    204 		}
    205 		break
    206 	}
    207 	if !sawdigits {
    208 		return
    209 	}
    210 	if !sawdot {
    211 		dp = nd
    212 	}
    213 
    214 	// optional exponent moves decimal point.
    215 	// if we read a very large, very long number,
    216 	// just be sure to move the decimal point by
    217 	// a lot (say, 100000).  it doesn't matter if it's
    218 	// not the exact number.
    219 	if i < len(s) && (s[i] == 'e' || s[i] == 'E') {
    220 		i++
    221 		if i >= len(s) {
    222 			return
    223 		}
    224 		esign := 1
    225 		if s[i] == '+' {
    226 			i++
    227 		} else if s[i] == '-' {
    228 			i++
    229 			esign = -1
    230 		}
    231 		if i >= len(s) || s[i] < '0' || s[i] > '9' {
    232 			return
    233 		}
    234 		e := 0
    235 		for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
    236 			if e < 10000 {
    237 				e = e*10 + int(s[i]) - '0'
    238 			}
    239 		}
    240 		dp += e * esign
    241 	}
    242 
    243 	if i != len(s) {
    244 		return
    245 	}
    246 
    247 	exp = dp - ndMant
    248 	ok = true
    249 	return
    250 
    251 }
    252 
    253 // decimal power of ten to binary power of two.
    254 var powtab = []int{1, 3, 6, 9, 13, 16, 19, 23, 26}
    255 
    256 func (d *decimal) floatBits(flt *floatInfo) (b uint64, overflow bool) {
    257 	var exp int
    258 	var mant uint64
    259 
    260 	// Zero is always a special case.
    261 	if d.nd == 0 {
    262 		mant = 0
    263 		exp = flt.bias
    264 		goto out
    265 	}
    266 
    267 	// Obvious overflow/underflow.
    268 	// These bounds are for 64-bit floats.
    269 	// Will have to change if we want to support 80-bit floats in the future.
    270 	if d.dp > 310 {
    271 		goto overflow
    272 	}
    273 	if d.dp < -330 {
    274 		// zero
    275 		mant = 0
    276 		exp = flt.bias
    277 		goto out
    278 	}
    279 
    280 	// Scale by powers of two until in range [0.5, 1.0)
    281 	exp = 0
    282 	for d.dp > 0 {
    283 		var n int
    284 		if d.dp >= len(powtab) {
    285 			n = 27
    286 		} else {
    287 			n = powtab[d.dp]
    288 		}
    289 		d.Shift(-n)
    290 		exp += n
    291 	}
    292 	for d.dp < 0 || d.dp == 0 && d.d[0] < '5' {
    293 		var n int
    294 		if -d.dp >= len(powtab) {
    295 			n = 27
    296 		} else {
    297 			n = powtab[-d.dp]
    298 		}
    299 		d.Shift(n)
    300 		exp -= n
    301 	}
    302 
    303 	// Our range is [0.5,1) but floating point range is [1,2).
    304 	exp--
    305 
    306 	// Minimum representable exponent is flt.bias+1.
    307 	// If the exponent is smaller, move it up and
    308 	// adjust d accordingly.
    309 	if exp < flt.bias+1 {
    310 		n := flt.bias + 1 - exp
    311 		d.Shift(-n)
    312 		exp += n
    313 	}
    314 
    315 	if exp-flt.bias >= 1<<flt.expbits-1 {
    316 		goto overflow
    317 	}
    318 
    319 	// Extract 1+flt.mantbits bits.
    320 	d.Shift(int(1 + flt.mantbits))
    321 	mant = d.RoundedInteger()
    322 
    323 	// Rounding might have added a bit; shift down.
    324 	if mant == 2<<flt.mantbits {
    325 		mant >>= 1
    326 		exp++
    327 		if exp-flt.bias >= 1<<flt.expbits-1 {
    328 			goto overflow
    329 		}
    330 	}
    331 
    332 	// Denormalized?
    333 	if mant&(1<<flt.mantbits) == 0 {
    334 		exp = flt.bias
    335 	}
    336 	goto out
    337 
    338 overflow:
    339 	// Inf
    340 	mant = 0
    341 	exp = 1<<flt.expbits - 1 + flt.bias
    342 	overflow = true
    343 
    344 out:
    345 	// Assemble bits.
    346 	bits := mant & (uint64(1)<<flt.mantbits - 1)
    347 	bits |= uint64((exp-flt.bias)&(1<<flt.expbits-1)) << flt.mantbits
    348 	if d.neg {
    349 		bits |= 1 << flt.mantbits << flt.expbits
    350 	}
    351 	return bits, overflow
    352 }
    353 
    354 // Exact powers of 10.
    355 var float64pow10 = []float64{
    356 	1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
    357 	1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
    358 	1e20, 1e21, 1e22,
    359 }
    360 var float32pow10 = []float32{1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10}
    361 
    362 // If possible to convert decimal representation to 64-bit float f exactly,
    363 // entirely in floating-point math, do so, avoiding the expense of decimalToFloatBits.
    364 // Three common cases:
    365 //	value is exact integer
    366 //	value is exact integer * exact power of ten
    367 //	value is exact integer / exact power of ten
    368 // These all produce potentially inexact but correctly rounded answers.
    369 func atof64exact(mantissa uint64, exp int, neg bool) (f float64, ok bool) {
    370 	if mantissa>>float64info.mantbits != 0 {
    371 		return
    372 	}
    373 	f = float64(mantissa)
    374 	if neg {
    375 		f = -f
    376 	}
    377 	switch {
    378 	case exp == 0:
    379 		// an integer.
    380 		return f, true
    381 	// Exact integers are <= 10^15.
    382 	// Exact powers of ten are <= 10^22.
    383 	case exp > 0 && exp <= 15+22: // int * 10^k
    384 		// If exponent is big but number of digits is not,
    385 		// can move a few zeros into the integer part.
    386 		if exp > 22 {
    387 			f *= float64pow10[exp-22]
    388 			exp = 22
    389 		}
    390 		if f > 1e15 || f < -1e15 {
    391 			// the exponent was really too large.
    392 			return
    393 		}
    394 		return f * float64pow10[exp], true
    395 	case exp < 0 && exp >= -22: // int / 10^k
    396 		return f / float64pow10[-exp], true
    397 	}
    398 	return
    399 }
    400 
    401 // If possible to compute mantissa*10^exp to 32-bit float f exactly,
    402 // entirely in floating-point math, do so, avoiding the machinery above.
    403 func atof32exact(mantissa uint64, exp int, neg bool) (f float32, ok bool) {
    404 	if mantissa>>float32info.mantbits != 0 {
    405 		return
    406 	}
    407 	f = float32(mantissa)
    408 	if neg {
    409 		f = -f
    410 	}
    411 	switch {
    412 	case exp == 0:
    413 		return f, true
    414 	// Exact integers are <= 10^7.
    415 	// Exact powers of ten are <= 10^10.
    416 	case exp > 0 && exp <= 7+10: // int * 10^k
    417 		// If exponent is big but number of digits is not,
    418 		// can move a few zeros into the integer part.
    419 		if exp > 10 {
    420 			f *= float32pow10[exp-10]
    421 			exp = 10
    422 		}
    423 		if f > 1e7 || f < -1e7 {
    424 			// the exponent was really too large.
    425 			return
    426 		}
    427 		return f * float32pow10[exp], true
    428 	case exp < 0 && exp >= -10: // int / 10^k
    429 		return f / float32pow10[-exp], true
    430 	}
    431 	return
    432 }
    433 
    434 const fnParseFloat = "ParseFloat"
    435 
    436 func atof32(s string) (f float32, err error) {
    437 	if val, ok := special(s); ok {
    438 		return float32(val), nil
    439 	}
    440 
    441 	if optimize {
    442 		// Parse mantissa and exponent.
    443 		mantissa, exp, neg, trunc, ok := readFloat(s)
    444 		if ok {
    445 			// Try pure floating-point arithmetic conversion.
    446 			if !trunc {
    447 				if f, ok := atof32exact(mantissa, exp, neg); ok {
    448 					return f, nil
    449 				}
    450 			}
    451 			// Try another fast path.
    452 			ext := new(extFloat)
    453 			if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float32info); ok {
    454 				b, ovf := ext.floatBits(&float32info)
    455 				f = math.Float32frombits(uint32(b))
    456 				if ovf {
    457 					err = rangeError(fnParseFloat, s)
    458 				}
    459 				return f, err
    460 			}
    461 		}
    462 	}
    463 	var d decimal
    464 	if !d.set(s) {
    465 		return 0, syntaxError(fnParseFloat, s)
    466 	}
    467 	b, ovf := d.floatBits(&float32info)
    468 	f = math.Float32frombits(uint32(b))
    469 	if ovf {
    470 		err = rangeError(fnParseFloat, s)
    471 	}
    472 	return f, err
    473 }
    474 
    475 func atof64(s string) (f float64, err error) {
    476 	if val, ok := special(s); ok {
    477 		return val, nil
    478 	}
    479 
    480 	if optimize {
    481 		// Parse mantissa and exponent.
    482 		mantissa, exp, neg, trunc, ok := readFloat(s)
    483 		if ok {
    484 			// Try pure floating-point arithmetic conversion.
    485 			if !trunc {
    486 				if f, ok := atof64exact(mantissa, exp, neg); ok {
    487 					return f, nil
    488 				}
    489 			}
    490 			// Try another fast path.
    491 			ext := new(extFloat)
    492 			if ok := ext.AssignDecimal(mantissa, exp, neg, trunc, &float64info); ok {
    493 				b, ovf := ext.floatBits(&float64info)
    494 				f = math.Float64frombits(b)
    495 				if ovf {
    496 					err = rangeError(fnParseFloat, s)
    497 				}
    498 				return f, err
    499 			}
    500 		}
    501 	}
    502 	var d decimal
    503 	if !d.set(s) {
    504 		return 0, syntaxError(fnParseFloat, s)
    505 	}
    506 	b, ovf := d.floatBits(&float64info)
    507 	f = math.Float64frombits(b)
    508 	if ovf {
    509 		err = rangeError(fnParseFloat, s)
    510 	}
    511 	return f, err
    512 }
    513 
    514 // ParseFloat converts the string s to a floating-point number
    515 // with the precision specified by bitSize: 32 for float32, or 64 for float64.
    516 // When bitSize=32, the result still has type float64, but it will be
    517 // convertible to float32 without changing its value.
    518 //
    519 // If s is well-formed and near a valid floating point number,
    520 // ParseFloat returns the nearest floating point number rounded
    521 // using IEEE754 unbiased rounding.
    522 //
    523 // The errors that ParseFloat returns have concrete type *NumError
    524 // and include err.Num = s.
    525 //
    526 // If s is not syntactically well-formed, ParseFloat returns err.Err = ErrSyntax.
    527 //
    528 // If s is syntactically well-formed but is more than 1/2 ULP
    529 // away from the largest floating point number of the given size,
    530 // ParseFloat returns f = Inf, err.Err = ErrRange.
    531 func ParseFloat(s string, bitSize int) (f float64, err error) {
    532 	if bitSize == 32 {
    533 		f1, err1 := atof32(s)
    534 		return float64(f1), err1
    535 	}
    536 	f1, err1 := atof64(s)
    537 	return f1, err1
    538 }
    539