Decimal128 Decimal128::logarithm(const Decimal128& other, RoundingMode roundMode) const { std::uint32_t throwAwayFlag = 0; if (other.isEqual(Decimal128(2))) { BID_UINT128 current = decimal128ToLibraryType(_value); current = bid128_log2(current, roundMode, &throwAwayFlag); return Decimal128{libraryTypeToValue(current)}; } if (other.isEqual(Decimal128(10))) { BID_UINT128 current = decimal128ToLibraryType(_value); current = bid128_log10(current, roundMode, &throwAwayFlag); return Decimal128{libraryTypeToValue(current)}; } return logarithm(other, &throwAwayFlag); }
TEST(Decimal128Test, TestDecimal128DivideSignaling) { Decimal128 d("2"); uint32_t sigFlags = Decimal128::SignalingFlag::kNoFlag; Decimal128 res = d.divide(Decimal128(0), &sigFlags); ASSERT_TRUE(res.isEqual(Decimal128::kPositiveInfinity)); ASSERT_TRUE(Decimal128::hasFlag(sigFlags, Decimal128::SignalingFlag::kDivideByZero)); }
TEST(Decimal128Test, TestDecimal128MultiplySignaling) { Decimal128 d("2"); uint32_t sigFlags = Decimal128::SignalingFlag::kNoFlag; Decimal128 res = d.multiply(Decimal128::kLargestPositive, &sigFlags); ASSERT_TRUE(res.isEqual(Decimal128::kPositiveInfinity)); ASSERT_TRUE(Decimal128::hasFlag(sigFlags, Decimal128::SignalingFlag::kOverflow)); }
TEST(Decimal128Test, TestDecimal128SubtractSignaling) { Decimal128 d = Decimal128::kLargestNegative; uint32_t sigFlags = Decimal128::SignalingFlag::kNoFlag; Decimal128 res = d.subtract(Decimal128(1), &sigFlags); ASSERT_TRUE(res.isEqual(Decimal128::kLargestNegative)); ASSERT_TRUE(Decimal128::hasFlag(sigFlags, Decimal128::SignalingFlag::kInexact)); }
bool InternalSchemaFmodMatchExpression::matchesSingleElement(const BSONElement& e, MatchDetails* details) const { if (!e.isNumber()) { return false; } std::uint32_t flags = Decimal128::SignalingFlag::kNoFlag; Decimal128 result = e.numberDecimal().modulo(_divisor, &flags); if (flags == Decimal128::SignalingFlag::kNoFlag) { return result.isEqual(_remainder); } return false; }
TEST(Decimal128Test, TestAbsValueNeg) { Decimal128 d(-25); Decimal128 dAbs = d.toAbs(); ASSERT_TRUE(dAbs.isEqual(Decimal128(25))); }
// Tests for absolute value function TEST(Decimal128Test, TestAbsValuePos) { Decimal128 d(25); Decimal128 dAbs = d.toAbs(); ASSERT_TRUE(dAbs.isEqual(d)); }