спасибо @aardvarkk, но вот ускоренная версия его алгоритма (+- в 100 раз быстрее):
N=100;
strbin = char(randi(2,1,N)+'0'-1);
pows2 = 2.^(N-1:-1:0);
value=pows2*(strbin-'0')';
Диапазон double
идет только до 1.79769e+308
, что 2^1024
плюс-минус. С этого момента value
будет Inf
или NaN
. Так что вам все равно нужно найти другой способ сохранения полученного числа.
Последнее преимущество этого алгоритма: вы можете кэшировать pows2
для большого числа, а затем использовать его часть для любого нового strbin длины N:
Nmax = 1e8; % already 700MB for pows2, watch out!
pows2 = 2.^(Nmax-1:-1:0);
а затем использовать
value = pows2(Nmax-N+1:end)*(strbin-'0')';
Решение числовой верхней границы Matlab
В File Exchange есть инструмент под названием vpi: http://www.mathworks.com/matlabcentral/fileexchange/22725
Это позволяет вам использовать действительно большие целые числа (2^5000
? нет проблем). Это только медленнее (намного) при расчете всего, я не предлагаю использовать мой метод выше с этим. Но эй, вы не можете иметь все!
Загрузите пакет, addpath
его, и следующее может работать:
N=3000;
strbin = char(randi(2,1,N)+'0'-1);
binvals=strbin-'0';
val=0;
twopow=vpi(1);
for ii=1:N
val=val+twopow*binvals(N-ii+1);
twopow=twopow*2;
end
person
Gunther Struyf
schedule
10.09.2012
dec2bin
, а неbin2dec
?dec2bin
преобразует число в двоичное, а не двоичную строку в число... - person aardvarkk   schedule 10.09.2012