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>

Reply via email to