Konwersja bin na dec, algorytm.

0

Witam !

Stworzyłem kod algorytmu, który konwertuje liczbę binarna z przecinkiem na liczbę decymalna.
Algorytm działa na schemacie hornera. Traktujemy część całkowitą i część ułamkową jak jedną liczbę całkowitą. Za pomocą schematu Hornera wyznaczamy wartość tej liczby, a wynik mnożymy przez wagę ostatniej pozycji liczby wejściowej, która to obliczam funkcja potega

Czy ten algorytm jest efektywny ? Czy mógłby ktoś doradzić mi co można by zmienić, lub czy istnieje efektywniejszy sposób algorytmiczny ?

Oto kod:

function konwert(bin:string):extended;
function potega(n:byte):real;
begin
  if n=0 then potega := 1 else
  potega := potega(n-1) * (1/2);
end;
var
I,w : integer;
przecinek : integer;
n : byte;
begin
n := Length(bin);
w := StrToInt(bin[1]);
przecinek := n;
for i :=1 to n-1 do
begin
  if bin[i] <> ',' then
  begin
    if bin[i+1] = ',' then w:=w*2+StrToInt(bin[i+2]) else
    w:=w*2+StrToInt(bin[i+1]);
  end else
  begin
     przecinek := i;
  end;
end;
result:=w * potega(n-przecinek);
end;

Dziękuję za pomoc.

0

Ja zawsze dzieliłem łańcuch binarny na dwie części ze względu na przecinek i rozbijałem osobno.

Wydajnościowo podobnie - bo w obu przypadkach trzeba przetworzyć każdą cyfrę kodu binarnego. W moim dochodziło jeszcze znalezienie przecinka, a w twoim jest mnożenie (No dobra - mnożenie zajmie odrobinę mniej czasu).

0

Po chwili pomyślenia odnalazłem fatalny błąd w środku pętli, kod jest zbyteczny, po modyfikacji najlepsza wersja wygląda tak:

function konwert(bin:string):extended;
function potega(n:byte):real;
begin
  if n=0 then potega := 1 else
  potega := potega(n-1) * (1/2);
end;
var
I,w : integer;
przecinek : integer;
n : byte;
begin
n := Length(bin);
w := StrToInt(bin[1]);
przecinek := n;
for i :=2 to n do
begin
  if bin[i] <> ',' then
  begin
    w:=w*2+StrToInt(bin[i]);       
  end else
  begin
     przecinek := i;              
  end;
end;
result:=w * potega(n-przecinek);   
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1