libzahl

big integer library
git clone git://git.suckless.org/libzahl
Log | Files | Refs | README | LICENSE

commit 5e77b994435be4bef66ff596bf931e1fff97a77c
parent c018cebc38c37370ab6c89d19694587edf7d0d0e
Author: Mattias Andrée <maandree@kth.se>
Date:   Sat, 12 Mar 2016 20:22:11 +0100

64-bit chars out-perform 32-bit chars on almost all operations, and on all expensive operations

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
Msrc/internals.h | 6+++---
Msrc/zsets.c | 3---
Msrc/zsetu.c | 7++-----
Msrc/zstr.c | 22+++++++++++-----------
Mzahl.h | 2+-
5 files changed, 17 insertions(+), 23 deletions(-)

diff --git a/src/internals.h b/src/internals.h @@ -5,9 +5,9 @@ #include <stdlib.h> #include <errno.h> -#define BITS_PER_CHAR 32 -#define LB_BITS_PER_CHAR 5 -#define ZAHL_CHAR_MAX UINT32_MAX +#define BITS_PER_CHAR 64 +#define LB_BITS_PER_CHAR 6 +#define ZAHL_CHAR_MAX UINT64_MAX #define FLOOR_BITS_TO_CHARS(bits) ((bits) >> LB_BITS_PER_CHAR) #define CEILING_BITS_TO_CHARS(bits) (((bits) + (BITS_PER_CHAR - 1)) >> LB_BITS_PER_CHAR) diff --git a/src/zsets.c b/src/zsets.c @@ -41,9 +41,6 @@ zsets(z_t a, const char *str) if (!temp) continue; libzahl_tmp_str_num->chars[0] = (zahl_char_t)temp; - temp >>= BITS_PER_CHAR; - libzahl_tmp_str_num->chars[1] = (zahl_char_t)temp; - libzahl_tmp_str_num->used = 1 + !!temp; zadd(a, a, libzahl_tmp_str_num); } } diff --git a/src/zsetu.c b/src/zsetu.c @@ -13,9 +13,6 @@ zsetu(z_t a, unsigned long long int b) } ENSURE_SIZE(a, SIZE_MULTIPLE(b, *(a->chars))); SET_SIGNUM(a, 1); - a->used = 0; - while (b) { - a->chars[a->used++] = (zahl_char_t)b; - b >>= BITS_PER_CHAR; - } + a->chars[0] = (zahl_char_t)b; + a->used = 1; } diff --git a/src/zstr.c b/src/zstr.c @@ -6,16 +6,16 @@ #define num libzahl_tmp_str_num #define rem libzahl_tmp_str_rem -/* All 9 you see here is derived from that 10⁹ is the largest - * power of than < 2³², and 32 is the number of bits in - * zahl_char_t. If zahl_char_t is chanced, the value 9, and - * the cast to unsigned long must be changed accordingly. */ +/* All 19 you see here is derived from that 10¹⁹ is the largest + * power of than < 2⁶⁴, and 64 is the number of bits in + * zahl_char_t. If zahl_char_t is chanced, the value 19, and + * the cast to unsigned long long must be changed accordingly. */ char * zstr(z_t a, char *b) { - char buf[9 + 1]; + char buf[19 + 1]; size_t n, len; char overridden = 0; int neg; @@ -44,17 +44,17 @@ zstr(z_t a, char *b) b[0] = '-'; b += neg; n -= neg; - n = n > 9 ? (n - 9) : 0; + n = n > 19 ? (n - 19) : 0; for (;;) { - zdivmod(num, rem, num, libzahl_const_1e9); + zdivmod(num, rem, num, libzahl_const_1e19); if (!zzero(num)) { - sprintf(b + n, "%09lu", zzero(rem) ? 0UL : (unsigned long)(rem->chars[0])); - b[n + 9] = overridden; + sprintf(b + n, "%019llu", zzero(rem) ? 0ULL : (unsigned long long)(rem->chars[0])); + b[n + 19] = overridden; overridden = b[n]; - n = n > 9 ? (n - 9) : 0; + n = n > 19 ? (n - 19) : 0; } else { - len = (size_t)sprintf(buf, "%lu", (unsigned long)(rem->chars[0])); + len = (size_t)sprintf(buf, "%llu", (unsigned long long)(rem->chars[0])); if (overridden) buf[len] = b[n + len]; memcpy(b + n, buf, len + 1); diff --git a/zahl.h b/zahl.h @@ -11,7 +11,7 @@ /* You should pretend like this typedef does not exist. */ -typedef uint32_t zahl_char_t; +typedef uint64_t zahl_char_t; /* This structure should be considered opaque. */ typedef struct {