% [s a e] = convert2float(x, q, l) gibt die normalisierte
% Gleitkommadarstellung der Zahl x zur Basis q mit der Mantissenlänge l aus.
% x = (-1)^s*a*q^e
%
% s = Vorzeichen (0 = positiv) (1 = negativ)
% a = Mantisse der Zahl (q-adische Darstellung)
% z.B.: 0.123456789 -> [1 2 3 4 5 6 7 8 9]
% e = Exponent          (dezimal-Darstellung) (für deren umwandlung in eine
% q-adische Form nutze man convert2base() in den vorherigen Aufgaben)
% Dabei werden die Ziffern der Mantisse als Vektor der Länge l ausgegeben,
% wodurch sich damit gut rechnen lässt.

% Aufgabe:  Übungszettel 5, 3a
% Autor:    Matthias Bosewitz
% Tutorium: Jan-Henning Hansen, Mo 10-12


function [s a e] = convert2float(x, q, l)  
  
  a = zeros(1,l);   % leere Mantisse zu Beginn
  e = 0;            % Noch kein Exponent zu Beginn

  if (x < 0)        % Negative Zahlen
    s = 1;          % Vorzeichen einzeln
    x = -x;         % Meine Funktion bearbeitet nur den Betrag
  else              % Positive Zahlen
    s = 0;          % Vorzeichen einzeln
  end
  
  if (q < 2)  ||  (l < 1)           % Fehlerhafte Eingaben
    return;                         % -> Abbrechen
  end
  
  
  % Hächste Stelle ermitteln:
  if (x ~= 0)                         % Log(0) ist nicht definiert
    e = floor(log(x) / log(q))+1;     % Logarithmus zur Basis q der Zahl -> e  (*)
    n = round( x * q^(l-e) );         % x in die Ganzzahl mit l Stellen
                                      % umwandeln (natürlich mit Runden)
  else
    n = 0;                            % n ist auch 0
  end
  
  
  for i=l:-1:1         % Alle Stellen erzeugen (Zahlen wie immer falschherrum)
    a(i) = rem(n,q);   % Den Rest in a speichern
    n    = floor(n/q); % Zahl durch q Teilen (Rest wird oben schon
                       % benutzt, wesgegen abgerundet wird)
  end
  
  if (n ~= 0)          % Eigentlich sollten keine Stellen übrig bleiben ...
    a(1) = 1;          % ... wenn doch wurde z.B. 0.99999 -> 1.0000 gerundet
    e = e + 1;         % e muss um 1 erhöht werden 
  end
      
end

% Anmerkungen:
% (*:)
% Für relativ kurze Mantissenlänge l funktioniert die Methode mit dem
% Logarithmus relativ zuverlässlich. Bei größeren Werten macht sich
% bemerkbar, dass auch Matlab nur Fließkommazahlen nutzt und die
% entsprechenden Ungenauigkeiten auftreten die dann durchaus für unlogische
% Darstellungen sorgen können.
