guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: reader musings


From: Maxime Devos
Subject: Re: reader musings
Date: Wed, 08 Jun 2022 09:49:38 +0200
User-agent: Evolution 3.38.3-1

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.

Attachment: signature.asc
Description: This is a digitally signed message part


reply via email to

[Prev in Thread] Current Thread [Next in Thread]