// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// decimal to binary floating point conversion.
// Algorithm:
//   1) Store input in multiprecision decimal.
//   2) Multiply/divide decimal by powers of two until in range [0.5, 1)
//   3) Multiply by 2^precision and round to get mantissa.

// The strconv package implements conversions to and from
// string representations of basic data types.
package strconv

import (
	"math";
	"os";
	"strconv";
)

var optimize = true	// can change for testing

// TODO(rsc): Better truncation handling.
func stringToDecimal(s string) (neg bool, d *decimal, trunc bool, ok bool) {
	i := 0;

	// optional sign
	if i >= len(s) {
		return;
	}
	switch {
	case s[i] == '+':
		i++;
	case s[i] == '-':
		neg = true;
		i++;
	}

	// digits
	b := new(decimal);
	sawdot := false;
	sawdigits := false;
	for ; i < len(s); i++ {
		switch {
		case s[i] == '.':
			if sawdot {
				return;
			}
			sawdot = true;
			b.dp = b.nd;
			continue;

		case '0' <= s[i] && s[i] <= '9':
			sawdigits = true;
			if s[i] == '0' && b.nd == 0 {	// ignore leading zeros
				b.dp--;
				continue;
			}
			b.d[b.nd] = s[i];
			b.nd++;
			continue;
		}
		break;
	}
	if !sawdigits {
		return;
	}
	if !sawdot {
		b.dp = b.nd;
	}

	// optional exponent moves decimal point.
	// if we read a very large, very long number,
	// just be sure to move the decimal point by
	// a lot (say, 100000).  it doesn't matter if it's
	// not the exact number.
	if i < len(s) && s[i] == 'e' {
		i++;
		if i >= len(s) {
			return;
		}
		esign := 1;
		if s[i] == '+' {
			i++;
		} else if s[i] == '-' {
			i++;
			esign = -1;
		}
		if i >= len(s) || s[i] < '0' || s[i] > '9' {
			return;
		}
		e := 0;
		for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
			if e < 10000 {
				e = e*10 + int(s[i]) - '0';
			}
		}
		b.dp += e*esign;
	}

	if i != len(s) {
		return;
	}

	d = b;
	ok = true;
	return;
}

// decimal power of ten to binary power of two.
var powtab = []int{
	1, 3, 6, 9, 13, 16, 19, 23, 26
}

func decimalToFloatBits(neg bool, d *decimal, trunc bool, flt *floatInfo) (b uint64, overflow bool) {
	var exp int;
	var mant uint64;

	// Zero is always a special case.
	if d.nd == 0 {
		mant = 0;
		exp = flt.bias;
		goto out;
	}

	// Obvious overflow/underflow.
	// These bounds are for 64-bit floats.
	// Will have to change if we want to support 80-bit floats in the future.
	if d.dp > 310 {
		goto overflow;
	}
	if d.dp < -330 {
		// zero
		mant = 0;
		exp = flt.bias;
		goto out;
	}

	// Scale by powers of two until in range [0.5, 1.0)
	exp = 0;
	for d.dp > 0 {
		var n int;
		if d.dp >= len(powtab) {
			n = 27;
		} else {
			n = powtab[d.dp];
		}
		d.Shift(-n);
		exp += n;
	}
	for d.dp < 0 || d.dp == 0 && d.d[0] < '5' {
		var n int;
		if -d.dp >= len(powtab) {
			n = 27;
		} else {
			n = powtab[-d.dp];
		}
		d.Shift(n);
		exp -= n;
	}

	// Our range is [0.5,1) but floating point range is [1,2).
	exp--;

	// Minimum representable exponent is flt.bias+1.
	// If the exponent is smaller, move it up and
	// adjust d accordingly.
	if exp < flt.bias+1 {
		n := flt.bias+1 - exp;
		d.Shift(-n);
		exp += n;
	}

	if exp-flt.bias >= 1<<flt.expbits - 1 {
		goto overflow;
	}

	// Extract 1+flt.mantbits bits.
	mant = d.Shift(int(1+flt.mantbits)).RoundedInteger();

	// Rounding might have added a bit; shift down.
	if mant == 2<<flt.mantbits {
		mant >>= 1;
		exp++;
		if exp-flt.bias >= 1<<flt.expbits - 1 {
			goto overflow;
		}
	}

	// Denormalized?
	if mant&(1<<flt.mantbits) == 0 {
		exp = flt.bias;
	}
	goto out;

overflow:
	// ±Inf
	mant = 0;
	exp = 1<<flt.expbits - 1 + flt.bias;
	overflow = true;

out:
	// Assemble bits.
	bits := mant & (uint64(1)<<flt.mantbits - 1);
	bits |= uint64((exp-flt.bias)&(1<<flt.expbits - 1)) << flt.mantbits;
	if neg {
		bits |= 1<<flt.mantbits<<flt.expbits;
	}
	return bits, overflow;
}

