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))