From 59d8c998e577aeaef66c83db391a34369efc7c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D9=85=D8=B5=D8=B7=D9=81=D9=8A=20=D9=85=D8=AD=D9=85=D9=88?= =?UTF-8?q?=D8=AF=20=D9=83=D9=85=D8=A7=D9=84=20=D8=A7=D9=84=D8=AF=D9=8A?= =?UTF-8?q?=D9=86?= <48567303+moste00@users.noreply.github.com> Date: Sat, 20 Jun 2026 20:05:18 +0300 Subject: [PATCH] fix positive zero comparing inequal with negative zero, IEEE754 mandates equality --- librz/util/float/float.c | 6 +++++- test/unit/test_float.c | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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; }