Fix problem with sub that was ruining arctangent
diff --git a/src/bc/num.c b/src/bc/num.c
index 0ea605e..7322380 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -352,12 +352,12 @@
return BC_STATUS_SUCCESS;
}
else if (cmp > 0) {
- neg = sub ? a->neg : !a->neg;
+ neg = sub && a->neg;
minuend = a;
subtrahend = b;
}
else {
- neg = sub ? !b->neg : b->neg;
+ neg = sub && !b->neg;
minuend = b;
subtrahend = a;
}
@@ -1765,27 +1765,14 @@
}
BcStatus bc_num_add(BcNum *a, BcNum *b, BcNum *result, size_t scale) {
-
- BcNumBinaryFunc op;
-
(void) scale;
-
- if ((a->neg && b->neg) || (!a->neg && !b->neg)) op = bc_num_alg_a;
- else op = bc_num_alg_s;
-
+ BcNumBinaryFunc op = (!!a->neg == !!b->neg) ? bc_num_alg_a : bc_num_alg_s;
return bc_num_binary(a, b, result, false, op, a->len + b->len + 1);
}
BcStatus bc_num_sub(BcNum *a, BcNum *b, BcNum *result, size_t scale) {
-
- BcNumBinaryFunc op;
-
(void) scale;
-
- if (a->neg && b->neg) op = bc_num_alg_s;
- else if (a->neg || b->neg) op = bc_num_alg_a;
- else op = bc_num_alg_s;
-
+ BcNumBinaryFunc op = (!!a->neg == !!b->neg) ? bc_num_alg_s : bc_num_alg_a;
return bc_num_binary(a, b, result, true, op, a->len + b->len + 1);
}