fix positive zero comparing inequal with negative zero, IEEE754 mandates equality

This commit is contained in:
مصطفي محمود كمال الدين 2026-06-20 20:05:18 +03:00 committed by NOT XVilka
parent 9ddf0ab9ab
commit 59d8c998e5
2 changed files with 12 additions and 1 deletions

View file

@ -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);

View file

@ -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;
}