Various approaches:
1) Use a string. If FLT_RADIX
is 10, use fprintf(outf, " %.*e", DBL_DECIMAL_DIG-1, x)
, otherwise use fprintf(outf, " %a", x)
(Ref). Use fscanf(inf, "%lf", &x)
to read back. ("%la"
has same effect)
2) Use a union and assume double
format is IEEE double precision binary format, maybe also use defined endian and *nix: htonl()
union d2a {
double d;
unsigned char uc[sizeof double];
} u;
u.d = x;
ToNetworkEndian(u.uc);
fwrite(u.uc, 1, sizeof u.uc, outf);
fread(u.uc, 1, sizeof u.uc, inf);
FromNetworkEndian(u.uc);
x = u.d;
3) Write a lot of code to covert compiler's non-standard double
to IEEE
taking into account: different precision, range, wobbling precision, +/- 0, sub-normals, etc.
Recommend option 1