繁体   English   中英

Matlab dec2bin给出了错误的值

[英]Matlab dec2bin gives wrong values

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

>> dec2bin(13339262925365424727)

ans =

1011100100011110100101001111010011000111111100011011000000000000

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

1011100100011110100101001111010011000111111100011011001001010111

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

谢谢,

吉尔。

您的代码相当于:

x=13339262925365424727;
dec2bin(x)

但如果你检查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

用法:

>> ldec2bin(vpa('13339262925365424727'))

ans =

1011100100011110100101001111010011000111111100011011001001010111

/更新:

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

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

sdec2bin = 

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

>> sdec2bin(sym('13339262925365424727'))

ans =

1011100100011110100101001111010011000111111100011011001001010111

整数似乎很长,也许你应该尝试de2bi函数; http://www.mathworks.com/help/comm/ref/de2bi.html

假设输入小于intmax('uint64') ,如示例中所示,这是一个不需要Symbolic Math工具箱的解决方案。 这支持两个输入参数,匹配dec2bin ,是矢量化的,应该更快:

function s=int2bin(d,n)
%INT2BIN  Convert nonnegative integer to a binary string
if isempty(d)
    s = '';
    return;
end
d = d(:);
if ~isinteger(d) || any(d < 0)
    error('int2bin:InvalidIntegerInput',...
          'First input must be a nonnegative integer class array.');
end
if nargin < 2
    n = 1
else
    n = round(double(n));
end
m = double(nextpow2(max(d)));
s = [repmat('0',length(d),n-m) rem(bsxfun(@bitshift,d,1-m:0),2)+'0'];

如果您不介意性能稍差并且更喜欢单行匿名函数,请尝试:

int2bin = @(d,n)char(rem(bsxfun(@bitshift,d(:),1-max(n,double(nextpow2(max(d(:))))):0),2)+'0');

这还是一个使用bitand代替bitshift

int2bin = @(d,n)char(~~bsxfun(@bitand,d(:),2.^(max(n,nextpow2(max(d(:)))):-1:0))+'0');

以上所有版本都假设d是非负整数类变量,例如uint64(13339262925365424727) ,并且该n是非负数字标量。 你可以在我的GitHub上找到全功能的int2binbin2int函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM