Matlab dec2bin给出了错误的值

Gil*_*evi 3 matlab

我正在使用Matlab的dec2bin将十进制数转换为二进制字符串.但是,我得到了错误的结果.例如:

>> dec2bin(13339262925365424727)

ans =

1011100100011110100101001111010011000111111100011011000000000000
Run Code Online (Sandbox Code Playgroud)

我在C++实现和wolfram alpha中检查了两者,正确的结果是:

1011100100011110100101001111010011000111111100011011001001010111
Run Code Online (Sandbox Code Playgroud)

我使用Matlab的desc2bin有什么问题吗?

谢谢,

吉尔.

Dan*_*iel 8

您的代码相当于:

x=13339262925365424727;
dec2bin(x)
Run Code Online (Sandbox Code Playgroud)

但如果你检查x的值,你会发现它超出了双精度.这个数字很大,可以存储在64位双倍中.精度是2 ^ 11,检查eps(x)

要处理大量数字,使用vpa符号工具箱是一个不错的选择,这是可用的吗?

这是使用vpa的解决方案:

function l=ldec2bin(x)
if x>2^52
    head=floor(x/2^52);
    tail=x-head*2^52;
    l=[ldec2bin(head),dec2bin(double(tail),52)];
else
    l=dec2bin(double(x));
end
end
Run Code Online (Sandbox Code Playgroud)

用法:

>> ldec2bin(vpa('13339262925365424727'))

ans =

1011100100011110100101001111010011000111111100011011001001010111
Run Code Online (Sandbox Code Playgroud)

/更新:

我遇到了一个更短的dec2bin符号变量实现:

>> sdec2bin=@(x)(feval(symengine,'int2text',x,2))

sdec2bin = 

    @(x)(feval(symengine,'int2text',x,2))

>> sdec2bin(sym('13339262925365424727'))

ans =

1011100100011110100101001111010011000111111100011011001001010111
Run Code Online (Sandbox Code Playgroud)