[英]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');
int2bin = @(d,n)char(~~bsxfun(@bitand,d(:),2.^(max(n,nextpow2(max(d(:)))):-1:0))+'0');
以上所有版本都假設d
是非負整數類變量,例如uint64(13339262925365424727)
,並且該n
是非負數字標量。 你可以在我的GitHub上找到全功能的int2bin
和bin2int
函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.