Ungenauigkeit Float/Double beim Rechnen
Übersicht

![]() |
RatchetBetreff: Ungenauigkeit Float/Double beim Rechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe grad ein echtes Problem beim Rechnen mit Floats/Doubles. Die Genauigkeit der beiden Typen bringt mich noch ins Grab.
Code: [AUSKLAPPEN] x: Double = 7.7
y: Double = x - 1.1 Print y Ich möchte statt 6.5999997854232788 aber 6.6 bekommen. Wie stelle ich das am besten an? |
||
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro] |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ohne es gerade getestet zu haben:
Code: [AUSKLAPPEN] x: Double = 7.7
y: Double = x - Double(1.1) Print y Eventuell? |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
Ratchet |
![]() Antworten mit Zitat ![]() |
---|---|---|
Leider nein. In meinem richtigen Programm sind es direkt zwei Double Variablen. | ||
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro] |
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das sind die Typischen Rechenungenauigkeiten, die beim Rechnen mit fließkommazahlen auftreten.
Ich würde diese einfach ignorierien und nur bei der Ausgabe korrekt formatieren ( int(value*100)/100.0 ) |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
![]() |
Ratchet |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es geht mir ja gerade um die Ausgabe. Dein Beispiel funktioniert aber leider genauso wenig ![]() |
||
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro] |
![]() |
amon |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst bruceys modul zur stringformatierung ähnlich wie in c einsetzen
http://code.google.com/p/maxmods/wiki/FormatModule |
||
![]() |
Ratchet |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das wollte ich eigentlich vermeiden, aber es wird wohl darauf hinauslaufen. Danke. | ||
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro] |
![]() |
amon |
![]() Antworten mit Zitat ![]() |
---|---|---|
[edit] hier stand mist.... | ||
![]() |
FireballFlameBetreff: Re: Ungenauigkeit Float/Double beim Rechnen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] x: Double = 7.7
Also, in deinem Beispiel liegt das Problem wohl darin, dass die Zahlen, die du da angibt, als Floatwerte interpretiert und dann erst in die Double-Variablen gepackt werden, womit dir deren Genauigkeit nichts nützt.
y: Double = x - 1.1 Print y Code: [AUSKLAPPEN] x: Double = 7.7:Double
Wenn du es so machst, kommt als Ergebnis nicht mehr 6.5999997854232788 sondern 6.5999999999999996 raus, das ist schon deutlich näher am richtigen Wert y: Double = x - 1.1:Double Print y ![]() |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Richtig ist das dennoch nicht, irgendwas macht BMax bei den float und doubles wohl falsch. | ||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann macht auch C was falsch:
C hat Folgendes geschrieben: 6.5999999999999996
Das ist nunmal die Ungenauigkeit von Float und Double. |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Float und Double sind nicht ungenau, bis es in einen bestimmen bereich von größe oder kleinheit kommt.
Lies mal bei Wikipedia nach, wie ein Float funktioniert. Btw. ist C bei mir genau: Code: [AUSKLAPPEN] #include <stdio.h>
int main() { float a = 7.7; float b = 1.1; printf("%f\n%f\n%f\n", a, b, a-b); a = 13.674304; b = 5.871472; printf("%f\n%f\n%f\n", a, b, a-b); return 0; } -> Zitat: 7.700000
1.100000 6.600000 13.674304 5.871472 7.802832 |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei mir ists das selbe Ergebnis. C stimmt, BMax aber nicht. Vielleicht per DLL?
Edit: Habs mit einer DLL versucht, da kommt aber auch nicht das richtige raus. |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da brauchts keine DLL für, mark müsste nur mal die floats ordentlich benutzen. Der hat da garantiert irgend nen fehler drinne. | ||
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da der Computer nur in binär rechnen kann und die Umrechnung nicht immer 100% exakt möglich ist, kann es immer kleinere Fehler geben.
Ich glaube, da kann BlitzMax nix für. |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
![]() |
DaysShadow |
![]() Antworten mit Zitat ![]() |
---|---|---|
[Edit nach den beiden unteren]: Sowas aber auch, wir sind alle dooof ![]() MfG DaysShadow |
||
Blessed is the mind too small for doubt |
- Zuletzt bearbeitet von DaysShadow am So, Jul 05, 2009 19:54, insgesamt einmal bearbeitet
![]() |
Suco-XBetreff: ..... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bevor BMX einen Double-Wert ausgibt wird er natürlich in einen String konvertiert, passiert in blitzstring.c
Code: [AUSKLAPPEN] BBString *bbStringFromDouble( double n ){ char buf[64]; sprintf( buf,"%#.17lg",n ); return bbStringFromCString(buf); } Denke das ist so in Ordnung. Ausgabe und Rechnung scheinen mir zwei unterschiedliche Dinge zu sein. So habe ich mal diesen Test gemacht: Code: [AUSKLAPPEN] Strict Import "code.cpp" Rem Inhal von Code.cpp #include <stdio.h> extern "C" { void Output(double zahl) { char* txt = "C Output: "; printf("%s%f\n", txt, zahl); } } End Rem Extern Function Output(zahl:Double) End Extern Function Sub:Double(zahl1:Double, zahl2:Double) Return zahl1-zahl2 End Function Local zahl1:Double=7.7, zahl2:Double=1.1 Local Result:Double Result = Sub(zahl1, zahl2) Print "BMX Output: "+Result Output(Result) Die Ausgabe ist: Code: [AUSKLAPPEN] BMX Output: 6.5999997854232788 C Output: 6.600000 Dabei errechne ich den Wert mit BMX. Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jungs....
Code: [AUSKLAPPEN] #include <stdio.h>
int main(int argc, char *argv[]) { double x = 7.7; double y = x - 1.1; printf("y = %g\n", y); printf("y = %18.17g", y); return 0; } Für die, die's nicht kennen: Das ist C-Code. Und wisst ihr was die Konsole ausspuckt? Genau das: Code: [AUSKLAPPEN] y = 6.6
y = 6.5999999999999996 Oben kommt nur deshalb 6.6 raus, weil Doubles bei der Ausgabe mit printf + %g standardmässig auf 8.6 formatiert und gerundet wird... Erzwingt man (mit %18.17g), dass sämtliche Nachkommastellen angezeigt werden, sieht man, was die Double-Variable für einen genauen Wert hat. mfG Edit: Tja, Suco war schneller =) |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Suco-XBetreff: .... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dafür war dein Post klärender ![]() Mfg Suco |
||
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
http://de.wikipedia.org/wiki/G...Grundlagen
Dort ist das ganze sogar noch ausführlichst erklärt. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group