Problems with printing double-values with printf and sprintf

Sebastian Huber sebastian.huber at
Mon Sep 7 10:37:53 UTC 2009

Sebastian Huber wrote:
> The calculation in dtoa.c line 295 is wrong because the values for Exp_shift1
> and Exp_mask are invalid for the little endian ARM (this is only a good guess
> at the moment).  Exp_shift1 has the value 20 and should have the value 23.
> These values are defined in
> ./newlib/libc/stdio/vfieeefp.h
> ./newlib/libc/stdlib/mprec.h
> It looks like the __IEEE_LITTLE_ENDIAN is undefined.

My previous analysis is wrong.

The define __IEEE_LITTLE_ENDIAN is correctly defined.  The Exp_shift1 etc.
defines are correct.

It seems that GCC uses the legacy ARM FPA model for its software floating-point
implementation.  That means (excerpt from the corresponding ARM document):

Little-endian double-precision values are neither pure little-endian nor pure

This differs from that more recent VFP (Vectored Floatin-Point architecture).

In IEEE 754 we have the following double format:

least significant word (lsw): fraction [31:0]
moast significant word (msw): sign | exponent | fraction [51:32]

This will be stored in different ways:

                 VFP LE    VFP BE    FPA
lower address       lsw       msw    msw
higher address      msw       lsw    lsw

Thus we need to modify the word0() (returns msw) and word1() (returns lsw)
defines in mprec.h for ARM with FPA floating-point model:

#define word0(x) (x.i[0])
#define word1(x) (x.i[1])

Sebastian Huber, embedded brains GmbH

Address : Obere Lagerstr. 30, D-82178 Puchheim, Germany
Phone   : +49 89 18 90 80 79-6
Fax     : +49 89 18 90 80 79-9
E-Mail  : sebastian.huber at
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

More information about the users mailing list