我正在使用Matlab的dec2bin将十进制数转换为二进制字符串。但是,我得到了错误的结果。例如:
>> dec2bin(13339262925365424727)
ans =
1011100100011110100101001111010011000111111100011011000000000000
我在C ++实现和wolfram alpha中检查了两者,正确的结果是:
1011100100011110100101001111010011000111111100011011001001010111
我使用Matlab的desc2bin有什么问题吗?
谢谢,
吉尔。
答案 0 :(得分:8)
您的代码相当于:
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
答案 1 :(得分:2)
整数似乎很长,也许你应该尝试de2bi
函数;
http://www.mathworks.com/help/comm/ref/de2bi.html
答案 2 :(得分:2)
假设输入小于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'];
,如示例中所示,这是一个不需要Symbolic Math工具箱的解决方案。这支持两个输入参数,匹配dec2bin
,是矢量化的,应该更快:
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)
是非负integer class变量,例如n
,而int2bin
是非负数字标量。您可以找到功能齐全的bin2int
和gen = (x*2 for x in [1,2,3,4,5])
函数on my GitHub。