Handle scale better
diff --git a/src/bc/num.c b/src/bc/num.c
index 3f2e50b..95cc774 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -74,6 +74,7 @@
 static BcStatus bc_num_alg_m(BcNum* a, BcNum* b, BcNum* c, size_t scale);
 static BcStatus bc_num_alg_d(BcNum* a, BcNum* b, BcNum* c, size_t scale);
 static BcStatus bc_num_alg_mod(BcNum* a, BcNum* b, BcNum* c, size_t scale);
+static BcStatus bc_num_alg_rem(BcNum* a, BcNum* b, BcNum* c);
 static BcStatus bc_num_alg_p(BcNum* a, BcNum* b, BcNum* c, size_t scale);
 
 static BcStatus bc_num_sqrt_newton(BcNum* a, BcNum* b, size_t scale);
@@ -171,76 +172,32 @@
 }
 
 BcStatus bc_num_add(BcNum* a, BcNum* b, BcNum* result, size_t scale) {
-  return bc_num_binary(a, b, result, scale, bc_num_alg_a, a->len + b->len);
+  return bc_num_binary(a, b, result, scale, bc_num_alg_a, a->len + b->len + 1);
 }
 
 BcStatus bc_num_sub(BcNum* a, BcNum* b, BcNum* result, size_t scale) {
-
-  BcNum* a_num;
-  BcNum* b_num;
-
-  a_num = (BcNum*) a;
-  b_num = (BcNum*) b;
-
-  return bc_num_binary(a_num, b_num, result, scale, bc_num_alg_s,
-                       a_num->len + b_num->len);
+  return bc_num_binary(a, a, result, scale, bc_num_alg_s, a->len + b->len + 1);
 }
 
 BcStatus bc_num_mul(BcNum* a, BcNum* b, BcNum* result, size_t scale) {
-
-  BcNum* a_num;
-  BcNum* b_num;
-
-  a_num = (BcNum*) a;
-  b_num = (BcNum*) b;
-
-  return bc_num_binary(a_num, b_num, result, scale, bc_num_alg_m,
-                       a_num->len + b_num->len);
+  return bc_num_binary(a, b, result, scale, bc_num_alg_m, a->len + b->len);
 }
 
 BcStatus bc_num_div(BcNum* a, BcNum* b, BcNum* result, size_t scale) {
-
-  BcNum* a_num;
-  BcNum* b_num;
-
-  a_num = (BcNum*) a;
-  b_num = (BcNum*) b;
-
-  return bc_num_binary(a_num, b_num, result, scale, bc_num_alg_d,
-                       a_num->len + b_num->len);
+  return bc_num_binary(a, b, result, scale, bc_num_alg_d, a->len + b->len);
 }
 
 BcStatus bc_num_mod(BcNum* a, BcNum* b, BcNum* result, size_t scale) {
-
-  BcNum* a_num;
-  BcNum* b_num;
-
-  a_num = (BcNum*) a;
-  b_num = (BcNum*) b;
-
-  return bc_num_binary(a_num, b_num, result, scale, bc_num_alg_mod,
-                       a_num->len + b_num->len);
+  return bc_num_binary(a, b, result, scale, bc_num_alg_mod, a->len + b->len);
 }
 
 BcStatus bc_num_pow(BcNum* a, BcNum* b, BcNum* result, size_t scale) {
-
-  BcNum* a_num;
-  BcNum* b_num;
-
-  a_num = (BcNum*) a;
-  b_num = (BcNum*) b;
-
-  return bc_num_binary(a_num, b_num, result, scale, bc_num_alg_p,
-                       a_num->len + b_num->len);
+  return bc_num_binary(a, b, result, scale, bc_num_alg_p, a->len * b->len);
 }
 
 BcStatus bc_num_sqrt(BcNum* a, BcNum* result, size_t scale) {
-
-  BcNum* a_num;
-
-  a_num = (BcNum*) a;
-
-  return bc_num_unary(a_num, result, scale, bc_num_sqrt_newton, a_num->len * 2);
+  return bc_num_unary(a, result, scale, bc_num_sqrt_newton,
+                      a->radix + (a->len - a->radix) * 2);
 }
 
 bool bc_num_isInteger(BcNum* num) {
@@ -480,10 +437,22 @@
 
 static BcStatus bc_num_alg_s(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
 
+  scale = BC_MAX(BC_NUM_SCALE(a), BC_NUM_SCALE(b));
+
 }
 
 static BcStatus bc_num_alg_m(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
 
+  size_t scale_a;
+  size_t scale_b;
+
+  scale_a = BC_NUM_SCALE(a);
+  scale_b = BC_NUM_SCALE(b);
+
+  scale = BC_MAX(scale, scale_a);
+  scale = BC_MAX(scale, scale_b);
+  scale = BC_MIN(scale_a + scale_b, scale);
+
 }
 
 static BcStatus bc_num_alg_d(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
@@ -492,6 +461,21 @@
 
 static BcStatus bc_num_alg_mod(BcNum* a, BcNum* b, BcNum* c, size_t scale) {
 
+  if (scale == 0) {
+    return bc_num_alg_rem(a, b, c);
+  }
+
+  // TODO: Compute a / b.
+
+  scale = BC_MAX(scale + b->len - b->radix, a->len - a->radix);
+
+  // TODO: Compute a - (a / b) * b.
+
+  return BC_STATUS_SUCCESS;
+}
+
+static BcStatus bc_num_alg_rem(BcNum* a, BcNum* b, BcNum* c) {
+
 }
 
 static BcStatus bc_num_alg_p(BcNum* a, BcNum* b, BcNum* c, size_t scale) {