// Compute exact floating-point integer from d's digits.
// Caller is responsible for avoiding overflow.
func decimalAtof64Int(neg bool, d *decimal) float64 {
	f := float64(0);
	for i := 0; i < d.nd; i++ {
		f = f*10 + float64(d.d[i] - '0');
	}
	if neg {
		f *= -1;	// BUG work around 6g f = -f.
	}
	return f;
}

func decimalAtof32Int(neg bool, d *decimal) float32 {
	f := float32(0);
	for i := 0; i < d.nd; i++ {
		f = f*10 + float32(d.d[i] - '0');
	}
	if neg {
		f *= -1;	// BUG work around 6g f = -f.
	}
	return f;
}

// Exact powers of 10.
var float64pow10 = []float64 {
	1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
	1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
	1e20, 1e21, 1e22
}
var float32pow10 = []float32 {
	1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10
}

// If possible to convert decimal d to 64-bit float f exactly,
// entirely in floating-point math, do so, avoiding the expense of decimalToFloatBits.
// Three common cases:
//	value is exact integer
//	value is exact integer * exact power of ten
//	value is exact integer / exact power of ten
// These all produce potentially inexact but correctly rounded answers.
func decimalAtof64(neg bool, d *decimal, trunc bool) (f float64, ok bool) {
	// Exact integers are <= 10^15.
	// Exact powers of ten are <= 10^22.
	if d.nd > 15 {
		return;
	}
	switch {
	case d.dp == d.nd:	// int
		f := decimalAtof64Int(neg, d);
		return f, true;

	case d.dp > d.nd && d.dp <= 15+22:	// int * 10^k
		f := decimalAtof64Int(neg, d);
		k := d.dp - d.nd;
		// If exponent is big but number of digits is not,
		// can move a few zeros into the integer part.
		if k > 22 {
			f *= float64pow10[k-22];
			k = 22;
		}
		return f*float64pow10[k], true;

	case d.dp < d.nd && d.nd - d.dp <= 22:	// int / 10^k
		f := decimalAtof64Int(neg, d);
		return f/float64pow10[d.nd - d.dp], true;
	}
	return;
}

// If possible to convert decimal d to 32-bit float f exactly,
// entirely in floating-point math, do so, avoiding the machinery above.
func decimalAtof32(neg bool, d *decimal, trunc bool) (f float32, ok bool) {
	// Exact integers are <= 10^7.
	// Exact powers of ten are <= 10^10.
	if d.nd > 7 {
		return;
	}
	switch {
	case d.dp == d.nd:	// int
		f := decimalAtof32Int(neg, d);
		return f, true;

	case d.dp > d.nd && d.dp <= 7+10:	// int * 10^k
		f := decimalAtof32Int(neg, d);
		k := d.dp - d.nd;
		// If exponent is big but number of digits is not,
		// can move a few zeros into the integer part.
		if k > 10 {
			f *= float32pow10[k-10];
			k = 10;
		}
		return f*float32pow10[k], true;

	case d.dp < d.nd && d.nd - d.dp <= 10:	// int / 10^k
		f := decimalAtof32Int(neg, d);
		return f/float32pow10[d.nd - d.dp], true;
	}
	return;
}

// Atof32 converts the string s to a 32-bit floating-point number.
//
// If s is well-formed and near a valid floating point number,
// Atof32 returns the nearest floating point number rounded
// using IEEE754 unbiased rounding.
//
// The errors that Atof32 returns have concrete type *NumError
// and include err.Num = s.
//
// If s is not syntactically well-formed, Atof32 returns err.Error = os.EINVAL.
//
// If s is syntactically well-formed but is more than 1/2 ULP
// away from the largest floating point number of the given size,
// Atof32 returns f = ±Inf, err.Error = os.ERANGE.
func Atof32(s string) (f float32, err os.Error) {
	neg, d, trunc, ok := stringToDecimal(s);
	if !ok {
		return 0, &NumError{s, os.EINVAL};
	}
	if optimize {
		if f, ok := decimalAtof32(neg, d, trunc); ok {
			return f, nil;
		}
	}
	b, ovf := decimalToFloatBits(neg, d, trunc, &float32info);
	f = math.Float32frombits(uint32(b));
	if ovf {
		err = &NumError{s, os.ERANGE};
	}
	return f, err
}

// Atof64 converts the string s to a 64-bit floating-point number.
// Except for the type of its result, its definition is the same as that
// of Atof32.
func Atof64(s string) (f float64, err os.Error) {
	neg, d, trunc, ok := stringToDecimal(s);
	if !ok {
		return 0, &NumError{s, os.EINVAL};
	}
	if optimize {
		if f, ok := decimalAtof64(neg, d, trunc); ok {
			return f, nil;
		}
	}
	b, ovf := decimalToFloatBits(neg, d, trunc, &float64info);
	f = math.Float64frombits(b);
	if ovf {
		err = &NumError{s, os.ERANGE};
	}
	return f, err
}

// Atof is like Atof32 or Atof64, depending on the size of float.
func Atof(s string) (f float, err os.Error) {
	if FloatSize == 32 {
		f1, err1 := Atof32(s);
		return float(f1), err1;
	}
	f1, err1 := Atof64(s);
	return float(f1), err1;
}

