feat: huge 包新增 Float 实现

This commit is contained in:
kercylan98 2023-12-23 11:38:21 +08:00
parent 7b4d6bc069
commit af189ab26b
1 changed files with 141 additions and 0 deletions

141
utils/huge/float.go Normal file
View File

@ -0,0 +1,141 @@
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
}