Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#7

Re: die Division eines Taschenrechners

  Alt 11. Okt 2009, 17:23
Darf ich an dieser Stelle anmerken, dass deine Multiplikation nicht korrekt ist, die funktion nur, wenn beide zahlen >1 sind und keine Kommastellen haben...
//edit: ah, aber nicht so richtig... da fehlt auch die nachkommabehandlung so ein bisschen: Beispiel: 0.1*5.5=0.6, was daran liegt dass du (um zu wissen, wie oft du die schleife durchlaufen musst) die variable durchlauf rundest.

Zur Division Ich habe mir folgendes überlegt. Nehmen wir mal die Funktion von DeddyH und nennen sie nicht Dividieren sondern "SimpleDIV(x:integer,y:integer):integer"

damit kannst du also gucken, wie oft quasi y in x reinpasst.

So und den rest (also die kommastellen) berechnest du jetzt über die gute alte Schuldivision


10:8=1,25
------
20
-16
------
40
-40
------
0

Jetzt zur konkreten Umsetzung:

Ich würde etwas elementarer anfangen.

Definiere dir erstmal einen eigenen Zahlentyp
z.B.

Delphi-Quellcode:
TDezimalstelle=0..9
TZahl=record
   Vorkomma:int64;
   Nachkomma:array of TDezimalstelle
Damit kannst du auch wunderschön auf die einzelnen Nachkommastellen zugreifen. Denn ich hatte jetzt gerade das problem, dass ich bei der Division den Wert, den SimpleDIV liefert mit 0.1 multiplizieren wollte, um ihn an die erste Nachkommastelle zu bringen, was aber nicht so recht funktionieren wollte. So kannst du jetzt sachen Zahl.Nachkomma[1]= irgendwas

Also:

Delphi-Quellcode:

 const Stellen=10;

type

  TDezimalStelle=0..9;
  TZahl=record
    Vorkomma:int64;
    Nachkomma:array of TDezimalStelle;
  end;

{...}

function SingleDIV(x,y:extended):integer;
begin
  Result := 0;
  while x >= y do
    begin
      Result := Result + 1;
      x := x - y;
    end;

end;

function TZahlToExtended(Zahl:TZahl):extended;
var i:integer;
{hier habe ich mir erlaubt, mathematische Funktionen einzubauen, da diese Funktion ja zunächst nur der Darstellung von Zahlen dient und nicht der internen Berechnung...}
begin
  result:=Zahl.Vorkomma;
  for i:=0 to Stellen do
   begin
    result:=result+(Zahl.Nachkomma[i] / (power(10,(i+1))));
   end;
end;


function dividieren(x,y: extended): extended;
var
i,j:integer;
Zahl : TZahl;
begin

  //berechne x/y

  setlength(Zahl.Nachkomma,Stellen+1);
  Zahl.Vorkomma:=SingleDIV(x,y);
  for i:=1 to Zahl.Vorkomma do
    x:=Subtrahieren(x,y);

  for j:= 0 to Stellen do
   begin
     x:=multiplizieren(x,10);
     Zahl.Nachkomma[j]:=SingleDIV(x,y);
     For i:=1 to Zahl.Nachkomma[j] do
       x:=subtrahieren(x,y);
   end;
  result:=TZahlToExtended(Zahl);

end;
Und nochwas:

In der Mathematik führt man die Subtraktion durch die Addition ein:

Also müsstest du, um es wirklich sauber zu machen sagen:

subtraktion(x,y):= addition(x,-y)

Selbes gilt für die Multiplikation (allerdings müsste man dann die division so umschreiben, dass sie keine Multiplikation mehr benutzt, sonst dreht man sich im Kreise)...aber das wäre ja durch eine kleine for schleife machbar.

Multiplikation:=Division(x,Division(1,y))
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat