[erlang-questions] OTP float error on ARM

Bob Ippolito <>
Thu Oct 16 07:40:11 CEST 2008


Well, the float type in Erlang binaries by itself is big endian, not
native endian. This is a bug in Erlang.

On Wed, Oct 15, 2008 at 8:59 PM, WS Dao <> wrote:
> my shell output is:
>
> 4> <<1.0:64/float>>.
> <<0,0,0,0,63,240,0,0>>
>
>
> as Tony said, S3C2410/ARM920T CPU , double float is "Middle Endian"
>
> IEEE float:  12 34 AB CD
> Middle Endian: AB CD 12 34
>
>
> my toolchain doesn't support "-msoft-float" option.
> [ ~]# arm-unknown-linux-gnu-readelf -h
> /tmp/cross-compile/lib/erlang/erts-5.6.4/bin/beam
> ELF Header:
>   Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
>   Class:                             ELF32
>   Data:                              2's complement, little endian
>   Version:                           1 (current)
>   OS/ABI:                            ARM
>   ABI Version:                       0
>   Type:                              EXEC (Executable file)
>   Machine:                           ARM
>   Version:                           0x1
>   Entry point address:               0x21f84
>   Start of program headers:          52 (bytes into file)
>   Start of section headers:          1346104 (bytes into file)
>   Flags:                             0x2, has entry point, GNU EABI
>   Size of this header:               52 (bytes)
>   Size of program headers:           32 (bytes)
>   Number of program headers:         6
>   Size of section headers:           40 (bytes)
>   Number of section headers:         31
>   Section header string table index: 28
>
>
> My platform doesn't support clock_gettime(CLOCK_MONOTONIC,&ts) ,
> /erts/emulator/sys/unix/sys.c, so I can't use debian binary.
>
>
>
> 2008/10/15 Bob Ippolito <>
>>
>> There's code in io_lib_format.erl that does the default format floats,
>> which assumes IEEE 754 floats. Perhaps the float<->binary code is
>> broken on your platform, or your platform doesn't do IEEE 754?
>>
>> This is the code in io_lib_format (in R12B3 anyway, I don't have R12B4
>> installed on this machine):
>>
>> mantissa_exponent(F) ->
>>    case <<F:64/float>> of
>>        <<_S:1, 0:11, M:52>> -> % denormalized
>>            E = log2floor(M),
>>            {M bsl (53 - E), E - 52 - 1075};
>>        <<_S:1, BE:11, M:52>> when BE < 2047 ->
>>            {M + ?BIG_POW, BE - 1075}
>>    end.
>>
>> Does the output for this differ in your shell? If so, then your Erlang
>> VM isn't doing the right thing when converting floats to binary...
>>
>> 1> <<1.0:64/float>>.
>> <<63,240,0,0,0,0,0,0>>
>>
>>
>> 2008/10/15 WS Dao <>:
>> > I cross-compiled OTP R12B4 for my ARM9 platform (S3C2410, kernel 2.4.18)
>> > When I run erl on arm, float error occurs:
>> > # ./erl
>> > Eshell V5.6.4  (abort with ^G)
>> > 1> 3+5.
>> > 8
>> > 2> 3.0.
>> > 0.
>> >
>> > 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005307579804
>> > 3> 3.0+4.0.
>> >
>> > 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000531405562
>> > 4>
>> >
>> > My toolchain is gcc 3.4.5.  I'd wrote a c test program and cross-compile
>> > it,
>> > no float problems found.
>> >
>> > Any suggestion?
>> >
>> >
>> > -dao
>> > _______________________________________________
>> > erlang-questions mailing list
>> > 
>> > http://www.erlang.org/mailman/listinfo/erlang-questions
>> >
>
>



More information about the erlang-questions mailing list