Rechnen mit Kommazahlen

15/09/2008 - 11:07 von Mphak | Report spam
Hallo,

Da ich aus dem Fehler nicht schlau werde und ihn selbst irgendwie
nicht beheben kann, wollte ich mal hier nachfragen, ob mir jemand
dieses Phànomen erklàren kann.

Ich möchte ein Programm schreiben, dass per Zufallsgenerator eine Zahl
ermittelt, die zwei Stellen nach dem Komma hat (Bsp. 0.53).
Wenn das Programm bei 0.00 angekommen ist, soll es aus der Schleife
gehen und eine Ausgabe bringen.

An und für sich habe ich auch das Programm so gut wie fertig, aber es
tritt immer das Phànomen auf, dass Perl nie bei 0.00 ankommt.

Daraufhin habe ich diese Zeilen hier getestet und obwohl es recht
logisch ist, von 1.00 immer 0.10 abzuziehen beginnt Perl mit
irgendwelchen Berechnungen, die mir unbegreiflich sind.

Code:
___________________________________________________________________________________

use strict;

my $ende;
my $zahl1 = 0.10;
my $zahl2 = 0.03;
my $ergebnis = 1.00;

while($ergebnis >= 0.00)
{
$ergebnis = $ergebnis - $zahl1;
print "$ergebnis";
}

my $stop = <STDIN>;
_____________________________________________________________________________________

Und hier ist die Ausgabe des Programms:
_____________________________________________________________________________________

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
1.38777878078145e-016
-0.0999999999999999
_____________________________________________________________________________________

Hat jemand von euch eine Idee, was ich da falsch mache.
Oder was Perl da falsch macht?

Ich danke euch schon mal für eure Bemühungen.
 

Lesen sie die antworten

#1 Moritz Lenz
15/09/2008 - 11:31 | Warnen spam
Mphak wrote:

0.3
0.2
0.1
1.38777878078145e-016
-0.0999999999999999



Das ist das typsiche Floating point-Problem: Der Rechner stellt
Kommazahlen in einer Art und Weise da, in der manche Dezimalbrüche nicht
exakt gespeichert werden können. Abhilfe schafft, einfach immer ein das
Hundertfache in der Variablen zu speichern, und vor dem Ausgeben durch
100 zu teilen (eventuell mit prinf auf zwei Nachkommastellen begrenzen).

Moritz


Moritz Lenz
http://perl-6.de/ http://moritz.faui2k3.org/

Ähnliche fragen