aboutsummaryrefslogtreecommitdiff
path: root/ratio.c
diff options
context:
space:
mode:
Diffstat (limited to 'ratio.c')
-rw-r--r--ratio.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/ratio.c b/ratio.c
index 6d0b59d..f8bfeb0 100644
--- a/ratio.c
+++ b/ratio.c
@@ -9,6 +9,7 @@ typedef unsigned long long num;
typedef struct {bool s; num n; num d;} rational;
+/*safe_sum and safe_product abort if computations would exceed maximal value allowd for unsigned long long and overflow.*/
num safe_sum(num n1, num n2){
if(n2 > ULLONG_MAX-n1){
printf("Sum overflow: Adding %llu and %llu\n",n1,n2);
@@ -107,6 +108,7 @@ rational product(rational r1, rational r2){
rational r;
rational s1 = {r1.s, r1.n, r2.d};
rational s2 = {r2.s, r2.n, r1.d};
+ /*Cancel as early as possible to avoid exceeding maximal value.*/
rational t1 = cancel(s1);
rational t2 = cancel(s2);
r.s = t1.s^t2.s;