floating-point representation

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

floating-point representation

David Fox
Hi all,

I'm trying to create (32-bit) floats from binaries (using the bit syntax).

Empirical tests showed this to be a naive idea :

A = random:uniform(256),
B = random:uniform(256),
C = random:uniform(256),
D = random:uniform(256),

<<Float:32/signed-float>> = <<A, B, C, D>>.

(depending on the values of A,B,C,D ; this can result in a badmatch).


What kind of representation is used for floats (is this a local issue) ?

Also, is there any way to tell what precision that erlang uses ?


--david.



Reply | Threaded
Open this post in threaded view
|

floating-point representation

David Fox
I tried to decipher my own mail and think some clarification might be
in order...


>Hi all,
>
>I'm trying to create (32-bit) floats from binaries (using the bit syntax).
>
>Empirical tests showed this to be a naive idea :
>
>A = random:uniform(256),
>B = random:uniform(256),
>C = random:uniform(256),
>D = random:uniform(256),
>
><<Float:32/signed-float>> = <<A, B, C, D>>.
>
>(depending on the values of A,B,C,D ; this can result in a badmatch).

This is probably bit-combinations meaning "Infinity" and "NaN". It
would be nice if this operation didn't fail but instead returned the
above. (Is this possible and/or is it a performance penalty for this
?)


>
>What kind of representation is used for floats (is this a local issue) ?
>
>Also, is there any way to tell what precision that erlang uses ?
>
>
>--david.




Reply | Threaded
Open this post in threaded view
|

floating-point representation

Arndt Jonasson
In article <a05100c02b745a9623c2b@[213.100.91.238]>,
david wallin <david> wrote:

>I tried to decipher my own mail and think some clarification might be
>in order...
>
>
>>Hi all,
>>
>>I'm trying to create (32-bit) floats from binaries (using the bit syntax).
>>
>>Empirical tests showed this to be a naive idea :
>>
>>A = random:uniform(256),
>>B = random:uniform(256),
>>C = random:uniform(256),
>>D = random:uniform(256),
>>
>><<Float:32/signed-float>> = <<A, B, C, D>>.
>>
>>(depending on the values of A,B,C,D ; this can result in a badmatch).
>
>This is probably bit-combinations meaning "Infinity" and "NaN". It
>would be nice if this operation didn't fail but instead returned the
>above. (Is this possible and/or is it a performance penalty for this
>?)

You are right; you can construct invalid floating-point bit patterns
with this method, and since Erlang doesn't include "not-a-numbers" in
the float data type, an exit is signalled. If you expect there to be
non-numbers in the binary, you can use 'catch' to catch the exit:

bytes_to_float(A,B,C,D) ->
    <<Float:32/signed-float>> = <<A, B, C, D>>,
    Float.

convert(A,B,C,D) ->
    case catch bytes_to_float(A,B,C,D) of
        {'EXIT', _} ->
            not_a_number;
        F ->
            F
    end.

>>
>>What kind of representation is used for floats (is this a local issue) ?

The representation is the IEEE 754 floating-point standard. This also
happens to be the native representation on the platforms on which the
commercial releases of Erlang runs.

Here is a description of the standard:
http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html

>>Also, is there any way to tell what precision that erlang uses ?

Internally, it uses the 'double' data type of C, which probably means
64 bits on most platforms.
--
Arndt Jonasson
arndt