Stefan Israelsson Tampe schreef op wo 08-06-2022 om 01:07 [+0200]: > https://gitlab.com/tampe/guile-persist/-/tree/master/ice-9 > https://gitlab.com/tampe/guile-persist/-/tree/master/src/write > > I'm wondering if I should make a C library for other projects to take > advantage of this work. Could they be integrated in Guile itself? That would reach the most people I think. int exp = (((*((uint64_t *) &d)) >> 52) & ((1L<<11)-1)) - 1023L; uint64_t man = ((*((uint64_t *) &d)) & ((1L<<52)-1L)) + (1L << 52); double's aren't uint64_t, so maybe a strict aliasing vilation and hence undefined behaviour. If so, maybe use -fno-strict-aliasing, or use type punning through an union? Also, this assumes IEEE doubles, so maybe do some checks whether things are actually IEEE (see m4/fpieee.m4, and maybe some checks like sizeof(double)=sizeof(uint64_t) and alignof(double)=sizeof(uint64_t) and check DBL_DIG, DBL_MANT_DIG, DBL_MAX_EXP, ...)? That line also assumes 'long' = 'uint64_t' (or at least, that they have the same size), which to me seems a bold assumption to make in the general case. Also, more generally, there was some paper on subtle errors that can easily happen when printing floating point numbers and how to test for them and avoid them, though I cannot find it anymore, and the implementation isn't documented and doesn't seem to have automatic tests. Greetings, Maxime.