// Copyright 2015 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.

package big

import (
	"bytes"
	"fmt"
	"math"
	"math/bits"
	"strconv"
	"testing"
)

var zero_ float64

func TestFloatSetFloat64String(t *testing.T) {
	inf := math.Inf(0)
	nan := math.NaN()

	for _, test := range []struct {
		s string
		x float64 // NaNs represent invalid inputs
	}{
		// basics
		{"0", 0},
		{"-0", -zero_},
		{"+0", 0},
		{"1", 1},
		{"-1", -1},
		{"+1", 1},
		{"1.234", 1.234},
		{"-1.234", -1.234},
		{"+1.234", 1.234},
		{".1", 0.1},
		{"1.", 1},
		{"+1.", 1},

		// various zeros
		{"0e100", 0},
		{"-0e+100", -zero_},
		{"+0e-100", 0},
		{"0E100", 0},
		{"-0E+100", -zero_},
		{"+0E-100", 0},

		// various decimal exponent formats
		{"1.e10", 1e10},
		{"1e+10", 1e10},
		{"+1e-10", 1e-10},
		{"1E10", 1e10},
		{"1.E+10", 1e10},
		{"+1E-10", 1e-10},

		// infinities
		{"Inf", inf},
		{"+Inf", inf},
		{"-Inf", -inf},
		{"inf", inf},
		{"+inf", inf},
		{"-inf", -inf},

		// invalid numbers
		{"", nan},
		{"-", nan},
		{"0x", nan},
		{"0e", nan},
		{"1.2ef", nan},
		{"2..3", nan},
		{"123..", nan},
		{"infinity", nan},
		{"foobar", nan},

		// invalid underscores
		{"_", nan},
		{"0_", nan},
		{"1__0", nan},
		{"123_.", nan},
		{"123._", nan},
		{"123._4", nan},
		{"1_2.3_4_", nan},
		{"_.123", nan},
		{"_123.456", nan},
		{"10._0", nan},
		{"10.0e_0", nan},
		{"10.0e0_", nan},
		{"0P-0__0", nan},

		// misc decimal values
		{"3.14159265", 3.14159265},
		{"-687436.79457e-245", -687436.79457e-245},
		{"-687436.79457E245", -687436.79457e245},
		{".0000000000000000000000000000000000000001", 1e-40},
		{"+10000000000000000000000000000000000000000e-0", 1e40},

		// decimal mantissa, binary exponent
		{"0p0", 0},
		{"-0p0", -zero_},
		{"1p10", 1 << 10},
		{"1p+10", 1 << 10},
		{"+1p-10", 1.0 / (1 << 10)},
		{"1024p-12", 0.25},
		{"-1p10", -1024},
		{"1.5p1", 3},

		// binary mantissa, decimal exponent
		{"0b0", 0},
		{"-0b0", -zero_},
		{"0b0e+10", 0},
		{"-0b0e-10", -zero_},
		{"0b1010", 10},
		{"0B1010E2", 1000},
		{"0b.1", 0.5},
		{"0b.001", 0.125},
		{"0b.001e3", 125},

		// binary mantissa, binary exponent
		{"0b0p+10", 0},
		{"-0b0p-10", -zero_},
		{"0b.1010p4", 10},
		{"0b1p-1", 0.5},
		{"0b001p-3", 0.125},
		{"0b.001p3", 1},
		{"0b0.01p2", 1},
		{"0b0.01P+2", 1},

		// octal mantissa, decimal exponent
		{"0o0", 0},
		{"-0o0", -zero_},
		{"0o0e+10", 0},
		{"-0o0e-10", -zero_},
		{"0o12", 10},
		{"0O12E2", 1000},
		{"0o.4", 0.5},
		{"0o.01", 0.015625},
		{"0o.01e3", 15.625},

		// octal mantissa, binary exponent
		{"0o0p+10", 0},
		{"-0o0p-10", -zero_},
		{"0o.12p6", 10},
		{"0o4p-3", 0.5},
		{"0o0014p-6", 0.1875},
		{"0o.001p9", 1},
		{"0o0.01p7", 2},
		{"0O0.01P+2", 0.0625},

		// hexadecimal mantissa and exponent
		{"0x0", 0},
		{"-0x0", -zero_},
		{"0x0p+10", 0},
		{"-0x0p-10", -zero_},
		{"0xff", 255},
		{"0X.8p1", 1},
		{"-0X0.00008p16", -0.5},
		{"-0X0.00008P+16", -0.5},
		{"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64},
		{"0x1.fffffffffffffp1023", math.MaxFloat64},

		// underscores
		{"0_0", 0},
		{"1_000.", 1000},
		{"1_2_3.4_5_6", 123.456},
		{"1.0e0_0", 1},
		{"1p+1_0", 1024},
		{"0b_1000", 0x8},
		{"0b_1011_1101", 0xbd},
		{"0x_f0_0d_1eP+0_8", 0xf00d1e00},
	} {
		var x Float
		x.SetPrec(53)
		_, ok := x.SetString(test.s)
		if math.IsNaN(test.x) {
			// test.s is invalid
			if ok {
				t.Errorf("%s: want parse error", test.s)
			}
			continue
		}
		// test.s is valid
		if !ok {
			t.Errorf("%s: got parse error", test.s)
			continue
		}
		f, _ := x.Float64()
		want := new(Float).SetFloat64(test.x)
		if x.Cmp(want) != 0 || x.Signbit() != want.Signbit() {
			t.Errorf("%s: got %v (%v); want %v", test.s, &x, f, test.x)
		}
	}
}

func fdiv(a, b float64) float64 { return a / b }

const (
	below1e23 = 99999999999999974834176
	above1e23 = 100000000000000008388608
)

func TestFloat64Text(t *testing.T) {
	for _, test := range []struct {
		x      float64
		format byte
		prec   int
		want   string
	}{
		{0, 'f', 0, "0"},
		{math.Copysign(0, -1), 'f', 0, "-0"},
		{1, 'f', 0, "1"},
		{-1, 'f', 0, "-1"},

		{0.001, 'e', 0, "1e-03"},
		{0.459, 'e', 0, "5e-01"},
		{1.459, 'e', 0, "1e+00"},
		{2.459, 'e', 1, "2.5e+00"},
		{3.459, 'e', 2, "3.46e+00"},
		{4.459, 'e', 3, "4.459e+00"},
		{5.459, 'e', 4, "5.4590e+00"},

		{0.001, 'f', 0, "0"},
		{0.459, 'f', 0, "0"},
		{1.459, 'f', 0, "1"},
		{2.459, 'f', 1, "2.5"},
		{3.459, 'f', 2, "3.46"},
		{4.459, 'f', 3, "4.459"},
		{5.459, 'f', 4, "5.4590"},

		{0, 'b', 0, "0"},
		{math.Copysign(0, -1), 'b', 0, "-0"},
		{1.0, 'b', 0, "4503599627370496p-52"},
		{-1.0, 'b', 0, "-4503599627370496p-52"},
		{4503599627370496, 'b', 0, "4503599627370496p+0"},

		{0, 'p', 0, "0"},
		{math.Copysign(0, -1), 'p', 0, "-0"},
		{1024.0, 'p', 0, "0x.8p+11"},
		{-1024.0, 'p', 0, "-0x.8p+11"},

		// all test cases below from strconv/ftoa_test.go
		{1, 'e', 5, "1.00000e+00"},
		{1, 'f', 5, "1.00000"},
		{1, 'g', 5, "1"},
		{1, 'g', -1, "1"},
		{20, 'g', -1, "20"},
		{1234567.8, 'g', -1, "1.2345678e+06"},
		{200000, 'g', -1, "200000"},
		{2000000, 'g', -1, "2e+06"},

		// g conversion and zero suppression
		{400, 'g', 2, "4e+02"},
		{40, 'g', 2, "40"},
		{4, 'g', 2, "4"},
		{.4, 'g', 2, "0.4"},
		{.04, 'g', 2, "0.04"},
		{.004, 'g', 2, "0.004"},
		{.0004, 'g', 2, "0.0004"},
		{.00004, 'g', 2, "4e-05"},
		{.000004, 'g', 2, "4e-06"},

		{0, 'e', 5, "0.00000e+00"},
		{0, 'f', 5, "0.00000"},
		{0, 'g', 5, "0"},
		{0, 'g', -1, "0"},

		{-1, 'e', 5, "-1.00000e+00"},
		{-1, 'f', 5, "-1.00000"},
		{-1, 'g', 5, "-1"},
		{-1, 'g', -1, "-1"},

		{12, 'e', 5, "1.20000e+01"},
		{12, 'f', 5, "12.00000"},
		{12, 'g', 5, "12"},
		{12, 'g', -1, "12"},

		{123456700, 'e', 5, "1.23457e+08"},
		{123456700, 'f', 5, "123456700.00000"},
		{123456700, 'g', 5, "1.2346e+08"},
		{123456700, 'g', -1, "1.234567e+08"},

		{1.2345e6, 'e', 5, "1.23450e+06"},
		{1.2345e6, 'f', 5, "1234500.00000"},
		{1.2345e6, 'g', 5, "1.2345e+06"},

		{1e23, 'e', 17, "9.99999999999999916e+22"},
		{1e23, 'f', 17, "99999999999999991611392.00000000000000000"},
		{1e23, 'g', 17, "9.9999999999999992e+22"},

		{1e23, 'e', -1, "1e+23"},
		{1e23, 'f', -1, "100000000000000000000000"},
		{1e23, 'g', -1, "1e+23"},

		{below1e23, 'e', 17, "9.99999999999999748e+22"},
		{below1e23, 'f', 17, "99999999999999974834176.00000000000000000"},
		{below1e23, 'g', 17, "9.9999999999999975e+22"},

		{below1e23, 'e', -1, "9.999999999999997e+22"},
		{below1e23, 'f', -1, "99999999999999970000000"},
		{below1e23, 'g', -1, "9.999999999999997e+22"},

		{above1e23, 'e', 17, "1.00000000000000008e+23"},
		{above1e23, 'f', 17, "100000000000000008388608.00000000000000000"},
		{above1e23, 'g', 17, "1.0000000000000001e+23"},

		{above1e23, 'e', -1, "1.0000000000000001e+23"},
		{above1e23, 'f', -1, "100000000000000010000000"},
		{above1e23, 'g', -1, "1.0000000000000001e+23"},

		{5e-304 / 1e20, 'g', -1, "5e-324"},
		{-5e-304 / 1e20, 'g', -1, "-5e-324"},
		{fdiv(5e-304, 1e20), 'g', -1, "5e-324"},   // avoid constant arithmetic
		{fdiv(-5e-304, 1e20), 'g', -1, "-5e-324"}, // avoid constant arithmetic

		{32, 'g', -1, "32"},
		{32, 'g', 0, "3e+01"},

		{100, 'x', -1, "0x1.9p+06"},

		// {math.NaN(), 'g', -1, "NaN"},  // Float doesn't support NaNs
		// {-math.NaN(), 'g', -1, "NaN"}, // Float doesn't support NaNs
		{math.Inf(0), 'g', -1, "+Inf"},
		{math.Inf(-1), 'g', -1, "-Inf"},
		{-math.Inf(0), 'g', -1, "-Inf"},

		{-1, 'b', -1, "-4503599627370496p-52"},

		// fixed bugs
		{0.9, 'f', 1, "0.9"},
		{0.09, 'f', 1, "0.1"},
		{0.0999, 'f', 1, "0.1"},
		{0.05, 'f', 1, "0.1"},
		{0.05, 'f', 0, "0"},
		{0.5, 'f', 1, "0.5"},
		{0.5, 'f', 0, "0"},
		{1.5, 'f', 0, "2"},

		// https://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
		{2.2250738585072012e-308, 'g', -1, "2.2250738585072014e-308"},
		// https://www.exploringbinary.com/php-hangs-on-numeric-value-2-2250738585072011e-308/
		{2.2250738585072011e-308, 'g', -1, "2.225073858507201e-308"},

		// Issue 2625.
		{383260575764816448, 'f', 0, "383260575764816448"},
		{383260575764816448, 'g', -1, "3.8326057576481645e+17"},

		// Issue 15918.
		{1, 'f', -10, "1"},
		{1, 'f', -11, "1"},
		{1, 'f', -12, "1"},
	} {
		// The test cases are from the strconv package which tests float64 values.
		// When formatting values with prec = -1 (shortest representation),
		// the actually available mantissa precision matters.
		// For denormalized values, that precision is < 53 (SetFloat64 default).
		// Compute and set the actual precision explicitly.
		f := new(Float).SetPrec(actualPrec(test.x)).SetFloat64(test.x)
		got := f.Text(test.format, test.prec)
		if got != test.want {
			t.Errorf("%v: got %s; want %s", test, got, test.want)
			continue
		}

		if test.format == 'b' && test.x == 0 {
			continue // 'b' format in strconv.Float requires knowledge of bias for 0.0
		}
		if test.format == 'p' {
			continue // 'p' format not supported in strconv.Format
		}

		// verify that Float format matches strconv format
		want := strconv.FormatFloat(test.x, test.format, test.prec, 64)
		if got != want {
			t.Errorf("%v: got %s; want %s (strconv)", test, got, want)
		}
	}
}

// actualPrec returns the number of actually used mantissa bits.
func actualPrec(x float64) uint {
	if mant := math.Float64bits(x); x != 0 && mant&(0x7ff<<52) == 0 {
		// x is denormalized
		return 64 - uint(bits.LeadingZeros64(mant&(1<<52-1)))
	}
	return 53
}

func TestRoundShortestNormal(t *testing.T) {
	// See go.dev/issue/80206.
	text := func(x float64) string {
		return new(Float).SetPrec(53).SetFloat64(x).Text('g', -1)
	}
	for _, x := range []float64{
		4.3749999999999917e+17,
		4.9999999999999917e+17,
		4.7619047619047597e+17,
		3.7499999999999917e+17,
		1.9047619047619039e+18,
		1.1138394197049199e+18, // m='9' at trimmed position; guard must reject round-up
	} {
		if got, want := text(x), strconv.FormatFloat(x, 'g', -1, 64); got != want {
			t.Errorf("got %s, want %s", got, want)
		}
	}
}

func TestFloatText(t *testing.T) {
	const defaultRound = ^RoundingMode(0)

	for _, test := range []struct {
		x      string
		round  RoundingMode
		prec   uint
		format byte
		digits int
		want   string
	}{
		{"0", defaultRound, 10, 'f', 0, "0"},
		{"-0", defaultRound, 10, 'f', 0, "-0"},
		{"1", defaultRound, 10, 'f', 0, "1"},
		{"-1", defaultRound, 10, 'f', 0, "-1"},

		{"1.459", defaultRound, 100, 'e', 0, "1e+00"},
		{"2.459", defaultRound, 100, 'e', 1, "2.5e+00"},
		{"3.459", defaultRound, 100, 'e', 2, "3.46e+00"},
		{"4.459", defaultRound, 100, 'e', 3, "4.459e+00"},
		{"5.459", defaultRound, 100, 'e', 4, "5.4590e+00"},

		{"1.459", defaultRound, 100, 'E', 0, "1E+00"},
		{"2.459", defaultRound, 100, 'E', 1, "2.5E+00"},
		{"3.459", defaultRound, 100, 'E', 2, "3.46E+00"},
		{"4.459", defaultRound, 100, 'E', 3, "4.459E+00"},
		{"5.459", defaultRound, 100, 'E', 4, "5.4590E+00"},

		{"1.459", defaultRound, 100, 'f', 0, "1"},
		{"2.459", defaultRound, 100, 'f', 1, "2.5"},
		{"3.459", defaultRound, 100, 'f', 2, "3.46"},
		{"4.459", defaultRound, 100, 'f', 3, "4.459"},
		{"5.459", defaultRound, 100, 'f', 4, "5.4590"},

		{"1.459", defaultRound, 100, 'g', 0, "1"},
		{"2.459", defaultRound, 100, 'g', 1, "2"},
		{"3.459", defaultRound, 100, 'g', 2, "3.5"},
		{"4.459", defaultRound, 100, 'g', 3, "4.46"},
		{"5.459", defaultRound, 100, 'g', 4, "5.459"},

		{"1459", defaultRound, 53, 'g', 0, "1e+03"},
		{"2459", defaultRound, 53, 'g', 1, "2e+03"},
		{"3459", defaultRound, 53, 'g', 2, "3.5e+03"},
		{"4459", defaultRound, 53, 'g', 3, "4.46e+03"},
		{"5459", defaultRound, 53, 'g', 4, "5459"},

		{"1459", defaultRound, 53, 'G', 0, "1E+03"},
		{"2459", defaultRound, 53, 'G', 1, "2E+03"},
		{"3459", defaultRound, 53, 'G', 2, "3.5E+03"},
		{"4459", defaultRound, 53, 'G', 3, "4.46E+03"},
		{"5459", defaultRound, 53, 'G', 4, "5459"},

		{"3", defaultRound, 10, 'e', 40, "3.0000000000000000000000000000000000000000e+00"},
		{"3", defaultRound, 10, 'f', 40, "3.0000000000000000000000000000000000000000"},
		{"3", defaultRound, 10, 'g', 40, "3"},

		{"3e40", defaultRound, 100, 'e', 40, "3.0000000000000000000000000000000000000000e+40"},
		{"3e40", defaultRound, 100, 'f', 4, "30000000000000000000000000000000000000000.0000"},
		{"3e40", defaultRound, 100, 'g', 40, "3e+40"},

		// make sure "stupid" exponents don't stall the machine
		{"1e1000000", defaultRound, 64, 'p', 0, "0x.88b3a28a05eade3ap+3321929"},
		{"1e646456992", defaultRound, 64, 'p', 0, "0x.e883a0c5c8c7c42ap+2147483644"},
		{"1e646456993", defaultRound, 64, 'p', 0, "+Inf"},
		{"1e1000000000", defaultRound, 64, 'p', 0, "+Inf"},
		{"1e-1000000", defaultRound, 64, 'p', 0, "0x.efb4542cc8ca418ap-3321928"},
		{"1e-646456993", defaultRound, 64, 'p', 0, "0x.e17c8956983d9d59p-2147483647"},
		{"1e-646456994", defaultRound, 64, 'p', 0, "0"},
		{"1e-1000000000", defaultRound, 64, 'p', 0, "0"},

		// minimum and maximum values
		{"1p2147483646", defaultRound, 64, 'p', 0, "0x.8p+2147483647"},
		{"0x.8p2147483647", defaultRound, 64, 'p', 0, "0x.8p+2147483647"},
		{"0x.8p-2147483647", defaultRound, 64, 'p', 0, "0x.8p-2147483647"},
		{"1p-2147483649", defaultRound, 64, 'p', 0, "0x.8p-2147483648"},

		// TODO(gri) need tests for actual large Floats

		{"0", defaultRound, 53, 'b', 0, "0"},
		{"-0", defaultRound, 53, 'b', 0, "-0"},
		{"1.0", defaultRound, 53, 'b', 0, "4503599627370496p-52"},
		{"-1.0", defaultRound, 53, 'b', 0, "-4503599627370496p-52"},
		{"4503599627370496", defaultRound, 53, 'b', 0, "4503599627370496p+0"},

		// issue 9939
		{"3", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
		{"03", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
		{"3.", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
		{"3.0", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
		{"3.00", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},
		{"3.000", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"},

		{"3", defaultRound, 350, 'p', 0, "0x.cp+2"},
		{"03", defaultRound, 350, 'p', 0, "0x.cp+2"},
		{"3.", defaultRound, 350, 'p', 0, "0x.cp+2"},
		{"3.0", defaultRound, 350, 'p', 0, "0x.cp+2"},
		{"3.00", defaultRound, 350, 'p', 0, "0x.cp+2"},
		{"3.000", defaultRound, 350, 'p', 0, "0x.cp+2"},

		{"0", defaultRound, 64, 'p', 0, "0"},
		{"-0", defaultRound, 64, 'p', 0, "-0"},
		{"1024.0", defaultRound, 64, 'p', 0, "0x.8p+11"},
		{"-1024.0", defaultRound, 64, 'p', 0, "-0x.8p+11"},

		{"0", defaultRound, 64, 'x', -1, "0x0p+00"},
		{"0", defaultRound, 64, 'x', 0, "0x0p+00"},
		{"0", defaultRound, 64, 'x', 1, "0x0.0p+00"},
		{"0", defaultRound, 64, 'x', 5, "0x0.00000p+00"},
		{"3.25", defaultRound, 64, 'x', 0, "0x1p+02"},
		{"-3.25", defaultRound, 64, 'x', 0, "-0x1p+02"},
		{"3.25", defaultRound, 64, 'x', 1, "0x1.ap+01"},
		{"-3.25", defaultRound, 64, 'x', 1, "-0x1.ap+01"},
		{"3.25", defaultRound, 64, 'x', -1, "0x1.ap+01"},
		{"-3.25", defaultRound, 64, 'x', -1, "-0x1.ap+01"},
		{"1024.0", defaultRound, 64, 'x', 0, "0x1p+10"},
		{"-1024.0", defaultRound, 64, 'x', 0, "-0x1p+10"},
		{"1024.0", defaultRound, 64, 'x', 5, "0x1.00000p+10"},
		{"8191.0", defaultRound, 53, 'x', -1, "0x1.fffp+12"},
		{"8191.5", defaultRound, 53, 'x', -1, "0x1.fff8p+12"},
		{"8191.53125", defaultRound, 53, 'x', -1, "0x1.fff88p+12"},
		{"8191.53125", defaultRound, 53, 'x', 4, "0x1.fff8p+12"},
		{"8191.53125", defaultRound, 53, 'x', 3, "0x1.000p+13"},
		{"8191.53125", defaultRound, 53, 'x', 0, "0x1p+13"},
		{"8191.533203125", defaultRound, 53, 'x', -1, "0x1.fff888p+12"},
		{"8191.533203125", defaultRound, 53, 'x', 5, "0x1.fff88p+12"},
		{"8191.533203125", defaultRound, 53, 'x', 4, "0x1.fff9p+12"},

		{"8191.53125", defaultRound, 53, 'x', -1, "0x1.fff88p+12"},
		{"8191.53125", ToNearestEven, 53, 'x', 5, "0x1.fff88p+12"},
		{"8191.53125", ToNearestAway, 53, 'x', 5, "0x1.fff88p+12"},
		{"8191.53125", ToZero, 53, 'x', 5, "0x1.fff88p+12"},
		{"8191.53125", AwayFromZero, 53, 'x', 5, "0x1.fff88p+12"},
		{"8191.53125", ToNegativeInf, 53, 'x', 5, "0x1.fff88p+12"},
		{"8191.53125", ToPositiveInf, 53, 'x', 5, "0x1.fff88p+12"},

		{"8191.53125", defaultRound, 53, 'x', 4, "0x1.fff8p+12"},
		{"8191.53125", defaultRound, 53, 'x', 3, "0x1.000p+13"},
		{"8191.53125", defaultRound, 53, 'x', 0, "0x1p+13"},
		{"8191.533203125", defaultRound, 53, 'x', -1, "0x1.fff888p+12"},
		{"8191.533203125", defaultRound, 53, 'x', 6, "0x1.fff888p+12"},
		{"8191.533203125", defaultRound, 53, 'x', 5, "0x1.fff88p+12"},
		{"8191.533203125", defaultRound, 53, 'x', 4, "0x1.fff9p+12"},

		{"8191.53125", ToNearestEven, 53, 'x', 4, "0x1.fff8p+12"},
		{"8191.53125", ToNearestAway, 53, 'x', 4, "0x1.fff9p+12"},
		{"8191.53125", ToZero, 53, 'x', 4, "0x1.fff8p+12"},
		{"8191.53125", ToZero, 53, 'x', 2, "0x1.ffp+12"},
		{"8191.53125", AwayFromZero, 53, 'x', 4, "0x1.fff9p+12"},
		{"8191.53125", ToNegativeInf, 53, 'x', 4, "0x1.fff8p+12"},
		{"-8191.53125", ToNegativeInf, 53, 'x', 4, "-0x1.fff9p+12"},
		{"8191.53125", ToPositiveInf, 53, 'x', 4, "0x1.fff9p+12"},
		{"-8191.53125", ToPositiveInf, 53, 'x', 4, "-0x1.fff8p+12"},

		// issue 34343
		{"0x.8p-2147483648", ToNearestEven, 4, 'p', -1, "0x.8p-2147483648"},
		{"0x.8p-2147483648", ToNearestEven, 4, 'x', -1, "0x1p-2147483649"},
	} {
		f, _, err := ParseFloat(test.x, 0, test.prec, ToNearestEven)
		if err != nil {
			t.Errorf("%v: %s", test, err)
			continue
		}
		if test.round != defaultRound {
			f.SetMode(test.round)
		}

		got := f.Text(test.format, test.digits)
		if got != test.want {
			t.Errorf("%v: got %s; want %s", test, got, test.want)
		}

		// compare with strconv.FormatFloat output if possible
		// ('p' format is not supported by strconv.FormatFloat,
		// and its output for 0.0 prints a biased exponent value
		// as in 0p-1074 which makes no sense to emulate here)
		if test.prec == 53 && test.format != 'p' && f.Sign() != 0 && (test.round == ToNearestEven || test.round == defaultRound) {
			f64, acc := f.Float64()
			if acc != Exact {
				t.Errorf("%v: expected exact conversion to float64", test)
				continue
			}
			got := strconv.FormatFloat(f64, test.format, test.digits, 64)
			if got != test.want {
				t.Errorf("%v: got %s; want %s", test, got, test.want)
			}
		}
	}
}

func TestFloatFormat(t *testing.T) {
	for _, test := range []struct {
		format string
		value  any // float32, float64, or string (== 512bit *Float)
		want   string
	}{
		// from fmt/fmt_test.go
		{"%+.3e", 0.0, "+0.000e+00"},
		{"%+.3e", 1.0, "+1.000e+00"},
		{"%+.3f", -1.0, "-1.000"},
		{"%+.3F", -1.0, "-1.000"},
		{"%+.3F", float32(-1.0), "-1.000"},
		{"%+07.2f", 1.0, "+001.00"},
		{"%+07.2f", -1.0, "-001.00"},
		{"%+10.2f", +1.0, "     +1.00"},
		{"%+10.2f", -1.0, "     -1.00"},
		{"% .3E", -1.0, "-1.000E+00"},
		{"% .3e", 1.0, " 1.000e+00"},
		{"%+.3g", 0.0, "+0"},
		{"%+.3g", 1.0, "+1"},
		{"%+.3g", -1.0, "-1"},
		{"% .3g", -1.0, "-1"},
		{"% .3g", 1.0, " 1"},
		{"%b", float32(1.0), "8388608p-23"},
		{"%b", 1.0, "4503599627370496p-52"},

		// from fmt/fmt_test.go: old test/fmt_test.go
		{"%e", 1.0, "1.000000e+00"},
		{"%e", 1234.5678e3, "1.234568e+06"},
		{"%e", 1234.5678e-8, "1.234568e-05"},
		{"%e", -7.0, "-7.000000e+00"},
		{"%e", -1e-9, "-1.000000e-09"},
		{"%f", 1234.5678e3, "1234567.800000"},
		{"%f", 1234.5678e-8, "0.000012"},
		{"%f", -7.0, "-7.000000"},
		{"%f", -1e-9, "-0.000000"},
		{"%g", 1234.5678e3, "1.2345678e+06"},
		{"%g", float32(1234.5678e3), "1.2345678e+06"},
		{"%g", 1234.5678e-8, "1.2345678e-05"},
		{"%g", -7.0, "-7"},
		{"%g", -1e-9, "-1e-09"},
		{"%g", float32(-1e-9), "-1e-09"},
		{"%E", 1.0, "1.000000E+00"},
		{"%E", 1234.5678e3, "1.234568E+06"},
		{"%E", 1234.5678e-8, "1.234568E-05"},
		{"%E", -7.0, "-7.000000E+00"},
		{"%E", -1e-9, "-1.000000E-09"},
		{"%G", 1234.5678e3, "1.2345678E+06"},
		{"%G", float32(1234.5678e3), "1.2345678E+06"},
		{"%G", 1234.5678e-8, "1.2345678E-05"},
		{"%G", -7.0, "-7"},
		{"%G", -1e-9, "-1E-09"},
		{"%G", float32(-1e-9), "-1E-09"},

		{"%20.6e", 1.2345e3, "        1.234500e+03"},
		{"%20.6e", 1.2345e-3, "        1.234500e-03"},
		{"%20e", 1.2345e3, "        1.234500e+03"},
		{"%20e", 1.2345e-3, "        1.234500e-03"},
		{"%20.8e", 1.2345e3, "      1.23450000e+03"},
		{"%20f", 1.23456789e3, "         1234.567890"},
		{"%20f", 1.23456789e-3, "            0.001235"},
		{"%20f", 12345678901.23456789, "  12345678901.234568"},
		{"%-20f", 1.23456789e3, "1234.567890         "},
		{"%20.8f", 1.23456789e3, "       1234.56789000"},
		{"%20.8f", 1.23456789e-3, "          0.00123457"},
		{"%g", 1.23456789e3, "1234.56789"},
		{"%g", 1.23456789e-3, "0.00123456789"},
		{"%g", 1.23456789e20, "1.23456789e+20"},
		{"%20e", math.Inf(1), "                +Inf"},
		{"%-20f", math.Inf(-1), "-Inf                "},

		// from fmt/fmt_test.go: comparison of padding rules with C printf
		{"%.2f", 1.0, "1.00"},
		{"%.2f", -1.0, "-1.00"},
		{"% .2f", 1.0, " 1.00"},
		{"% .2f", -1.0, "-1.00"},
		{"%+.2f", 1.0, "+1.00"},
		{"%+.2f", -1.0, "-1.00"},
		{"%7.2f", 1.0, "   1.00"},
		{"%7.2f", -1.0, "  -1.00"},
		{"% 7.2f", 1.0, "   1.00"},
		{"% 7.2f", -1.0, "  -1.00"},
		{"%+7.2f", 1.0, "  +1.00"},
		{"%+7.2f", -1.0, "  -1.00"},
		{"%07.2f", 1.0, "0001.00"},
		{"%07.2f", -1.0, "-001.00"},
		{"% 07.2f", 1.0, " 001.00"},
		{"% 07.2f", -1.0, "-001.00"},
		{"%+07.2f", 1.0, "+001.00"},
		{"%+07.2f", -1.0, "-001.00"},

		// from fmt/fmt_test.go: zero padding does not apply to infinities
		{"%020f", math.Inf(-1), "                -Inf"},
		{"%020f", math.Inf(+1), "                +Inf"},
		{"% 020f", math.Inf(-1), "                -Inf"},
		{"% 020f", math.Inf(+1), "                 Inf"},
		{"%+020f", math.Inf(-1), "                -Inf"},
		{"%+020f", math.Inf(+1), "                +Inf"},
		{"%20f", -1.0, "           -1.000000"},

		// handle %v like %g
		{"%v", 0.0, "0"},
		{"%v", -7.0, "-7"},
		{"%v", -1e-9, "-1e-09"},
		{"%v", float32(-1e-9), "-1e-09"},
		{"%010v", 0.0, "0000000000"},

		// *Float cases
		{"%.20f", "1e-20", "0.00000000000000000001"},
		{"%.20f", "-1e-20", "-0.00000000000000000001"},
		{"%30.20f", "-1e-20", "       -0.00000000000000000001"},
		{"%030.20f", "-1e-20", "-00000000.00000000000000000001"},
		{"%030.20f", "+1e-20", "000000000.00000000000000000001"},
		{"% 030.20f", "+1e-20", " 00000000.00000000000000000001"},

		// erroneous formats
		{"%s", 1.0, "%!s(*big.Float=1)"},
	} {
		value := new(Float)
		switch v := test.value.(type) {
		case float32:
			value.SetPrec(24).SetFloat64(float64(v))
		case float64:
			value.SetPrec(53).SetFloat64(v)
		case string:
			value.SetPrec(512).Parse(v, 0)
		default:
			t.Fatalf("unsupported test value: %v (%T)", v, v)
		}

		if got := fmt.Sprintf(test.format, value); got != test.want {
			t.Errorf("%v: got %q; want %q", test, got, test.want)
		}
	}
}

func BenchmarkParseFloatSmallExp(b *testing.B) {
	for b.Loop() {
		for _, s := range []string{
			"1e0",
			"1e-1",
			"1e-2",
			"1e-3",
			"1e-4",
			"1e-5",
			"1e-10",
			"1e-20",
			"1e-50",
			"1e1",
			"1e2",
			"1e3",
			"1e4",
			"1e5",
			"1e10",
			"1e20",
			"1e50",
		} {
			var x Float
			_, _, err := x.Parse(s, 0)
			if err != nil {
				b.Fatalf("%s: %v", s, err)
			}
		}
	}
}

func BenchmarkParseFloatLargeExp(b *testing.B) {
	for b.Loop() {
		for _, s := range []string{
			"1e0",
			"1e-10",
			"1e-20",
			"1e-30",
			"1e-40",
			"1e-50",
			"1e-100",
			"1e-500",
			"1e-1000",
			"1e-5000",
			"1e-10000",
			"1e10",
			"1e20",
			"1e30",
			"1e40",
			"1e50",
			"1e100",
			"1e500",
			"1e1000",
			"1e5000",
			"1e10000",
		} {
			var x Float
			_, _, err := x.Parse(s, 0)
			if err != nil {
				b.Fatalf("%s: %v", s, err)
			}
		}
	}
}

func TestFloatScan(t *testing.T) {
	floatScanTests := []struct {
		input     string
		format    string
		output    string
		remaining int
		wantErr   bool
	}{
		0: {"10.0", "%f", "10", 0, false},
		1: {"23.98+2.0", "%v", "23.98", 4, false},
		2: {"-1+1", "%v", "-1", 2, false},
		3: {" 00000", "%v", "0", 0, false},
		4: {"-123456p-78", "%b", "-4.084816388e-19", 0, false},
		5: {"+123", "%b", "123", 0, false},
		6: {"-1.234e+56", "%e", "-1.234e+56", 0, false},
		7: {"-1.234E-56", "%E", "-1.234e-56", 0, false},
		8: {"-1.234e+567", "%g", "-1.234e+567", 0, false},
		9: {"+1234567891011.234", "%G", "1.234567891e+12", 0, false},

		// Scan doesn't handle ±Inf.
		10: {"Inf", "%v", "", 3, true},
		11: {"-Inf", "%v", "", 3, true},
		12: {"-Inf", "%v", "", 3, true},
	}

	var buf bytes.Buffer
	for i, test := range floatScanTests {
		x := new(Float)
		buf.Reset()
		buf.WriteString(test.input)
		_, err := fmt.Fscanf(&buf, test.format, x)
		if test.wantErr {
			if err == nil {
				t.Errorf("#%d want non-nil err", i)
			}
			continue
		}

		if err != nil {
			t.Errorf("#%d error: %s", i, err)
		}

		if x.String() != test.output {
			t.Errorf("#%d got %s; want %s", i, x.String(), test.output)
		}
		if buf.Len() != test.remaining {
			t.Errorf("#%d got %d bytes remaining; want %d", i, buf.Len(), test.remaining)
		}
	}
}
