diff --git a/librz/util/float/float.c b/librz/util/float/float.c index 5530f81eab..af01b4bc30 100644 --- a/librz/util/float/float.c +++ b/librz/util/float/float.c @@ -1890,7 +1890,11 @@ RZ_API RZ_OWN st32 rz_float_cmp(RZ_NONNULL RzFloat *x, RZ_NONNULL RzFloat *y) { cmp = -cmp; } } else { - cmp = rz_bv_ule(x_bv, y_bv) ? 1 : -1; + if (rz_float_is_zero(x) && rz_float_is_zero(y)) { + cmp = 0; + } else { + cmp = rz_bv_ule(x_bv, y_bv) ? 1 : -1; + } } rz_bv_free(x_bv); diff --git a/test/unit/test_float.c b/test/unit/test_float.c index d70ccbb6fd..552e3ddeeb 100644 --- a/test/unit/test_float.c +++ b/test/unit/test_float.c @@ -910,6 +910,11 @@ bool f32_ieee_cmp_test(void) { mu_assert_true(rz_float_cmp(pinf, a) > 0, "test positive inf"); mu_assert_true(rz_float_cmp(ninf, b) < 0, "test negative inf"); + RzFloat *pzero = rz_float_new_zero(RZ_FLOAT_IEEE754_BIN_32, false); + RzFloat *nzero = rz_float_new_zero(RZ_FLOAT_IEEE754_BIN_32, true); + mu_assert_true(rz_float_cmp(pzero, nzero) == 0, "test positive and negative zero equality"); + mu_assert_true(rz_float_cmp(nzero, pzero) == 0, "test negative and positive zero equality"); + rz_float_free(a); rz_float_free(b); rz_float_free(c); @@ -917,6 +922,8 @@ bool f32_ieee_cmp_test(void) { rz_float_free(e); rz_float_free(pinf); rz_float_free(ninf); + rz_float_free(pzero); + rz_float_free(nzero); mu_end; }