vRp.CD2g_test/utils/huge/float.go

142 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package huge
import (
"github.com/kercylan98/minotaur/utils/generic"
"math/big"
)
var (
FloatNegativeOne = NewFloat(-1.0) // 默认初始化的-1值Float应当将其当作常量使用
FloatZero = NewFloat(0.0) // 默认初始化的0值Float应当将其当作常量使用
FloatOne = NewFloat(1.0) // 默认初始化的1值Float应当将其当作常量使用
FloatTen = NewFloat(10.0) // 默认初始化的10值Float应当将其当作常量使用
FloatHundred = NewFloat(100.0) // 默认初始化的100值Float应当将其当作常量使用
FloatThousand = NewFloat(1000.0) // 默认初始化的1000值Float应当将其当作常量使用
FloatTenThousand = NewFloat(10000.0) // 默认初始化的10000值Float应当将其当作常量使用
)
type Float big.Float
// NewFloat 创建一个 Float
func NewFloat[T generic.Number](x T) *Float {
return (*Float)(big.NewFloat(float64(x)))
}
// NewFloatByString 通过字符串创建一个 Float
// - 如果字符串不是一个合法的数字,则返回 0
func NewFloatByString(i string) *Float {
v, suc := new(big.Float).SetString(i)
if !suc {
return FloatZero.Copy()
}
return (*Float)(v)
}
func (slf *Float) Copy() *Float {
return (*Float)(new(big.Float).Copy(slf.ToBigFloat()))
}
func (slf *Float) Set(i *Float) *Float {
return (*Float)(slf.ToBigFloat().Set(i.ToBigFloat()))
}
func (slf *Float) IsZero() bool {
if slf == nil || slf.EqualTo(FloatZero) {
return true
}
return false
}
func (slf *Float) ToBigFloat() *big.Float {
return (*big.Float)(slf)
}
// Cmp 比较,当 slf > i 时返回 1当 slf < i 时返回 -1当 slf == i 时返回 0
func (slf *Float) Cmp(i *Float) int {
return slf.ToBigFloat().Cmp(i.ToBigFloat())
}
// GreaterThan 大于
func (slf *Float) GreaterThan(i *Float) bool {
return slf.Cmp(i) > 0
}
// GreaterThanOrEqualTo 大于或等于
func (slf *Float) GreaterThanOrEqualTo(i *Float) bool {
return slf.Cmp(i) >= 0
}
// LessThan 小于
func (slf *Float) LessThan(i *Float) bool {
return slf.Cmp(i) < 0
}
// LessThanOrEqualTo 小于或等于
func (slf *Float) LessThanOrEqualTo(i *Float) bool {
return slf.Cmp(i) <= 0
}
// EqualTo 等于
func (slf *Float) EqualTo(i *Float) bool {
return slf.Cmp(i) == 0
}
func (slf *Float) Float64() float64 {
f, _ := slf.ToBigFloat().Float64()
return f
}
func (slf *Float) String() string {
return slf.ToBigFloat().String()
}
func (slf *Float) Add(i *Float) *Float {
x := slf.ToBigFloat()
return (*Float)(x.Add(x, i.ToBigFloat()))
}
func (slf *Float) Sub(i *Float) *Float {
x := slf.ToBigFloat()
return (*Float)(x.Sub(x, i.ToBigFloat()))
}
func (slf *Float) Mul(i *Float) *Float {
x := slf.ToBigFloat()
return (*Float)(x.Mul(x, i.ToBigFloat()))
}
func (slf *Float) Div(i *Float) *Float {
x := slf.ToBigFloat()
return (*Float)(x.Quo(x, i.ToBigFloat()))
}
// Sqrt 平方根
func (slf *Float) Sqrt() *Float {
x := slf.ToBigFloat()
return (*Float)(x.Sqrt(x))
}
// Abs 返回数字的绝对值
func (slf *Float) Abs() *Float {
x := slf.ToBigFloat()
return (*Float)(x.Abs(x))
}
// Sign 返回数字的符号
// - 1正数
// - 0
// - -1负数
func (slf *Float) Sign() int {
return slf.ToBigFloat().Sign()
}
// IsPositive 是否为正数
func (slf *Float) IsPositive() bool {
return slf.Sign() > 0
}
// IsNegative 是否为负数
func (slf *Float) IsNegative() bool {
return slf.Sign() < 0
}