feat: huge 包新增 Float 实现
This commit is contained in:
parent
7b4d6bc069
commit
af189ab26b
|
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue