aboutsummaryrefslogtreecommitdiff
path: root/src/integer128.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/integer128.c')
-rw-r--r--src/integer128.c72
1 files changed, 36 insertions, 36 deletions
diff --git a/src/integer128.c b/src/integer128.c
index 70cf6bca0..ed05a1471 100644
--- a/src/integer128.c
+++ b/src/integer128.c
@@ -243,60 +243,44 @@ f64 i128_to_f64(i128 a) {
}
-String u128_to_string(u128 a, char *out_buf, isize out_buf_len) {
+String u128_to_string(u128 v, char *out_buf, isize out_buf_len) {
char buf[200] = {0};
- isize i = 0;
-
- if (u128_ne(a, U128_ZERO)) {
- u128 base = u128_from_u64(10);
- while (u128_gt(a, U128_ZERO)) {
- i64 digit = u128_to_i64(u128_mod(a, base));
- buf[i++] = gb__num_to_char_table[digit];
- a = u128_quo(a, base);
- }
- } else {
- buf[i++] = '0';
- }
+ isize i = gb_size_of(buf);
- gb_reverse(buf, i, 1);
+ u128 b = u128_from_u64(10);;
+ while (u128_ge(v, b)) {
+ buf[--i] = gb__num_to_char_table[u128_to_i64(u128_mod(v, b))];
+ v = u128_quo(v, b);
+ }
+ buf[--i] = gb__num_to_char_table[u128_to_i64(u128_mod(v, b))];
- isize len = gb_min(i, out_buf_len);
- gb_memcopy(out_buf, &buf[0], len);
+ isize len = gb_min(gb_size_of(buf)-i, out_buf_len);
+ gb_memcopy(out_buf, &buf[i], len);
return make_string(cast(u8 *)out_buf, len);
}
String i128_to_string(i128 a, char *out_buf, isize out_buf_len) {
char buf[200] = {0};
- isize i = 0;
+ isize i = gb_size_of(buf);
bool negative = false;
if (i128_lt(a, I128_ZERO)) {
negative = true;
a = i128_neg(a);
}
- if (i128_ne(a, I128_ZERO)) {
- i128 base = i128_from_u64(10);
- while (i128_gt(a, I128_ZERO)) {
- i64 digit = i128_to_i64(i128_mod(a, base));
- buf[i++] = gb__num_to_char_table[digit];
- a = i128_quo(a, base);
- }
- } else {
- buf[i++] = '0';
+ u128 v = *cast(u128 *)&a;
+ u128 b = u128_from_u64(10);;
+ while (u128_ge(v, b)) {
+ buf[--i] = gb__num_to_char_table[u128_to_i64(u128_mod(v, b))];
+ v = u128_quo(v, b);
}
+ buf[--i] = gb__num_to_char_table[u128_to_i64(u128_mod(v, b))];
if (negative) {
- buf[i++] = '-';
- }
-
- GB_ASSERT(i > 0);
- for (isize j = 0; j < i/2; j++) {
- char tmp = buf[j];
- buf[j] = buf[i-1-j];
- buf[i-1-j] = tmp;
+ buf[--i] = '-';
}
- isize len = gb_min(i, out_buf_len);
- gb_memcopy(out_buf, &buf[0], len);
+ isize len = gb_min(gb_size_of(buf)-i, out_buf_len);
+ gb_memcopy(out_buf, &buf[i], len);
return make_string(cast(u8 *)out_buf, len);
}
@@ -571,6 +555,21 @@ i128 i128_mul(i128 a, i128 b) {
}
void i128_divide(i128 num, i128 den, i128 *quo, i128 *rem) {
+ // TODO(bill): Which one is correct?!
+#if 0
+ i128 s = i128_shr(den, 127);
+ den = i128_sub(i128_xor(den, s), s);
+ s = i128_shr(num, 127);
+ den = i128_sub(i128_xor(num, s), s);
+
+ u128 n, r = {0};
+ u128_divide(*cast(u128 *)&num, *cast(u128 *)&den, &n, &r);
+ i128 ni = *cast(i128 *)&n;
+ i128 ri = *cast(i128 *)&r;
+
+ if (quo) *quo = i128_sub(i128_xor(ni, s), s);
+ if (rem) *rem = i128_sub(i128_xor(ri, s), s);
+#else
if (i128_eq(den, I128_ZERO)) {
if (quo) *quo = i128_from_u64(num.lo/den.lo);
if (rem) *rem = I128_ZERO;
@@ -598,6 +597,7 @@ void i128_divide(i128 num, i128 den, i128 *quo, i128 *rem) {
if (quo) *quo = r;
if (rem) *rem = n;
}
+#endif
}
i128 i128_quo(i128 a, i128 b) {