作者:rin0
项目:decnu
// GreaterEqual is true if a >= b.
//
// The status fields of a and b are not checked.
// If you need to check them, you can call a.Error() and b.Error().
//
func (a Quad) GreaterEqual(b Quad) bool {
var result C.uint32_t
result = C.mdq_compare(C.struct_Quad(a), C.struct_Quad(b))
if CmpFlag(result)&(CmpGreater|CmpEqual) != 0 {
return true
}
return false
}
作者:rin0
项目:decnu
// Less is true if a < b.
//
// The status fields of a and b are not checked.
// If you need to check them, you can call a.Error() and b.Error().
//
func (a Quad) Less(b Quad) bool {
var result C.uint32_t
result = C.mdq_compare(C.struct_Quad(a), C.struct_Quad(b))
if CmpFlag(result)&CmpLess != 0 {
return true
}
return false
}
作者:rin0
项目:decnu
// ToInt64 returns the int64 value from a.
// The rounding passed as argument is used, instead of the rounding mode of context which is ignored.
//
// The status field of a is not checked.
// If you need to check the status of a, you can call a.Error().
//
// Note that ToInt64 is slower than ToInt32, because the underlying C decNumber package has no function that converts directly to int64.
// So, the number is first converted to string, and then to int64.
//
func (a Quad) ToInt64(rounding RoundingMode) (int64, error) {
var result C.Ret_int64_t
result = C.mdq_to_int64(C.struct_Quad(a), C.int(rounding))
if Status(result.status)&ErrorMask != 0 {
return 0, newError(Status(result.status))
}
return int64(result.val), nil
}
作者:rin0
项目:decnu
// Round rounds (or truncate) 'a', with RoundHalfEven mode.
//
// n must be in the range [-35...34]. Else, Invalid Operation flag is set, and NaN is returned.
//
func (a Quad) Round(n int32) Quad {
return Quad(C.mdq_roundM(C.struct_Quad(a), C.int32_t(n), C.int(RoundHalfEven)))
}
作者:rin0
项目:decnu
// DivInt returns the integral part of a/b.
//
func (a Quad) DivInt(b Quad) Quad {
return Quad(C.mdq_divide_integer(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// Quantize rounds a to the same pattern as b.
// b is just a model, its sign and coefficient value are ignored. Only its exponent is used.
// The result is the value of a, but with the same exponent as the pattern b.
//
// The representation of a number is:
//
// (-1)^sign coefficient * 10^exponent
// where coefficient is an integer storing 34 digits.
//
// Examples (with RoundHalfEven rounding mode):
// quantization of 134.6454 with 0.00001 is 134.64540
// 134.6454 with 0.00000 is 134.64540 the value of b has no importance
// 134.6454 with 1234.56789 is 134.64540 the value of b has no importance
// 134.6454 with 0.0001 is 134.6454
// 134.6454 with 0.01 is 134.65
// 134.6454 with 1 is 135
// 134.6454 with 1000000000 is 135 the value of b has no importance
// 134.6454 with 1E+2 is 1E+2
//
// 123e32 with 1 sets Invalid_operation error flag in status
// 123e32 with 1E1 is 1230000000000000000000000000000000E1
// 123e32 with 10 sets Invalid_operation error flag in status
//
// See also Round, RoundMode and Truncate methods, which are more useful methods.
//
func (a Quad) Quantize(b Quad, rounding RoundingMode) Quad {
return Quad(C.mdq_quantize(C.struct_Quad(a), C.struct_Quad(b), C.int(rounding)))
}
作者:rin0
项目:decnu
// Abs returns the absolute value of a.
//
func (a Quad) Abs() Quad {
return Quad(C.mdq_abs(C.struct_Quad(a)))
}
作者:rin0
项目:decnu
// Min returns the smaller of a and b.
// If either a or b is NaN then the other argument is the result.
//
func Min(a Quad, b Quad) Quad {
return Quad(C.mdq_min(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// ToIntegral returns the value of a rounded to an integral value.
//
// The representation of a number is:
//
// (-1)^sign coefficient * 10^exponent
// where coefficient is an integer storing 34 digits.
//
// - If exponent < 0, the least significant digits are discarded, so that new exponent becomes 0.
// Internally, it calls Quantize(a, 1E0) with specified rounding.
// - If exponent >= 0, the number remains unchanged.
//
// E.g. 12.345678e2 is 12345678E-4 --> 1235E0
// 123e5 is 123E5 remains 123E5
//
// See also Round, RoundMode and Truncate methods, which are more convenient to use.
//
func (a Quad) ToIntegral(rounding RoundingMode) Quad {
return Quad(C.mdq_to_integral(C.struct_Quad(a), C.int(rounding)))
}
作者:rin0
项目:decnu
// Mod returns the modulo of a and b.
//
func (a Quad) Mod(b Quad) Quad {
return Quad(C.mdq_remainder(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// Max returns the larger of a and b.
// If either a or b is NaN then the other argument is the result.
//
func Max(a Quad, b Quad) Quad {
return Quad(C.mdq_max(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// Div returns a/b.
//
func (a Quad) Div(b Quad) Quad {
return Quad(C.mdq_divide(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// RoundWithMode rounds (or truncate) 'a', with the mode passed as argument.
// You must pass a constant RoundCeiling, RoundHalfEven, etc as argument.
//
// n must be in the range [-35...34]. Else, Invalid Operation flag is set, and NaN is returned.
//
func (a Quad) RoundWithMode(n int32, rounding RoundingMode) Quad {
return Quad(C.mdq_roundM(C.struct_Quad(a), C.int32_t(n), C.int(rounding)))
}
作者:rin0
项目:decnu
// Mul returns a * b.
//
func (a Quad) Mul(b Quad) Quad {
return Quad(C.mdq_multiply(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// Sub returns a - b.
//
func (a Quad) Sub(b Quad) Quad {
return Quad(C.mdq_subtract(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// Add returns a + b.
//
func (a Quad) Add(b Quad) Quad {
return Quad(C.mdq_add(C.struct_Quad(a), C.struct_Quad(b)))
}
作者:rin0
项目:decnu
// Neg returns -a.
//
func (a Quad) Neg() Quad {
return Quad(C.mdq_minus(C.struct_Quad(a)))
}
作者:rin0
项目:decnu
// Truncate truncates 'a'.
// It is like rounding with RoundDown.
//
// n must be in the range [-35...34]. Else, Invalid Operation flag is set, and NaN is returned.
//
func (a Quad) Truncate(n int32) Quad {
return Quad(C.mdq_roundM(C.struct_Quad(a), C.int32_t(n), C.int(RoundDown)))
}