|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 21.09.2015, 23:09 Titel: Wie genau rechnet QB? |
|
|
Guten Abend Gemeinde!
Habe ein numerischesRechenprog erstellt. Habe einige Abweichungen im Verhältnis zu einem Mathematikprog festgestellt. Frage ist nun, ob das an QB liegt?
Habt Ihr da eine Idee wie ich das überprüfen könnte und wie ich das verbessern könnte, falls es an QB liegt?
grüsse Nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.09.2015, 00:05 Titel: |
|
|
Ohne zu offenbaren, was du überhaupt wie berechnest, kann man dazu überhaupt nichts sagen. Noch weniger kann man zu den Abweichungen gegenüber eines spezialisierten Matheprogramms sagen, von dem überhaupt nicht bekannt ist wie es intern rechnet. Intern verwendet QBasic als "Standard"-Datentyp 32-bit-Gleitkommazahlen, wobei diese einem proprietären Microsoft-Standard folgen, nicht den normalen IEEE-Gleitkommazahlen. Man kann auch explizit 64-bit-Gleitkommazahlen (wieder proprietär, nicht IEEE) verwenden, was eventuelle Rundungsfehler natürlich kleiner werden lässt.
Viele dedizierte Mathematikprogramme verwenden gar keine Gleitkommazahlen, da diese zum schnellen und nicht zum präzisen Rechnen gedacht sind. Typischerweise wird dort eine eigene Festkomma-Implementierung verwendet (beim Windows-Taschenrechner z.B. 32-stellige Festkommazahlen, wenn ich mich recht erinnere). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 22.09.2015, 17:56 Titel: |
|
|
Einige Mathematikprogramme (insb. Computeralgebrasysteme) rechnen sogar so lange wie möglich exakt, d. h. Konstanten wi Pi oder auch Wurzelausdrücke und andere werden solange nicht gerundet, bis eine Rundung explizit gefordert wird. Das bedeutet natürlich auch, dass sich bis dahin keine Rundungsfehler aufsummieren können. Bei spezialisierten Mathematikprogrammen kann es zumindest sein, dass ganz bestimmte fehleranfällige Operationen so lange wie möglich vermieden werden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.09.2015, 20:28 Titel: |
|
|
Ohne viel Kommentar noch ein Artikel aus meiner Sammlung:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/Gleitkommazahlen.html
Jojo hat Folgendes geschrieben: | Intern verwendet QBasic als "Standard"-Datentyp 32-bit-Gleitkommazahlen, wobei diese einem proprietären Microsoft-Standard folgen, nicht den normalen IEEE-Gleitkommazahlen. |
Genau ist es so: Der QB-Vorgänger GW-BASIC (und BASICA) verwendete noch das MBF (Microsoft Binary Format) für die Fliesskommazahlen, während QB (zumindest QBasic 1.1 + QB 4.5) bereits IEEE 754 verwendet.
Im oben genannten Artikel werden sonst die Unterschiede zwischen IEEE 754 und MBF im Detail erklärt.
nemored hat Folgendes geschrieben: | Einige Mathematikprogramme (insb. Computeralgebrasysteme) rechnen sogar so lange wie möglich exakt, d. h. Konstanten wi Pi oder auch Wurzelausdrücke und andere werden solange nicht gerundet, bis eine Rundung explizit gefordert wird. |
z.B. Maple ist so eine Software (hatte ich bereits im Studium im Jahr 1997 im Einsatz). _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 22.09.2015, 20:43 Titel: |
|
|
gA JoJo:
gA nemored:
Mit meinem Näherungsprog -ein RK4- mit QBasic programmiert stelle ich spezielle Berechnungen an. Vergleich mit verfügbaren Darstellungen führt zu sichtbaren Abweichungen. Die könnten vom Datenfit stammen, weshalb ich gerne die prinzipielle Genauigkeit von Berechnungen mit QBasic abschätzen möchte. Ein freundlicher Zeitgenosse hat zum Vergleich was in C programmiert. Da erscheinen Abweichungen im Bereich von ~ 3%. Nach 61000 Berechnungsdurchgängen mit jeweils ca. 450 programmierten Rechenbefehlen. Was kann man den in QBasic ganz allgemein tun um größtmögliche Rechengenaugkeit zu erzielen?
grüsse Nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 23.09.2015, 19:09 Titel: |
|
|
Es gibt bestimmte Rechenschritte, die anfälliger auf Rechenfehler sind als andere. Ich habe das Thema nur gestreift und kann daher nur vage Auskunft geben, aber z. B. kann die Subtraktion zweier fast gleich großer Werte hohe Ungenauigkeiten erzeugen, während die Addition unproblematisch ist (natürlich nur bei gleichem Vorzeichen beider Summanden ). Für die Programmierung heißt das dann, dass man problematische Operationen so weit wie möglich vermeidet, wenn es auch andere Wege gibt. Dazu sollte man sich aber ausführlich mit der Numerik beschäftigen (wie gesagt, ich kenne da nur einige wenige Grundlagen).
Code: | dim as double x, y, z
x = .4
y = .1
z = x + y
print "Berechnung 1: "; 1 - 1e20*(.5 - z)
print "Berechnung 2: "; 1 - 1e20*(.5 - x - y)
sleep
|
liefert in FreeBasic (bei meinem Prozessor):
Code: | Berechnung 1: 1
Berechnung 2: 2776.557561562891 |
Unter QBasic ist das aber vielleicht wieder anders. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 24.09.2015, 20:33 Titel: |
|
|
Hi nemored!
Danke für Deinen Hinweise. Ich laß' Deinen Code mal demnächst laufen und schaue mir das genauer an. Ich kennn' das gaube ich. Scheint das bekannte Problem der Maschinenzahlen zu sein. Aber wie steht es mit der Rundungsproblematik?
Wovon hängt denn die Genauigkeit am meisten ab? Vom Prozessor? Vom Betriebssystem? Vom Kompiler? Vom Coprozessor(Witec)? Von der Hardwarearchitektur?
Die von Dir gegebenen Hinweise zum smarten Erstellen eines Progs zu berücksichtigen scheint mir echt kompliziert. Da muß man ja allen Eventualitäten vorbeugen. Zumal es ja häufig kleine Differenzen gibt. ZB wenn bei einem Integral Log. anfallen etc.
Habe bei meinem konkreten Problem einen Vergleich mit einer Berechnung in C gemacht. Die Übereinstimmung ist in allen Ergebnisse mindestens bis zur dritten Nachkommastelle gegeben. Hier der Vergleich nach 60000 Programmdurchläufen in QBasic:
333,7613944 344,158836 <QBasic>
333,761 344,159 <C>
(edit: sorry, die Formatierung der zahlen ist verschwunden beim Speichern)
Wie aussagekräftig ist das wohl?
grüsse Nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 25.09.2015, 00:58 Titel: MBF vs IEEE 754 |
|
|
Hallo!
Zitat: | Genau ist es so: Der QB-Vorgänger GW-BASIC (und BASICA) verwendete noch das MBF (Microsoft Binary Format) für die Fliesskommazahlen |
Kleine Ergänzung dazu: Laut QB-Monster-FAQ verwenden u. a. die "QuickBasic versions 1.00, 1.01, 1.02, 2.00, 2.01, and the non-coprocessor QB.EXE version 3.00, for MS-DOS" das MBF (Microsoft Binary Format). Spätere Versionen sind, wie dreael schreibt, zugunsten der intel-80x87-Coprozessoren auf das portable IEEE-Format umgestiegen. In QB 4.5 und QB 7.1 gibt es, wenn ich das richtig in Erinnerung habe, die Möglichkeit, über den Kommandozeilenparameter /MBF wieder auf das alte Format zurückzugreifen.
Wenn man QB 1.0 oder so benutzt (-> MBF) ergeben sich Rundungsunterschiede zu Programmen in anderen Laufzeitumgebungen / compiliert mit anderen Compilern, die das IEEE-Format benutzen, da bei MBF und IEEE 754 unterschiedlich viele Bits für die "Bestandteile" der Gleitkommazahlen zur Verfügung stehen. Siehe Antwort 3 aus der QB-Monster-FAQ:
Zitat: | Vorzeichen-Bits Exponenten-Bits Mantissen-Bits
IEEE 1 11 52 + 1 (implizit)
MBF 1 8 56 |
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 25.09.2015, 09:24 Titel: |
|
|
Nils hat Folgendes geschrieben: | Wovon hängt denn die Genauigkeit am meisten ab? Vom Prozessor? Vom Betriebssystem? Vom Kompiler? Vom Coprozessor(Witec)? Von der Hardwarearchitektur? |
Alle Floating-Pointer-Operationen sind im Standard IEEE 754 definiert, von daher "keins von all dem". Das Problem liegt daran wie man mit IEEE-Zahlen umgeht, in welcher Reihenfolge man welche Befehle ausführt, etc... Das ist nichts, was man mal in einem kleinen Posting alles zusammenfassen könnte und hat auch viel mit Numerik zu tun.
Lies dir eventuell mal den Wiki-Artikel dazu durch, dann wird vielleicht einiges klarer, oder auch nicht. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|