% [s a e] = float_addition(s1,a1,e1, s2,a2,e2 , q) addiert zwei gleich lange Gleitkommazahlen
% s = Vorzeichen
% a = Mantissenvektor
% e = Exponent
% q = Basis in der die Zahlen vorliegen
% [s1 a1 e1] erste  Fließkommazahl
% [s2 a2 e2] zweite Fließkommazahl

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

% z.B.: q = 10, L=4
% e =  2  :  12.17
% e = -1  :    . 8571

function [s a e] = float_addition( s1, a1, e1, s2, a2, e2, q)
  L = length(a1);           % Länge der Mantissen
  if (length(a2) ~= L)      % Ungleiche Längen ->
    return;                 % Abbrechen
  end

  s = 0;                    % Vorzeichen 0
  a = zeros(1,L);           % Mantisse für die Ausgabe erstellen
  e = max(e1, e2);          % Exponent an größere Zahl anpassen
  
  s1 = (-1)^s1;             % Vorzeichen erzeugen
  s2 = (-1)^s2;             % Vorzeichen erzeugen
  Ueb = 0;                  % Übertrag ist erstmal 0
  
  if (s1 == -1) && (s2 == -1)   % Zwei negative Zahlen
    s1 = 1;                     % Stattdessen 2 positive 
    s2 = 1;                     
    s =  1;                     % Zahl hinterher mit negativem Vorzeichen versehen
  else
    s = 0;                      % Zahl positiv lassen
  end
      
  for i=L:-1:1              % Stellen addieren / Subtrahieren
    % [e-i e1 e1-L e1-e+i]          % Nur für Debugging-Zwecke
      
    if (e-i < e1) && (e-i > e1-L)   % Wenn die Zahl dort eine Ziffer besitzt
      n1 = a1(e1-e+i);              % diese Ziffer verwenden
    else                            % Wenn nicht
      n1 = 0;                       % 0 verwenden
    end
    if (e-i < e2) && (e-i >= e2-L)  % Wenn die Zahl dort eine Ziffer besitzt
      n2 = a2(e2-e+i);              % diese Ziffer verwenden
    else                            % Wenn nicht
      n2 = 0;                       % 0 verwenden
    end

    a(i) = s1*n1 + s2*n2 + Ueb;     % Die Zahlen addieren
    
    Ueb = 0;                        % Übertrag zurücksetzen
    if (a(i) >= q)                  % Wenn man über dem Ziffernbereich ist ...
      a(i) = a(i) - q;              % Rest der Division durch q
      Ueb = 1;                      % Übertrag = 1
    elseif (a(i) < 0)               % Wenn man unter dem Ziffernbereich ist ...
      a(i) = a(i) + q;              % Rest der Division durch q
      Ueb = -1;                     % Übertrag ist natürlich negativ
    end
    
  end
   
  if (Ueb == 1)                     % Zahl ist zu groß
    for i=L:-1:2
      a(i) = a(i-1);                % Alle Stellen um 1 verschieben
    end
    a(1) = 1;                       % 1 davorsetzen
    e = e+1;                        % Komma ist natürlich jetzt auch woanders
  elseif (Ueb == -1)                % Zahl wird negativ
    for i=1:L
      a(i) = rem(q-a(i),q);         % So eine Art Komplement bilden
    end
    s = 1;                          % Zahl ist negativ
  end
  % Theoretisch kommen nicht unbedingt normalisierte Darstellungen herraus,
  % was aber auch nicht unbedingt gefordert ist.
  % z.B. [s a e] = float_addition( 0,[1 2 3],0  ,  1,[1 2 2],0  , 10)
  % Deshalb findet sich hier keine
  % while-Schleife die das Komma so lange verschiebt bis keine 0en mehr am
  % Beginn von a stehen. Auch das Runden der Ergebnisse habe ich mir hier
  % gespart da es das Ergebnis trotzdem nur wenig bessert.
  
end