[Pascal] Division mit 0er-Dezimalzahl

blu

antiheldIn
ID: 134987
L
14 Mai 2006
90
16
Hi!

Mich beschäftigt derzeit folgendes Problem:
Ich möchte eine beliebige (Dezimal-)Zahl durch eine weitere vorher festgelegte (Dezimal-)Zahl dividieren. Sobald aber der Nenner kleiner als 0.50 wird, gibt mir Pascal ein "Division by Zero", was so allerdings nicht sein soll..
Auszug des Codes (vereinfachte Problematik):
Code:
avar[1]:= 2;
avar[2]:= 1;
avar[3]:= 0.50;
avar[4]:= 0.20;
avar[5]:= 0.10;
avar[6]:= 0.05;

ea:= ausgabe/avar[i];

ausgabe, ea und avar[1..6] sind mit real deklariert.
Wie gesagt, bis einschließlich zum Durchlauf von 0.50 klappt das auch, bloß danach mag er nicht mehr dividieren, sieht alles was kleiner als 0.50 ist als 0 an.

Ich hoffe die Fragestellung ist verständlich. Danke :)
 

blu

antiheldIn
ID: 134987
L
14 Mai 2006
90
16
Hat sich erledigt.. Die Problematik lag in einem späteren Bereich.

Nachtrag: Gibt es eine Möglichkeit, eine Zahl, die mit "real" deklariert wurde, auf die Vorkommazahl zu beschränken (also keine Aufrundung?). DIV/MOD funktioniert ja nur bei integer.. und int(..) rundet.
 
Zuletzt bearbeitet:

theHacker

sieht vor lauter Ads, den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.643
1.280
In anderen Sprachen gibts floor(). Keine Ahnung, obs das bei Pascal auch gibt, aber die Chance is hoch.
 

flaschenkind

Well-known member
ID: 118459
L
20 April 2006
4.507
337
Bin mir nicht sicher, aber war das nicht trunc()? Das macht afaik aus jedem Float einen Integer, also rundet es im Grunde ab, denn bei 1,9 würd auch 1 rauskommen ;)
 

blu

antiheldIn
ID: 134987
L
14 Mai 2006
90
16
Hi,

@theHacker
floor() war es nicht, aber danke. :)

@flaschenkind
Ja, darauf bin ich gestern auch noch gekommen.
Es ergibt sich in meinem Algorithmus aber ein Problem, das ich so nicht nachvollziehen kann.
Also folgendes:
Ich habe eine fixe Zahl, die sich durch die Subtraktion zweier anderer Zahlen ergibt. Diese fixe Zahl (real) soll nun in größt möglichen Ausgaben ausgegeben werden (2, 1, 0.5, 0.20, 0.10, 0.05), also eine Art Wechselgeldschacht.
Prinzipiell funktioniert folgendes System (und bei diesem System muss es bleiben, es gibt natürlich noch andere Methoden, es soll aber in der Struktur so bleiben:)

Code:
avar[1]:= 2; 
avar[2]:= 1; 
avar[3]:= 0.50; 
avar[4]:= 0.20; 
avar[5]:= 0.10; 
avar[6]:= 0.05; 
i:= 1;
ausgabe:= bezahlung-preis;

while ausgabe>=0.05 do begin
                                    ea:= ausgabe/avar[i];
                                    aa:= trunc(ea);
                                    ausgabe:= ausgabe - (aa * avar[i]);
                                    writeln(aa, ' x ', avar[i]:1:2, ' Euro ausgegeben.');
                                    i:=i+1;
                                  end;
readln
end.

Nun ergeben sich für mich kaum nachvollziehbare Probleme:
Das Programm behält in vielen Fällen einen Rest (ausgabe) von 0.05 und
a) geht mit diesem Rest nicht mehr durch die Schleife. Oder aber
b) es klappt.
Es scheint abhängig vom Anfangswert ausgabe zu sein, hier entsprechende Programmlaufscreens:
 
Zuletzt bearbeitet: