feat: add uint64 surport

This commit is contained in:
guiqiang 2019-01-22 17:59:49 +08:00
parent cd690d0c9e
commit f778328e58
2 changed files with 163 additions and 148 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
.git
*.swp
.idea/

View file

@ -87,6 +87,14 @@ func New(value int64, exp int32) Decimal {
}
}
// NewFromUint64 returns a new Decimal from a uint64, value * 10 ^ exp
func NewFromUint64(value uint64, exp int32) Decimal {
return Decimal{
value: new(big.Int).SetUint64(value),
exp: exp,
}
}
// NewFromBigInt returns a new Decimal from a big.Int, value * 10 ^ exp
func NewFromBigInt(value *big.Int, exp int32) Decimal {
return Decimal{
@ -988,6 +996,12 @@ func (d *Decimal) Scan(value interface{}) error {
*d = New(v, 0)
return nil
case uint64:
// at least in clickhouse when the value is 0 in db, the data is sent
// to us as an uint64 instead of a int64 ...
*d = NewFromUint64(v, 0)
return nil
default:
// default is trying to interpret value stored as string
str, err := unquoteIfQuoted(v)
@ -1261,17 +1275,17 @@ func (d Decimal) satan() Decimal {
}
// sin coefficients
var _sin = [...]Decimal{
var _sin = [...]Decimal{
NewFromFloat(1.58962301576546568060E-10), // 0x3de5d8fd1fd19ccd
NewFromFloat(-2.50507477628578072866E-8), // 0xbe5ae5e5a9291f5d
NewFromFloat(2.75573136213857245213E-6), // 0x3ec71de3567d48a1
NewFromFloat(-1.98412698295895385996E-4), // 0xbf2a01a019bfdf03
NewFromFloat(8.33333333332211858878E-3), // 0x3f8111111110f7d0
NewFromFloat(-1.66666666666666307295E-1), // 0xbfc5555555555548
}
}
// Sin returns the sine of the radian argument x.
func (d Decimal) Sin() Decimal {
func (d Decimal) Sin() Decimal {
PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts
PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000,
PI4C := NewFromFloat(2.69515142907905952645E-15) // 0x3ce8469898cc5170,
@ -1314,20 +1328,20 @@ func (d Decimal) satan() Decimal {
y = y.Neg()
}
return y
}
}
// cos coefficients
var _cos = [...]Decimal{
// cos coefficients
var _cos = [...]Decimal{
NewFromFloat(-1.13585365213876817300E-11), // 0xbda8fa49a0861a9b
NewFromFloat(2.08757008419747316778E-9), // 0x3e21ee9d7b4e3f05
NewFromFloat(-2.75573141792967388112E-7), // 0xbe927e4f7eac4bc6
NewFromFloat(2.48015872888517045348E-5), // 0x3efa01a019c844f5
NewFromFloat(-1.38888888888730564116E-3), // 0xbf56c16c16c14f91
NewFromFloat(4.16666666666665929218E-2), // 0x3fa555555555554b
}
}
// Cos returns the cosine of the radian argument x.
func (d Decimal) Cos() Decimal {
// Cos returns the cosine of the radian argument x.
func (d Decimal) Cos() Decimal {
PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts
PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000,
@ -1371,23 +1385,23 @@ func (d Decimal) satan() Decimal {
y = y.Neg()
}
return y
}
}
var _tanP = [...]Decimal{
var _tanP = [...]Decimal{
NewFromFloat(-1.30936939181383777646E+4), // 0xc0c992d8d24f3f38
NewFromFloat(1.15351664838587416140E+6), // 0x413199eca5fc9ddd
NewFromFloat(-1.79565251976484877988E+7), // 0xc1711fead3299176
}
var _tanQ = [...]Decimal{
}
var _tanQ = [...]Decimal{
NewFromFloat(1.00000000000000000000E+0),
NewFromFloat(1.36812963470692954678E+4), //0x40cab8a5eeb36572
NewFromFloat(-1.32089234440210967447E+6), //0xc13427bc582abc96
NewFromFloat(2.50083801823357915839E+7), //0x4177d98fc2ead8ef
NewFromFloat(-5.38695755929454629881E+7), //0xc189afe03cbe5a31
}
}
// Tan returns the tangent of the radian argument x.
func (d Decimal) Tan() Decimal {
// Tan returns the tangent of the radian argument x.
func (d Decimal) Tan() Decimal {
PI4A := NewFromFloat(7.85398125648498535156E-1) // 0x3fe921fb40000000, Pi/4 split into three parts
PI4B := NewFromFloat(3.77489470793079817668E-8) // 0x3e64442d00000000,
@ -1431,4 +1445,4 @@ func (d Decimal) satan() Decimal {
y = y.Neg()
}
return y
}
}