AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
Hast du mal versucht die Range-Checks und Overflow-Checks zu aktivieren wie ich schon geschrieben habe? |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
|
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
PS: Wenn's wirklich 1e-7 ist, könnte es sein, daß Dir irgendwo eine Single-Rechnung reinspuckt, 1.1920929E-7 ist das Maschinen-Epsilon für Single. |
AW: Programmergebnise verschieden auf zwei Rechnern
Double kann zwar mit Zahlen von 324 Nachkommastellen bis 308 Vorkommastellen umgehen.
Aber Double hat nur 15-16 signifikante Stellen. Es sind also immer nur die obersten 15 Dezimalstellen "korrekt" und alles danach ist quasi undefiniert und unterliegt Rundungsfehlern. 0.00000000000000000123456789012345xxxxxxx 123456.789012345xxxxxxx 123456789012345xxxxxxxxxxxxxxxxxx.xxxxxxx Bei Extended sind es 19-20 signifikante Stellen und bei Single nur 7-8. 7-8 heißt : 12345678 geht, aber 87654321 nicht ... quasi wie 7,5 Dezimalstellen. Und ein Range-Check knallt erst, wenn die Zahl größer als 10^308 wird ... für Rundungsfehler gibt es keine Prüfung. |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
Diese Differenz kann demnach aus den Summanden wie 50000 - 50100 stammen oder aus 50 - 150 oder 5 Mio Man hätte also Schwankungen im Promille Bereich, oder Prozent oder sogar Faktoren. Damit hätte man verschieden starke Abweichungen, die entweder eben bedeutend sind oder nicht. Das geht allein aus der Differenz nicht hervor. Wird irgendwo in Deiner Funktion mit Exponentialfunktionen gerechnet, können kleine oder kleinste Rundungsfehler > Signifikanz (Himitsu) enorme Schwankungen ergeben. |
AW: Programmergebnise verschieden auf zwei Rechnern
Um es mal anschaulich zu machen:
Delphi-Quellcode:
Das erklärt aber nicht, warum dieselbe EXE auf unterschiedlichen Rechnern unterschiedliche Ergebnisse liefert. Der Grund dafür wird etwas diffiziler sein.
var
Big: Extended; Res: Extended; Small: Extended; begin Big := 10E100; Small := 1.0; Res := (Big + Small) - Big - Small; Writeln('Sollte eigentlich Null sein: ', Res); end; |
AW: Programmergebnise verschieden auf zwei Rechnern
Hallo,
woher kommen die Ausgangswerte der Funktion? Setze die mal per Code fix auf feste Werte. Und dann mach eine Logdatei, in die du gezielt Zwischenergebnisse mitloggst. 1.000 Zeilen sind nicht viel, als dass man da nicht mitloggen kann. Logdatei = StringList.Add -> StringList.SaveToFile Heiko |
AW: Programmergebnise verschieden auf zwei Rechnern
Was berechnest du denn?
Beziehst du Zahlen aus Datum, Uhrzeit o.ä. außerhalb des Programmes? Das wäre fast meine einzige Idee wegen der Differenzen. Hast du auch die Ergebnisse (Zahlen) beider Programme verglichen? Vielleicht ist es nur die Diagrammgrafik die fehlerhaft ist. Wenn du das Programm mehrmals startest, erhälst du dann unterschiedliche Ergebnisse? Sind die Zahlen eher Zufallszahlen oder erkennst du ein System? |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
Wie gesagt, eine Exponentialfunktion, die auf recursiven Funktionen mit Rundungsfehler ("Signifikanzüberlauf") sitzt, wäre eine Möglichkeit oder? |
AW: Programmergebnise verschieden auf zwei Rechnern
Das Kontrollregister solltest du per Thread (oder zumindest pro Prozess) setzten können.
Solange du die immer setzt, wenn du in deinen numerischen Kern wechselst, sollte alles gutgehen. Beim Austreten wiederherstellen ist vermutlich auch nicht verkehrt. Zitat:
Ich denke auch, dass du ansonsten nur mit Logging und vergleichen weiterkommst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz