gpt4 book ai didi

floating-point - 如何从二进制文件中读取单精度 float 并转换为 Erlang float ?

转载 作者:行者123 更新时间:2023-12-02 05:58:20 27 4
gpt4 key购买 nike

我已经使用 Erlang 读取二进制文件中的 4 个字节(小端)。

在尝试将二进制转换为浮点时,我一直遇到以下错误:

** exception error: bad argument
in function list_to_integer/1
called as list_to_integer([188,159,21,66])

它似乎不匹配浮点模式,最终改为调用 list_to_integer。我如何才能将我的单精度 float 转换为原生 Erlang float ?

我的 Erlang 函数如下:

readfloat(S, StartPos) ->
io:format("Pos: ~w~n", [StartPos - 1]),
case file:pread(S, StartPos - 1, 4) of
eof ->
ok;
{ok, Data} ->
% io:format("Wut: ~w~n", Data),
N = binary_to_list(Data),
case string:to_float(N) of
{error,no_float} ->
list_to_integer(N);
{F,_Rest} ->
F
end

% have tried this section as well, error too
% N = binary_to_list(Data),
% try list_to_float(N)
% catch
% error:badarg ->
% list_to_integer(N)
% end
end.

最佳答案

如果您知道刚刚读取的 4 个字节是单精度 float 的二进制表示(根据 IEEE 754),您可以使用 Wikipedia page 中给出的定义将其转换为 float :

1> Float = fun(B) -> <<S:1,E:8,M:23>> = B,
1> case {S,E,M} of
1> {_,0,0} -> 0; % you may make distinction between +0 and -0
1> {1,255,0} -> minus_infinity;
1> {0,255,0} -> infinity;
1> {_,255,_} -> nan;
1> {S,0,M} -> (1-2*S)*M/(1 bsl 149); % denormalized number
1> {S,E,M} when E > 150 -> float((1-2*S)*(M+ (1 bsl 23)) * (1 bsl (E - 150)));
1> {S,E,M} -> (1-2*S)*(M+ (1 bsl 23))/(1 bsl (150-E))
1> end
1> end. 1>end. #Fun<erl_eval.6.52032458>
2> Float(<<192,0,0,0>>).
-2.0
3> Float(<<188,159,21,66>>).
-0.019419316202402115
4> Float(<<194,237,64,0>>).
-118.625

[编辑] 像往常一样我来不及了:o),我不记得二进制匹配的语法:<<Z:32/float>> :o(

关于floating-point - 如何从二进制文件中读取单精度 float 并转换为 Erlang float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com