Ungenauigkeit Float/Double beim Rechnen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Ratchet

Betreff: Ungenauigkeit Float/Double beim Rechnen

BeitragDi, Jun 30, 2009 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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]
 

#Reaper

Newsposter

BeitragDi, Jun 30, 2009 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 30, 2009 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 30, 2009 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jun 30, 2009 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Es geht mir ja gerade um die Ausgabe. Dein Beispiel funktioniert aber leider genauso wenig Sad
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

amon

BeitragDi, Jun 30, 2009 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst bruceys modul zur stringformatierung ähnlich wie in c einsetzen

http://code.google.com/p/maxmods/wiki/FormatModule

Ratchet

BeitragDi, Jun 30, 2009 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 05, 2009 7:54
Antworten mit Zitat
Benutzer-Profile anzeigen
[edit] hier stand mist....

FireballFlame

Betreff: Re: Ungenauigkeit Float/Double beim Rechnen

BeitragSo, Jul 05, 2009 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
x: Double = 7.7
y: Double = x - 1.1
Print y
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.

Code: [AUSKLAPPEN]
x: Double = 7.7:Double
y: Double = x - 1.1:Double
Print y
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 Wink
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

BeitragSo, Jul 05, 2009 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig ist das dennoch nicht, irgendwas macht BMax bei den float und doubles wohl falsch.

Holzchopf

Meisterpacker

BeitragSo, Jul 05, 2009 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

BtbN

BeitragSo, Jul 05, 2009 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 05, 2009 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 05, 2009 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Da brauchts keine DLL für, mark müsste nur mal die floats ordentlich benutzen. Der hat da garantiert irgend nen fehler drinne.

FireballFlame

BeitragSo, Jul 05, 2009 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 05, 2009 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
[Edit nach den beiden unteren]: Sowas aber auch, wir sind alle dooof Very Happy

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-X

Betreff: .....

BeitragSo, Jul 05, 2009 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Holzchopf

Meisterpacker

BeitragSo, Jul 05, 2009 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Suco-X

Betreff: ....

BeitragSo, Jul 05, 2009 19:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür war dein Post klärender Wink
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

BtbN

BeitragSo, Jul 05, 2009 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
http://de.wikipedia.org/wiki/G...Grundlagen

Dort ist das ganze sogar noch ausführlichst erklärt.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group