PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl Typecast-Fehler?



Bonkers
08.03.2010, 20:34
Hey,
Führt das mal aus:



for (my $counter = -0.5; $counter < 0.5; $counter += 0.1) {
print $counter."\n";
}


Ich bekomme da die Ausgabe:



-0.5
-0.4
-0.3
-0.2
-0.1
-2.77555756156289e-17
0.1
0.2
0.3
0.4


Wie kommt sowas zu Stande? Ich schreibe gerade ein komplexes Script um einige Berechnungen automatisch durchzuführen, und wundere mich warum da Mist raus kommt .___. Liegt der Fehler bei mir?

HaschischHans
08.03.2010, 20:44
ich sehe keine fundamental feller im program kan sein das perl erst float und dann double wil und deshalb so komische ergebnis spuckt xD

GregorSamsa
08.03.2010, 21:01
O.O wie schreibst du denn?

Und nein, in einer Schleife kann man nicht wirklich "fundamentale" Fehler machen, wenn die nur .1 runterzählen soll.

Ich denke das könnte ein Typecast-Fehler sein - ich kenn leider Perl nicht allzugut.
Kannst du der Variable einen festen Datentyp (float z.B.) zuweisen?

Bonkers
08.03.2010, 21:27
Und nein, in einer Schleife kann man nicht wirklich "fundamentale" Fehler machen, wenn die nur .1 runterzählen soll.


Das ist ein Teil eines viel komplexeren Programmes, ich bin ja schon froh dass ich mit Perl leicht auch kompliziertere Berechnungen durchführen kann.


Kannst du der Variable einen festen Datentyp (float z.B.) zuweisen?

Nicht dass ich wüste. Arrays gehen natürlich, aber ansonsten benutze ich immer das $. Eine Googel-Suche hat mir auch keine anderen Möglichkeiten aufgezeigt.


keine fundamentalen fehller im programm

Danke für die Hilfe, aber gib dir doch ein bisschen Mühe, ja?

inout
08.03.2010, 21:51
Fließkommazahlen können niemals exakt dargestellt werden, es sind halt immer nur mehr oder weniger grobe Annäherungen an diese. Da können sehr schnell Rundungsfehler o.Ä. auftreten. z.B. sieht 2 + 0.1 intern aus wie 2.09999999... weil 2.1 nicht exakt dargestellt werden kann.

So könnte es aber funktionieren:

for(-5..4){
my $i = $_/10;
print "$i\n";
}

GregorSamsa
08.03.2010, 22:32
Das ist ein Teil eines viel komplexeren Programmes, ich bin ja schon froh dass ich mit Perl leicht auch kompliziertere Berechnungen durchführen kann.

Damit meinte ich ja nur, dass diese Schleife zwar nicht funktioniert, aber in den 3 Zeilen Code kann man nun wirklich keine Fehler machen ;)

Aber sowas wie Lolcat sagte meinte ich auch.
Ansonsten kannst du acuh versuchen gabze Zahlen in der Schleife herunterzuzählen, und im Output -0.5 u rechnen - probier mal aus, ich weiß allerdings nicht, wie Perl intern tickt und ob das funzt.

Bonkers
09.03.2010, 20:16
Danke für die Antworten, aber da muss ich mich wohl erstmal mit beschäftigen bevor ich weiterskripte, nicht dass durch solche Unregelmäßigkeiten meine Arbeit unbrauchbar wird.