Problem with 64 bit FP under ARM
Martin Sandiford
ms@REDACTED
Sat Aug 23 15:39:29 CEST 2003
Hi Matthias,
On Sat, 23 Aug 2003, Matthias Lang wrote:
> I run erlang r8b on linux on a big-endian PowerPC embedded system
> with floating point emulation:
>
> 1> <<1.0:64/float>>.
> <<63,240,0,0,0,0,0,0>>
This looks good to me. Erlang does some internal massaging to make sure
the ordering is common (BE I think?) regardless of platform. I believe
I made a error in my previous statement to the effect that this was the
"right" result for a LE machine. I believe it is correct for the beam
VM.
Usually the difference between LE/BE is a byte by byte swap, highest for
lowest. I haven't seen quads swapped like this in double before (but I
haven't been looking either).
> I assume you've checked what happened during autoconf, e.g. that you
> have
>
> ac_cv_c_bigendian=${ac_cv_c_bigendian=yes}
I'm pretty sure I have this set OK. The SA1110 is little endian.
It's pretty easy to tell using (I think) <<1:32/integer>> which
should output <<0,0,0,1>>, but outputs <<1,0,0,0>> if the endianness
is messed up.
> If you provide an example which fails I'll try it.
if <<1.0:64/float>> outputs as above, this matches with my idea of what
should be output. The compiler uses term_to_binary to convert floating
point constants into binaries, and then writes them out to the .beam
file. When reading them in on the non-matching machine, they are
back to front quad wise and represent different numbers altogether.
> Are you using the in-kernel FP emulation or the gcc 'soft-float'? See
> also:
>
> http://codepoet.org/lists/busybox/2003-June/008547.html
I'm using the in kernel FPE. Thanks for the tip, maybe the soft-float
thing will provide a solution.
Cheers,
Martin
More information about the erlang-questions
mailing list