// Copyright 2018 The CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

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

//go:generate qgo -exclude= extract math/big

package math

import "math/big"

// Exponent and precision limits.
const (
	MaxExp  = 2147483647  // largest supported exponent
	MinExp  = -2147483648 // smallest supported exponent
	MaxPrec = 4294967295  // largest (theoretically) supported precision; likely memory-limited
)

// These constants define supported rounding modes.
const (
	ToNearestEven = 0 // == IEEE 754-2008 roundTiesToEven
	ToNearestAway = 1 // == IEEE 754-2008 roundTiesToAway
	ToZero        = 2 // == IEEE 754-2008 roundTowardZero
	AwayFromZero  = 3 // no IEEE 754-2008 equivalent
	ToNegativeInf = 4 // == IEEE 754-2008 roundTowardNegative
	ToPositiveInf = 5 // == IEEE 754-2008 roundTowardPositive
)

// Constants describing the Accuracy of a Float.
const (
	Below = -1
	Exact = 0
	Above = 1
)

// Jacobi returns the Jacobi symbol (x/y), either +1, -1, or 0.
// The y argument must be an odd integer.
func Jacobi(x, y *big.Int) int {
	return big.Jacobi(x, y)
}

// MaxBase is the largest number base accepted for string conversions.
const MaxBase = 62
