Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Wie genau rechnet QB?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 21.09.2015, 22:09    Titel: Wie genau rechnet QB? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 21.09.2015, 23:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 22.09.2015, 16:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 22.09.2015, 19:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 22.09.2015, 19:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 23.09.2015, 18:09    Titel: Antworten mit Zitat

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 happy ). 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
Benutzer-Profile anzeigen Private Nachricht senden
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 24.09.2015, 19:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 24.09.2015, 23:58    Titel: MBF vs IEEE 754 Antworten mit Zitat

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
_________________

Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 25.09.2015, 08:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz