#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <unistd.h>

typedef union _d64
{
    double d;
    uint64_t i;
} _d64;

int main(int argc, char **argv)
{
    _d64 d;
    if (argc < 3) {
        const char *usage_str = "Usage: d2h -i <64-bit hex integer> or d2h -d <double-precision IEEE754 float>\n";
        write(1, usage_str, strlen(usage_str));
        return -1;
    }
    if (argv[1][1] == 'd') {
        d.d = strtod(argv[2], NULL);
    } else {
        d.i = strtoul(argv[2], NULL, 16);
    }
    printf("IEEE754 double: %.10g: value: %.20e, hexfloat value: %a, bit representation: 0x%016lx\n", d.d, d.d, d.d, d.i);
    return 0;
}

