Thread Richtig INTen (14 answers)
Opened by bianca at 2009-12-24 09:27

bianca
 2012-01-17 19:29
#155518 #155518
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
2012-01-17T18:12:29 GUIfreund
Ich habe nur gesagt, dass meine sub mit_sprintf beim Testfall
Quote
.57 * 100,'=57',
das richtige Resultat liefert. Und das stimmt nach wie vor.

Ja, eine Spitzfindigkeit. Klar liefert es das "richtige" Ergebnis. Aber es bringt mir ja nichts, wenn das computerrichtige Ergebnis mathematischer Nonsens ist. 0.57 * 100 ist nun mal nicht 56 sondern 57, egal ob ich das int'e oder nicht :))
Ich schrieb ja auch, dass es kein primäres int Problem ist. Aber man muss ja trotzdem die Rechenschwächen irgendwann oder irgendwo ausgleichen.

2012-01-17T18:12:29 GUIfreund
Es kann auch gar nicht anders sein, denn in deinem Testskript (aus dem OP) wird an die sub $sub der exakte Wert 57 übergeben. Da kann int() nichts verderben.

Auf meinen Systemen ist es egal, ob ich es in die sub übergebe oder direkt einsetze, es kommt immer 56 raus und das ist und bleibt für mich "falsch". Und ich weiß auch nicht, in welchem Zusammenhang man dieses Ergebnis berechtigterweise als richtig bezeichnen könnte. Sein Zustandekommen mag erklärbar sein, das macht es aber deshalb nicht richtiger :)
Und am Ende wollte ich nicht nachweisen, dass int etwas verdirbt sondern ich nutze das int'en mit eigener Routine eben an einigen Stellen zur Korrektur falscher Ergebnisse.

Ist halt tückisch. Auf den ersten Blick übergibst du .57*100 an int() und es kommt 56 raus. Rechnest du ohne int() kommt 57 raus, siehe hier:
Code (perl): (dl )
1
2
print "int : ".(int(.57*100))."\n";
print "ohne: ".(.57*100)."\n";

Quote
int : 56
ohne: 57

Was ist zuerst verdächtig? Klar, kann nur int() sein. Wenn man tiefer schaut natürlich nicht, denn int() bekommt ja schon Nonsens geliefert. Jetzt kann man auf zweierlei Arten reagieren: Entweder du rufst nach jeder Rechenoperation mit Kommazahlen eine Korrekturroutine auf oder du machst es kombiniert mit int().
Und die Korrekturroutine ist ja nicht ganz trivial, da der PC seine eigenen Fehler nicht beheben kann. Also mache ich int(), denn ich weiß ja meistens, wieviele Stellen ich brauche. Also vorher Komma verschieben, int'en und Komma wieder zurück.
Vom Code her erscheint mir das als einer der einfachsten Wege, dem PC das korrekte Rechnen beizubringen :)

Editiert von bianca: Textergänzung

Editiert von bianca: Code ergänzt
Last edited: 2012-01-17 19:55:08 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Richtig INTen