From fef612cec2c717eb808b6beb0621c6e010cdc1d7 Mon Sep 17 00:00:00 2001 From: Intel A80486DX2-66 Date: Sat, 9 Mar 2024 17:48:05 +0300 Subject: [PATCH] opt_int_div.h: extract sign explanation --- c-programming/math/opt_int_div.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/c-programming/math/opt_int_div.h b/c-programming/math/opt_int_div.h index fb6626c..6b3a90c 100644 --- a/c-programming/math/opt_int_div.h +++ b/c-programming/math/opt_int_div.h @@ -20,7 +20,9 @@ // helper functions #define INT_BIN_DIV(a, b) ((a) >> (uintmax_t) log2l((b))) -#define INT_DIV_NEG_RESULT_SIGN(a, b) (((a) < 0) ^ ((b) < 0)) +#define INT_DIV_NEG_RESULT_SIGN(a, b) \ + /* the sign is negative only if one of the numbers is negative */ \ + (((a) < 0) ^ ((b) < 0)) /* 1 if sign is negative else 0 */ #define INT_ABS(x) ((x) < 0 ? -(x) : (x)) // the main macro @@ -28,8 +30,7 @@ ( /* beginning */ \ /* check for equality of a and b */ \ INT_ABS((a)) == INT_ABS((b)) ? \ - /* if only one of the numbers is negative, the result is -1, */ \ - /* otherwise it is 1. */ \ + /* the result is +/-1 */ \ (INT_DIV_NEG_RESULT_SIGN(a, b) ? -1 : 1) : ( \ \ /* check if b is a power of 2 */ \ @@ -38,8 +39,6 @@ /* after point) == 0 */ \ (roundl(fmodl(log2l(INT_ABS((b))), 1.l) * OPT_INT_DIV_ROUNDING) \ == 0.l) ? ( \ - /* if only one of the numbers is negative, the result is */ \ - /* negative */ \ INT_DIV_NEG_RESULT_SIGN(a, b) ? \ -INT_BIN_DIV(INT_ABS(a), INT_ABS(b)) \ : \