summaryrefslogtreecommitdiff
path: root/src/mongo/platform
diff options
context:
space:
mode:
authorJames Wahlin <james@mongodb.com>2019-02-14 16:12:50 -0500
committerJames Wahlin <james@mongodb.com>2019-02-20 08:59:01 -0500
commit5aa3f6dbc5e31beaf40e0828f7a24ecf71fb42f9 (patch)
tree6f003bf9b8b6fd2f0144f69e69e69cb7bc6205dd /src/mongo/platform
parent79a050141e79dc267f8723adb48b191652ba9fce (diff)
downloadmongo-5aa3f6dbc5e31beaf40e0828f7a24ecf71fb42f9.tar.gz
SERVER-39487 Decimal128::squareRoot() returns result for Decimal128::exponential()
Diffstat (limited to 'src/mongo/platform')
-rw-r--r--src/mongo/platform/decimal128.cpp30
-rw-r--r--src/mongo/platform/decimal128_test.cpp24
2 files changed, 39 insertions, 15 deletions
diff --git a/src/mongo/platform/decimal128.cpp b/src/mongo/platform/decimal128.cpp
index 9df4185db99..69ef39d593d 100644
--- a/src/mongo/platform/decimal128.cpp
+++ b/src/mongo/platform/decimal128.cpp
@@ -323,7 +323,7 @@ Decimal128 Decimal128::toAbs() const {
Decimal128 Decimal128::acos(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return acos(&throwAwayFlag);
+ return acos(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::acos(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -334,7 +334,7 @@ Decimal128 Decimal128::acos(std::uint32_t* signalingFlags, RoundingMode roundMod
Decimal128 Decimal128::acosh(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return acosh(&throwAwayFlag);
+ return acosh(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::acosh(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -345,7 +345,7 @@ Decimal128 Decimal128::acosh(std::uint32_t* signalingFlags, RoundingMode roundMo
Decimal128 Decimal128::asin(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return asin(&throwAwayFlag);
+ return asin(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::asin(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -356,7 +356,7 @@ Decimal128 Decimal128::asin(std::uint32_t* signalingFlags, RoundingMode roundMod
Decimal128 Decimal128::asinh(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return asinh(&throwAwayFlag);
+ return asinh(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::asinh(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -367,7 +367,7 @@ Decimal128 Decimal128::asinh(std::uint32_t* signalingFlags, RoundingMode roundMo
Decimal128 Decimal128::atan(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return atan(&throwAwayFlag);
+ return atan(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::atan(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -394,7 +394,7 @@ Decimal128 Decimal128::atan2(const Decimal128& other,
Decimal128 Decimal128::atanh(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return atanh(&throwAwayFlag);
+ return atanh(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::atanh(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -405,7 +405,7 @@ Decimal128 Decimal128::atanh(std::uint32_t* signalingFlags, RoundingMode roundMo
Decimal128 Decimal128::cosh(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return cosh(&throwAwayFlag);
+ return cosh(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::cosh(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -416,7 +416,7 @@ Decimal128 Decimal128::cosh(std::uint32_t* signalingFlags, RoundingMode roundMod
Decimal128 Decimal128::cos(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return cos(&throwAwayFlag);
+ return cos(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::cos(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -529,7 +529,7 @@ double Decimal128::toDouble(std::uint32_t* signalingFlags, RoundingMode roundMod
Decimal128 Decimal128::sin(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return sin(&throwAwayFlag);
+ return sin(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::sin(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -540,7 +540,7 @@ Decimal128 Decimal128::sin(std::uint32_t* signalingFlags, RoundingMode roundMode
Decimal128 Decimal128::sinh(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return sinh(&throwAwayFlag);
+ return sinh(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::sinh(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -617,7 +617,7 @@ std::string Decimal128::toString() const {
Decimal128 Decimal128::tanh(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return tanh(&throwAwayFlag);
+ return tanh(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::tanh(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -628,7 +628,7 @@ Decimal128 Decimal128::tanh(std::uint32_t* signalingFlags, RoundingMode roundMod
Decimal128 Decimal128::tan(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return tan(&throwAwayFlag);
+ return tan(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::tan(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -773,7 +773,7 @@ Decimal128 Decimal128::divide(const Decimal128& other,
Decimal128 Decimal128::exponential(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return exponential(&throwAwayFlag);
+ return exponential(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::exponential(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -784,7 +784,7 @@ Decimal128 Decimal128::exponential(std::uint32_t* signalingFlags, RoundingMode r
Decimal128 Decimal128::logarithm(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return logarithm(&throwAwayFlag);
+ return logarithm(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::logarithm(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
@@ -887,7 +887,7 @@ Decimal128 Decimal128::quantize(const Decimal128& reference,
Decimal128 Decimal128::squareRoot(RoundingMode roundMode) const {
std::uint32_t throwAwayFlag = 0;
- return exponential(&throwAwayFlag);
+ return squareRoot(&throwAwayFlag, roundMode);
}
Decimal128 Decimal128::squareRoot(std::uint32_t* signalingFlags, RoundingMode roundMode) const {
diff --git a/src/mongo/platform/decimal128_test.cpp b/src/mongo/platform/decimal128_test.cpp
index 53c415365a3..dfce92f4fb8 100644
--- a/src/mongo/platform/decimal128_test.cpp
+++ b/src/mongo/platform/decimal128_test.cpp
@@ -1413,6 +1413,30 @@ void assertDecimal128ExactlyEqual(Decimal128 x, Decimal128 y) {
ASSERT_EQUALS(x.getValue().low64, y.getValue().low64);
}
+TEST(Decimal128Test, TestExp) {
+ assertDecimal128ApproxEqual(Decimal128("-1").exponential(),
+ Decimal128("0.3678794411714423215955237701614609"));
+ assertDecimal128ApproxEqual(Decimal128("0").exponential(), Decimal128("1"));
+ assertDecimal128ApproxEqual(Decimal128("1").exponential(),
+ Decimal128("2.718281828459045235360287471352662"));
+ assertDecimal128ApproxEqual(Decimal128("1.5").exponential(),
+ Decimal128("4.481689070338064822602055460119276"));
+ assertDecimal128ApproxEqual(Decimal128("1.79769313486231E+308")
+ .exponential(Decimal128::RoundingMode::kRoundTowardNegative),
+ Decimal128("9.999999999999999999999999999999999E+6144"));
+}
+
+TEST(Decimal128Test, TestSqrt) {
+ assertDecimal128ApproxEqual(Decimal128("0").squareRoot(), Decimal128("0"));
+ assertDecimal128ApproxEqual(Decimal128("1").squareRoot(), Decimal128("1"));
+ assertDecimal128ApproxEqual(Decimal128("25").squareRoot(), Decimal128("5"));
+ assertDecimal128ApproxEqual(Decimal128("25.5").squareRoot(),
+ Decimal128("5.049752469181038976681692958534800"));
+ assertDecimal128ApproxEqual(Decimal128("1.79769313486231E+308")
+ .squareRoot(Decimal128::RoundingMode::kRoundTowardNegative),
+ Decimal128("1.340780792994257506864497209340836E+154"));
+}
+
TEST(Decimal128Test, TestAsin) {
assertDecimal128ApproxEqual(Decimal128("-1.0").asin(), Decimal128("-1.57079632679"));
assertDecimal128ApproxEqual(Decimal128("-0.9").asin(), Decimal128("-1.119769515"));