This is an automated email from the ASF dual-hosted git repository.
apitrou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/main by this push:
new be2014a9eb GH-36767: [C++][CI] Fix test failure on i386 (#36769)
be2014a9eb is described below
commit be2014a9ebfb9570b016a5f0beda11022ace45d1
Author: Antoine Pitrou <[email protected]>
AuthorDate: Wed Jul 19 12:32:27 2023 +0200
GH-36767: [C++][CI] Fix test failure on i386 (#36769)
### Rationale for this change
Our nightly build on i386 Debian (a 32-bit x86 build) fails with an error
in decimal-to-read tests:
https://github.com/ursacomputing/crossbow/actions/runs/5593823296/jobs/10227952675#step:6:3255
### What changes are included in this PR?
Improve error messages by displaying the actual and expected values.
A side effect of this error message improvement is to... fix the test
failure, as storing the computation result in a local variable seems to change
the computed absolute difference.
This is probably due to x86 FPU rounding shenanigans, as explained here:
https://stackoverflow.com/questions/37626687/c-fundamentals-double-variable-not-equal-to-double-expression
### Are these changes tested?
Yes.
### Are there any user-facing changes?
No.
* Closes: #36767
Authored-by: Antoine Pitrou <[email protected]>
Signed-off-by: Antoine Pitrou <[email protected]>
---
cpp/src/arrow/util/decimal_test.cc | 33 +++++++++++++++++++++------------
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/cpp/src/arrow/util/decimal_test.cc
b/cpp/src/arrow/util/decimal_test.cc
index 6376a9545a..0a8b7a0973 100644
--- a/cpp/src/arrow/util/decimal_test.cc
+++ b/cpp/src/arrow/util/decimal_test.cc
@@ -1046,42 +1046,51 @@ using ToDoubleTestParam = ToRealTestParam<double>;
template <typename Decimal, typename Real>
void CheckDecimalToReal(const std::string& decimal_value, int32_t scale, Real
expected) {
Decimal dec(decimal_value);
- ASSERT_EQ(dec.template ToReal<Real>(scale), expected)
- << "Decimal value: " << decimal_value << " Scale: " << scale;
+ Real actual = dec.template ToReal<Real>(scale);
+ ASSERT_EQ(actual, expected) << "Decimal value: " << decimal_value
+ << ", scale: " << scale << ", expected: " <<
expected
+ << ", actual: " << actual;
}
template <typename Decimal, typename Real>
void CheckDecimalToRealWithinOneULP(const std::string& decimal_value, int32_t
scale,
Real expected) {
Decimal dec(decimal_value);
- auto result = dec.template ToReal<Real>(scale);
- ASSERT_TRUE(result == expected || result == std::nextafter(expected,
expected + 1) ||
- result == std::nextafter(expected, expected - 1))
- << "Decimal value: " << decimal_value << " Scale: " << scale;
+ Real actual = dec.template ToReal<Real>(scale);
+ ASSERT_TRUE(actual == expected || actual == std::nextafter(expected,
expected + 1) ||
+ actual == std::nextafter(expected, expected - 1))
+ << "Decimal value: " << decimal_value << ", scale: " << scale
+ << ", expected: " << expected << ", actual: " << actual;
}
template <typename Decimal, typename Real>
void CheckDecimalToRealWithinEpsilon(const std::string& decimal_value, int32_t
scale,
Real epsilon, Real expected) {
Decimal dec(decimal_value);
- ASSERT_TRUE(std::abs(dec.template ToReal<Real>(scale) - expected) <= epsilon)
- << "Decimal value: " << decimal_value << " Scale: " << scale;
+ Real actual = dec.template ToReal<Real>(scale);
+ ASSERT_LE(std::abs(actual - expected), epsilon)
+ << "Decimal value: " << decimal_value << ", scale: " << scale
+ << ", expected: " << expected << ", actual: " << actual;
}
template <typename Decimal>
void CheckDecimalToRealApprox(const std::string& decimal_value, int32_t scale,
float expected) {
Decimal dec(decimal_value);
- ASSERT_FLOAT_EQ(dec.template ToReal<float>(scale), expected)
- << "Decimal value: " << decimal_value << " Scale: " << scale;
+ float actual = dec.template ToReal<float>(scale);
+ ASSERT_FLOAT_EQ(actual, expected)
+ << "Decimal value: " << decimal_value << ", scale: " << scale
+ << ", expected: " << expected << ", actual: " << actual;
}
template <typename Decimal>
void CheckDecimalToRealApprox(const std::string& decimal_value, int32_t scale,
double expected) {
Decimal dec(decimal_value);
- ASSERT_DOUBLE_EQ(dec.template ToReal<double>(scale), expected)
- << "Decimal value: " << decimal_value << " Scale: " << scale;
+ double actual = dec.template ToReal<double>(scale);
+ ASSERT_DOUBLE_EQ(actual, expected)
+ << "Decimal value: " << decimal_value << ", scale: " << scale
+ << ", expected: " << expected << ", actual: " << actual;
}
// Common tests for Decimal128::ToReal<T> and Decimal256::ToReal<T>