diff options
author | Tomasz Kramkowski <tk@the-tk.com> | 2021-07-23 16:03:33 +0100 |
---|---|---|
committer | Tomasz Kramkowski <tk@the-tk.com> | 2021-07-23 16:03:33 +0100 |
commit | 5a904fbf12c2d4a270ac76ace4cc70a87869c74c (patch) | |
tree | b800d937d927c66874c8098fad8d39baa2774b84 /unpack.c | |
parent | 42cc7b4840818fc0d989202d44315271f968e74d (diff) | |
download | pack-5a904fbf12c2d4a270ac76ace4cc70a87869c74c.tar.gz pack-5a904fbf12c2d4a270ac76ace4cc70a87869c74c.tar.xz pack-5a904fbf12c2d4a270ac76ace4cc70a87869c74c.zip |
Move ieee754b functions to their own file
Diffstat (limited to 'unpack.c')
-rw-r--r-- | unpack.c | 40 |
1 files changed, 3 insertions, 37 deletions
@@ -5,50 +5,16 @@ #include <ctype.h> #include <errno.h> #include <inttypes.h> -#include <math.h> #include <stdarg.h> #include <stdbool.h> #include <stdint.h> #include <stdlib.h> #include "common.h" +#include "ieee754b.h" #include "pack.h" #include "trace.h" -#define GEN_CONV_IEEE754B(type, total, nexp, nfrac) \ -static type convert_ieee754b##total(uintmax_t b) \ -{ \ - bool isneg; \ - int exp; \ - type n; \ -\ - isneg = (b >> (total - 1)) & 0x1; \ - exp = (b >> nfrac) & BITMASK(nexp); \ - n = b & BITMASK(nfrac); \ -\ - if (exp == BITMASK(nexp)) { \ - if (n) { \ - return NAN; \ - } else { \ - return isneg ? -INFINITY : INFINITY; \ - } \ - } else if (exp == 0) { \ - if (n == 0) \ - return isneg ? -0.0 : 0.0; \ - exp = -(int)(BITMASK(nexp) / 2 - 1); \ - } else { \ - n += 0x1p##nfrac##f; \ - exp -= BITMASK(nexp) / 2; \ - } \ -\ - n = ldexpf(n, exp - nfrac); \ -\ - return isneg ? -n : n; \ -} - -GEN_CONV_IEEE754B(float, 32, 8, 23) -GEN_CONV_IEEE754B(double, 64, 11, 52) - static uintmax_t read_val(const unsigned char *buf, size_t size, enum endian e) { uintmax_t val = 0; @@ -149,11 +115,11 @@ enum pack_status unpack(const void *buf_, size_t size, const char *fmt, ...) tr_debug("val.u: %" PRIuMAX ", at: %zu", val.u, offset + s * j); if (fmt[i] == 'f') { - float f = convert_ieee754b32(val.u); + float f = ieee754b32_deserialise(val.u); val.f = f; tr_debug("val.f: %f", val.f); } else if (fmt[i] == 'd') { - double d = convert_ieee754b64(val.u); + double d = ieee754b64_deserialise(val.u); val.d = d; tr_debug("val.d: %f", val.d); } else if (sign) { |