Skip to content

Commit a5cf124

Browse files
committed
use memcmp
1 parent 0babf9d commit a5cf124

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

quaddtype/numpy_quaddtype/src/casts.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,9 +1234,13 @@ static inline int quad_to_numpy_same_value_check(quad_value x, QuadBackendType b
12341234
*y = from_quad<T>(x, backend);
12351235
quad_value roundtrip = to_quad<T>(*y, backend);
12361236
if(backend == BACKEND_SLEEF) {
1237-
if(Sleef_iunordq1(x.sleef_value, roundtrip.sleef_value))
1237+
// Use memcmp for exact bit-wise comparison to avoid SLEEF comparison function issues
1238+
// on different platforms (especially x86-64 where Sleef_quad may be __float128)
1239+
if (std::memcmp(&x.sleef_value, &roundtrip.sleef_value, sizeof(Sleef_quad)) == 0)
12381240
return 1;
1239-
if(Sleef_icmpeqq1(x.sleef_value, roundtrip.sleef_value))
1241+
// Also check for NaN == NaN case (NaN bits won't match but both are NaN)
1242+
if (Sleef_iunordq1(x.sleef_value, x.sleef_value) &&
1243+
Sleef_iunordq1(roundtrip.sleef_value, roundtrip.sleef_value))
12401244
return 1;
12411245
}
12421246
else {
@@ -1246,7 +1250,6 @@ static inline int quad_to_numpy_same_value_check(quad_value x, QuadBackendType b
12461250
return 1;
12471251
}
12481252
Sleef_quad sleef_val = quad_to_sleef_quad(&x, backend);
1249-
// Sleef_quad sleef_val = x.sleef_value;
12501253
const char *val_str = quad_to_string_adaptive_cstr(&sleef_val, QUAD_STR_WIDTH);
12511254
if (val_str != NULL) {
12521255
PyErr_Format(PyExc_ValueError,

0 commit comments

Comments
 (0)