TEST(Decimal128Test, TestDecimal128GetLargestPositive) { Decimal128 d = Decimal128::kLargestPositive; uint64_t largestPositiveDecimalHigh64 = 6917508178773903296ull; uint64_t largestPositveDecimalLow64 = 4003012203950112767ull; ASSERT_EQUALS(d.getValue().high64, largestPositiveDecimalHigh64); ASSERT_EQUALS(d.getValue().low64, largestPositveDecimalLow64); }
TEST(Decimal128Test, TestDecimal128GetLargestNegativeExponentZero) { Decimal128 d = Decimal128::kLargestNegativeExponentZero; uint64_t largestNegativeExponentZeroHigh64 = 0ull; uint64_t largestNegativeExponentZeroLow64 = 0ull; ASSERT_EQUALS(d.getValue().high64, largestNegativeExponentZeroHigh64); ASSERT_EQUALS(d.getValue().low64, largestNegativeExponentZeroLow64); }
TEST(Decimal128Test, TestDecimal128GetPosNaN) { Decimal128 d = Decimal128::kPositiveNaN; uint64_t decimalPositiveNaNHigh64 = 8935141660703064064ull; uint64_t decimalPositiveNaNLow64 = 0ull; ASSERT_EQUALS(d.getValue().high64, decimalPositiveNaNHigh64); ASSERT_EQUALS(d.getValue().low64, decimalPositiveNaNLow64); }
TEST(Decimal128Test, TestDecimal128GetPosInfinity) { Decimal128 d = Decimal128::kPositiveInfinity; uint64_t decimalPositiveInfinityHigh64 = 8646911284551352320ull; uint64_t decimalPositiveInfinityLow64 = 0ull; ASSERT_EQUALS(d.getValue().high64, decimalPositiveInfinityHigh64); ASSERT_EQUALS(d.getValue().low64, decimalPositiveInfinityLow64); }
TEST(Decimal128Test, TestDecimal128GetNegInfinity) { Decimal128 d = Decimal128::kNegativeInfinity; uint64_t decimalNegativeInfinityHigh64 = 17870283321406128128ull; uint64_t decimalNegativeInfinityLow64 = 0ull; ASSERT_EQUALS(d.getValue().high64, decimalNegativeInfinityHigh64); ASSERT_EQUALS(d.getValue().low64, decimalNegativeInfinityLow64); }
TEST(Decimal128Test, TestDecimal128GetSmallestNegative) { Decimal128 d = Decimal128::kSmallestNegative; uint64_t smallestNegativeDecimalHigh64 = 9223372036854775808ull; uint64_t smallestNegativeDecimalLow64 = 1ull; ASSERT_EQUALS(d.getValue().high64, smallestNegativeDecimalHigh64); ASSERT_EQUALS(d.getValue().low64, smallestNegativeDecimalLow64); }
TEST(Decimal128Test, TestDecimal128GetLargestNegative) { Decimal128 d = Decimal128::kLargestNegative; uint64_t largestNegativeDecimalHigh64 = 16140880215628679104ull; uint64_t largestNegativeDecimalLow64 = 4003012203950112767ull; ASSERT_EQUALS(d.getValue().high64, largestNegativeDecimalHigh64); ASSERT_EQUALS(d.getValue().low64, largestNegativeDecimalLow64); }
TEST(Decimal128Test, TestDecimal128GetSmallestPositive) { Decimal128 d = Decimal128::kSmallestPositive; uint64_t smallestPositiveDecimalHigh64 = 0ull; uint64_t smallestPositiveDecimalLow64 = 1ull; ASSERT_EQUALS(d.getValue().high64, smallestPositiveDecimalHigh64); ASSERT_EQUALS(d.getValue().low64, smallestPositiveDecimalLow64); }
TEST(Decimal128Test, TestDecimal128GetNegNaN) { Decimal128 d = Decimal128::kNegativeNaN; uint64_t decimalNegativeNaNHigh64 = 18158513697557839872ull; uint64_t decimalNegativeNaNLow64 = 0ull; ASSERT_EQUALS(d.getValue().high64, decimalNegativeNaNHigh64); ASSERT_EQUALS(d.getValue().low64, decimalNegativeNaNLow64); }
TEST(Decimal128Test, TestDecimal128MultiplicationCase1) { Decimal128 d1("25.05E20"); Decimal128 d2("-50.5218E19"); Decimal128 result = d1.multiply(d2); Decimal128 expected("-1.265571090E42"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
TEST(Decimal128Test, TestDecimal128SubtractionCase2) { Decimal128 d1("1.00"); Decimal128 d2("2.000"); Decimal128 result = d1.subtract(d2); Decimal128 expected("-1.000"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
TEST(Decimal128Test, TestDecimal128SubtractionCase1) { Decimal128 d1("25.05E20"); Decimal128 d2("-50.5218E19"); Decimal128 result = d1.subtract(d2); Decimal128 expected("3.010218E21"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
// Tests for Decimal128 math operations TEST(Decimal128Test, TestDecimal128AdditionCase1) { Decimal128 d1("25.05E20"); Decimal128 d2("-50.5218E19"); Decimal128 result = d1.add(d2); Decimal128 expected("1.999782E21"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
TEST(Decimal128Test, TestDecimal128DivisionCase2) { Decimal128 d1("1.00"); Decimal128 d2("2.000"); Decimal128 result = d1.divide(d2); Decimal128 expected("0.5"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
TEST(Decimal128Test, TestDecimal128MultiplicationCase2) { Decimal128 d1("1.00"); Decimal128 d2("2.000"); Decimal128 result = d1.multiply(d2); Decimal128 expected("2.00000"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
TEST(Decimal128Test, TestDecimal128DivisionCase1) { Decimal128 d1("25.05E20"); Decimal128 d2("-50.5218E19"); Decimal128 result = d1.divide(d2); Decimal128 expected("-4.958255644098191275845278671781290"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
TEST(Decimal128Test, TestDecimal128AdditionCase2) { Decimal128 d1("1.00"); Decimal128 d2("2.000"); Decimal128 result = d1.add(d2); Decimal128 expected("3.000"); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
TEST(Decimal128Test, TestDecimal128Quantize) { Decimal128 expected("1.00001"); Decimal128 val("1.000008"); Decimal128 ref("0.00001"); Decimal128 result = val.quantize(ref); ASSERT_EQUALS(result.getValue().low64, expected.getValue().low64); ASSERT_EQUALS(result.getValue().high64, expected.getValue().high64); }
Decimal128 Decimal128::quantize(const Decimal128& reference, std::uint32_t* signalingFlags, RoundingMode roundMode) const { BID_UINT128 current = decimal128ToLibraryType(_value); BID_UINT128 q = decimal128ToLibraryType(reference.getValue()); BID_UINT128 quantizedResult = bid128_quantize(current, q, roundMode, signalingFlags); Decimal128::Value value = libraryTypeToValue(quantizedResult); Decimal128 result(value); return result; }
Decimal128 Decimal128::divide(const Decimal128& other, std::uint32_t* signalingFlags, RoundingMode roundMode) const { BID_UINT128 current = decimal128ToLibraryType(_value); BID_UINT128 divisor = decimal128ToLibraryType(other.getValue()); current = bid128_div(current, divisor, roundMode, signalingFlags); Decimal128::Value value = libraryTypeToValue(current); Decimal128 result(value); return result; }
Decimal128 Decimal128::power(const Decimal128& other, std::uint32_t* signalingFlags, RoundingMode roundMode) const { BID_UINT128 base = decimal128ToLibraryType(_value); BID_UINT128 exp = decimal128ToLibraryType(other.getValue()); BID_UINT128 result; if (this->isEqual(Decimal128(10))) result = bid128_exp10(exp, roundMode, signalingFlags); else if (this->isEqual(Decimal128(2))) result = bid128_exp2(exp, roundMode, signalingFlags); else result = bid128_pow(base, exp, roundMode, signalingFlags); return Decimal128{libraryTypeToValue(result)}.add(kLargestNegativeExponentZero); }
bool Decimal128::isLessEqual(const Decimal128& other) const { std::uint32_t throwAwayFlag = 0; BID_UINT128 current = decimal128ToLibraryType(_value); BID_UINT128 compare = decimal128ToLibraryType(other.getValue()); return bid128_quiet_less_equal(current, compare, &throwAwayFlag); }
Decimal128 Decimal128::modulo(const Decimal128& other, std::uint32_t* signalingFlags) const { BID_UINT128 current = decimal128ToLibraryType(_value); BID_UINT128 divisor = decimal128ToLibraryType(other.getValue()); current = bid128_fmod(current, divisor, signalingFlags); return Decimal128{libraryTypeToValue(current)}; }