|
You last visited: Today at 16:58
Advertisement
Problem bei addition von Kommazahlen
Discussion on Problem bei addition von Kommazahlen within the AutoIt forum part of the Coders Den category.
03/26/2012, 17:32
|
#1
|
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
|
Problem bei addition von Kommazahlen
Hallo,
Ich beschäftige mich gerade mit GDIPlus und diesbezüglich mit Parabeln usw.
Dabei habe ich eine Schleife nach diesem Schema:
Code:
$x = -100
do
$x+=0.01
ConsoleWrite($x & @CRLF)
Until $x >= 100
Warum entstehen nun Zahlen mit mehr als 2 Nachkommastellen?
-99.99
-99.98
-99.97
-99.96
-99.95
-99.94
-99.93
-99.92
-99.91
-99.8999999999999
-99.8899999999999
-99.8799999999999
-99.8699999999999
-99.8599999999999
-99.8499999999999
-99.8399999999999
-99.8299999999999
-99.8199999999999
-99.8099999999999
-99.7999999999999
-99.7899999999999
-99.7799999999999
-99.7699999999999
-99.7599999999999
-99.7499999999999
-99.7399999999999
-99.7299999999999
-99.7199999999999
-99.7099999999999
-99.6999999999998
-99.6899999999998
-99.6799999999998
-99.6699999999998
-99.6599999999998
-99.6499999999998
-99.6399999999998
-99.6299999999998
-99.6199999999998
-99.6099999999998
-99.5999999999998
-99.5899999999998
-99.5799999999998
-99.5699999999998
-99.5599999999998
-99.5499999999998
-99.5399999999998
-99.5299999999998
-99.5199999999998
-99.5099999999997
-99.4999999999997
-99.4899999999997
-99.4799999999997
-99.4699999999997
-99.4599999999997
-99.4499999999997
-99.4399999999997
-99.4299999999997
-99.4199999999997
-99.4099999999997
-99.3999999999997
-99.3899999999997
-99.3799999999997
-99.3699999999997
-99.3599999999997
-99.3499999999997
-99.3399999999997
-99.3299999999997
-99.3199999999997
-99.3099999999996
-99.2999999999996
-99.2899999999996
-99.2799999999996
-99.2699999999996
-99.2599999999996
-99.2499999999996
-99.2399999999996
-99.2299999999996
-99.2199999999996
-99.2099999999996
-99.1999999999996
-99.1899999999996
-99.1799999999996
-99.1699999999996
-99.1599999999996
-99.1499999999996
-99.1399999999996
|
|
|
03/26/2012, 17:43
|
#2
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Liegt wohl an der internen Speicherung. Da nur begrenzt Speicherplatz zur Verfügung steht, muss man Abstriche bei der Genauigkeit machen. Bedenke nur: Zwischen 0 und 1 liegen unendlich viele Kommzahlen! Man trennt den Speicherbereich ungefähr folgendermaßen auf:
vorzeichenbit | exponent | mantisse
Jetzt finden intern noch Normierungsverfahren statt, damit mehr Zahlen abgespeichert werden können und zum leichteren Rechnen für das Rechenwerk. Das alles verändert die Zahl natürlich. Sprich: Du erhälst mehr als zwei Nachkommastellen wegen der internen Speicherung der Zahl.
Lösung: Runde nach zwei Stellen.
|
|
|
03/26/2012, 17:46
|
#3
|
elite*gold: 0
Join Date: Mar 2011
Posts: 8,645
Received Thanks: 3,454
|
^
Aber zum Runden der Zahl kannst du Round() benutzen
|
|
|
03/26/2012, 17:48
|
#4
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
Quote:
Originally Posted by xNopex
Liegt wohl an der internen Speicherung. Da nur begrenzt Speicherplatz zur Verfügung steht, muss man Abstriche bei der Genauigkeit machen. Bedenke nur: Zwischen 0 und 1 liegen unendlich viele Kommzahlen! Man trennt den Speicherbereich ungefähr folgendermaßen auf:
vorzeichenbit | exponent | mantisse
Jetzt finden intern noch Normierungsverfahren statt, damit mehr Zahlen abgespeichert werden können und zum leichteren Rechnen für das Rechenwerk. Das alles verändert die Zahl natürlich. Sprich: Du erhälst mehr als zwei Nachkommastellen wegen der internen Speicherung der Zahl.
Lösung: Runde nach zwei Stellen.
|
Bei einer nativen Sprache wie C++ mag das stimmen. Aber da AutoIt dynamische Typen verwendet könnte es sein, dass alle Zahlen als Strings abgespeichert werden und je nach Verwendung intern in Zahlen umgewandelt werden.
|
|
|
03/26/2012, 17:55
|
#5
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Quote:
|
Bei einer nativen Sprache wie C++ mag das stimmen. Aber da AutoIt dynamische Typen verwendet könnte es sein, dass alle Zahlen als Strings abgespeichert werden und je nach Verwendung intern in Zahlen umgewandelt werden.
|
Trotzdem müssen die Dezimalzahlen abgespeichert werden. Und das Rechenwerk schließlich mit den Zahlen rechnen. Sie werden eben erst zur Laufzeit dann umgewandelt.
|
|
|
03/26/2012, 19:58
|
#6
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
um dem entgegen zu wirken kannst du dir über stringfunktionen aber durchaus eine eigene funktion schreiben, welche nachkommastellen und vorkommastellen seperat als integer handelt, und somit der ungenauigkeit der floatingpoint operation entgegen wirken.
|
|
|
03/26/2012, 20:07
|
#7
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Quote:
|
um dem entgegen zu wirken kannst du dir über stringfunktionen aber durchaus eine eigene funktion schreiben, welche nachkommastellen und vorkommastellen seperat als integer handelt, und somit der ungenauigkeit der floatingpoint operation entgegen wirken.
|
Oder einfach die Zahlen jeweils mit 100 Multiplizieren und am Schluss wieder durch 100 teilen.
|
|
|
03/26/2012, 20:16
|
#8
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by xNopex
Oder einfach die Zahlen jeweils mit 100 Multiplizieren und am Schluss wieder durch 100 teilen.
|
in diesem falle mag das funktionieren, bei unbekannter bzw varrierender anzahl der nachkommastellen hingegen kann man so nicht an das problem gehen, zumal bei hoher anzahl von nachkommastellen durch die division ja auch wieder rundungsfehler entstehen könnten.
|
|
|
03/26/2012, 20:30
|
#9
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
Quote:
|
bei unbekannter bzw varrierender anzahl der nachkommastellen hingegen kann man so nicht an das problem gehen
|
Eigentlich ist das gängige Praxis. Natürlich geht das nicht immer, aber in sehr sehr vielen Fällen. Es gibt dabei auch Möglichkeiten so bei unbekannter oder variierender Anzahl an Nachkommastellen zu verfahren.
Man wird dabei auch immer genauere Ergebnisse erzielen als bei der gleichen Rechnung in Gleitkommarithmetik. Je mehr Rechenschritte notwedig sind, desto genauere Ergebnisse wird dieses Verfahren liefern. Rundungsfehler treten dann wenn überhaupt im letzten Schritt bei der Rücktransformation auf.
|
|
|
03/26/2012, 21:27
|
#10
|
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
|
Naja, in meinem Falle hat das Runden auf 2-4 Kommastellen vollkommen gereicht 
Danke
|
|
|
Similar Threads
|
WTB HON account with all limited addition avatars emerald name ect
04/22/2012 - Heroes of Newerth - 3 Replies
Looking for an old hon account
must have all the limited edition avatars gold pebs, valk, swiftblade ect ect
emerald name is a must
msg me for more details
aim lguid (at) live dot com
|
iBot Addition - DexProjects
01/30/2012 - SRO Hacks, Bots, Cheats & Exploits - 8 Replies
Hello again !
I upgrade my old project for iBot.
It's coded in AutoIT again.
It's easy and simple like always.
Minimal processor usage.
For now it contains :
- AutoBuffer
- Hider
|
Addition in der Konsolenausgabe...
01/07/2012 - C/C++ - 20 Replies
Hi,
weiß zufällig jemand warum das hier nicht funktioniert?
|
I want a way purposes in addition to the merchant
12/13/2011 - Rappelz Private Server - 9 Replies
welcome
guys i want to add purposes to the merchand without the program because there is no purposes that i want
like the wings, the growns 150 and the chips
and thanks for all
|
All times are GMT +1. The time now is 16:58.
|
|