簡體   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