![]() |
Programmergebnise verschieden auf zwei Rechnern
Hallo zusammen,
ich stehe vor einem Problem und bekomme es so nicht gelöst, ein ähnliches hier Thema hilft mir nicht weiter. Das Programm liefert auf zwei Rechnern unterschiedliche Ergebnisse (unabhängig davon, ob es aus der Exe gestartet wurde oder aus dem Compiler. Programmiert wurde mit CodeGear™ Delphi® 2007 für Win32®: Mein Rechner: 64Bit, i5 Der andere Rechner 64Bit i7 Mein Programm macht mehrere riesige Rechnungen und zeichnet dann Wertepaare in ein TChart: - zerlegt habe ich schon - alle Variablen wurden initialisiert - die Methode wurde in Fortran entwickelt und dann in Delphi übertragen. Alle Funktionen geben bei mir extended zurück. Das sollte ja innerhalb von 64Bit-Rechnern kein Problem darstellen oder? Bei meinem Rechner jedenfalls ist die Funktion, die in das TChart gezeichnet wird ohne Sprünge etc, bei dem anderen Rechner tritt ein ziemlich heftiges Gezackel auf. Dh die Werte der Funktion werden falsch berechnet. Woran kann das liegen? Ich habe auch bei allen ganzen Zahlen zB 2.0 anstatt von 2 genommen! Vielen Dank für Eure Hilfe! |
AW: Programmergebnise verschieden auf zwei Rechnern
gelöscht
|
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
Zitat:
|
AW: Programmergebnise verschieden auf zwei Rechnern
Und wenn du mal testweise auf Double umstellst und schaust ob die Ergebnisse dann gleich sind?
Erstellst du aus auf dem 64-Bit Rechner einer 64-Bit exe, oder eine 32 Bit exe? Bei 64-Bit Delphi gibt es Extended nämlich nicht mehr, bzw. Extended = Double. |
AW: Programmergebnise verschieden auf zwei Rechnern
Wie groß werden denn die Zahlen? Tritt hier vielleicht ein Überlauf auf?
![]() Hier steht, dass Extended sehr vom System abhängt. Vielleicht mal mit Double versuchen, sofern der Zahlenbereich ausreicht? Und hier: ![]() Falls es das nicht ist, gab es nicht bei einigen neueren CPUs (Skylake) Probleme bei großen Berechnungen? |
AW: Programmergebnise verschieden auf zwei Rechnern
Huhu,
vielen Dank schonmal... @NeutralGeneral: Wie würde man denn herausfinden welche .exe man erstellt? Dann erstelle ich wahrscheinlich eine 32Bit-Exe, weil wenn ich auf double umstelle, bekomme ich auch die Sprünge in der Funktion, daher hatte ich extended genommen. Dann wird es wahrscheinlich an dem Überlauf liegen oO Im Result kommen nachher Werte bis etwa 10000 heraus. Kann man um den Überlauf zu umgehen einfach die betroffenen Werte reduzieren (zB geteilt durch 10000) und nachher wieder draufrechnen? |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
Gruß K-H |
AW: Programmergebnise verschieden auf zwei Rechnern
Du kannst auch in den Projektoptionen unter Compiler mal die Range-Checks und Overflow-Checks aktivieren, dann sollte ja zur Laufzeit ein Fehler kommen, sofern es daran liegt.
|
AW: Programmergebnise verschieden auf zwei Rechnern
@p80286 :
Auf dem i7 ist garkein Delphi installiert ^^ |
AW: Programmergebnise verschieden auf zwei Rechnern
Delphi 2007 (also Delphi Version 12.0) erstellt keine 64-Bit EXEs, also kann das auch nicht das Problem sein.
Ein-und-dasselbe Programm kann allerdings auf verschiedene Rechnern unterschiedliche Ergebnisse liefern, dies habe ich schon oft für verschiedene Processoren gesehen (allerdings eigentlich immer Intel vs AMD, nicht für zwei Intel), hier wird wahrscheinlich der interne Code für Standardfunktionen wie sin, exp usw. leicht unterschiedlich sein. Intel garantiert mW nicht, daß diese Funktionen korrekt gerundet sind. |
AW: Programmergebnise verschieden auf zwei Rechnern
Ich habe folgende Version:
CodeGear™ Delphi® 2007 für Win32® R2 Version 11.0.2902.10471 Copyright © 2007 CodeGear™. Alle Rechte vorbehalten Installierte updates: December 2007 update February 2008 Help update. Könnte es auch evtl daran liegen? |
AW: Programmergebnise verschieden auf zwei Rechnern
Vielleicht solltest Du mal mehr zeigen.
Hast Du die Ergebnisse mal als Zahlen geprüft? Vielleicht spinnt das Chart nur irgendwie bei der Anzeige? Was berechnest Du genau? Wie sehen die unterschiedlichen Werte aus? Mit Abweichungen bei der xten Nachkommastelle muss man ggf. leben, aber so hört sich das ja bei Dir nicht an. Kannst Du ein kleines Testprojekt bereitstellen? |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
![]() Extend ist wie schon geschrieben nicht unbedingt empfehlenswert. Problematisch ist dabei nicht unbedingt der Rückgabewert, sondern der Rechenweg und die Datenhaltung innerhalb der Funktionen. Zur Prüfung würde ich nach Möglichkeit den Datentyp pauschal umstellen, z.B. probehalber auf double oder die Formeln auf zyklische Rundungsfehler prüfen. Also bspw. eine rekursive Funktion, die einen Rundungsfehler immer weiterreicht gezielt ändern (dann wohl erstmal mit Genauigkeitsverlust) Ggf. kann auch eine simple Ausgabe von Funktionsparametern oder Funktionsinternen Puffervariablen in ein Logfile sehr schnell zur Ursache führen. Auf beiden Rechnern mit identischen Parametern aufrufen und mit einem Dateivergleichstool das Log ansehen. P.S: Kann natürlich auch sein, dass der eine Rechner einfach nur eine bessere Displayauflösung hat (falls das Chart dynmisch skaliert)! |
AW: Programmergebnise verschieden auf zwei Rechnern
Ich habe alles jetzt auf double umgestellt!
Etwas zu zeigen finde ich in dem Fall zum einen schwierig, meine Funktion ist halt etwa 1000 Zeilen lang, weil ich die so sehr gesplittet habe. Ein Darstellungsfehler kann ich hier ausschließen. Hier mal die Differenz der letzten Zahlen (das result ausgegeben in ein Memo und dann verglichen...). 18,46705003 -44,92204286 110,0148373 -121,7186592 -163,5438982 -202,4629422 -19,97146295 47,18621642 -76,43639035 -13,81705519 -36,36069859 -165,5883537 37,23450602 -43,46769625 51,30182432 -4,447880571 -89,97032507 -78,85295411 -131,8655513 Wahrscheinlich wird mir nichts anderes übrig bleiben, als jede Variable einzeln herauszuschreiben und zu vergleichen... |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
auf beiden PCs ein Delphi und gleichzeitig Debuggen (z.B. via RDP, TeamViewer oder Skype) oder zwei Delphi auf deinem PC und Eines per RemoteDebugger mit dem anderen Programm verbinden und am schönsten auf zwei Monitoren je ein Delphi/Programm oder noch besser beide PCs/Tastaturen nebeneinander ... da kann man auch gleichzeitig F7/F8 drücken |
AW: Programmergebnise verschieden auf zwei Rechnern
hallo,
als ich den Thread gelesen habe, war der erste Gedanke der mir durchs Gehirn flog: ein "Mandelbug". Kleinste Änderungen am System haben ein komplett anderes Ergebnis zu Folge. Ich würde daher auch empfehlen, jedes Zwischenergebnis zu protokollieren, dann vergleichen und schauen wo die Abweichung ins Programm kommt. Aber mal ehrlich, wäre das Leben nicht langweilig, wenn es determiniert verlaufen würde. mfg |
AW: Programmergebnise verschieden auf zwei Rechnern
Könnte es mit unterschiedlichen Floating Point Control Words zu tun haben? Die Präzision unterscheidet sich dann je nachdem, ob andere Programme am Control Word geschraubt haben.
![]() ![]() und ![]() |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
Kein Control Word der Welt sollte Differenzen von bis zu 200 erzeugen. Es sei denn es wurde vllt. mit gigantischen Zahlen gerechnet. |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
|
AW: Programmergebnise verschieden auf zwei Rechnern
Naja, die Formel am Ende ist schon ziemlich hässlich und zwischendurch werden die Zahlen auch ziemlich groß ^^
Selbst wenn ich auf den beiden Rechnern die hinterlegten Floating Point Control Words ändern könnte, würde es nichts nutzen, da das Programm letzten Endes auch auf anderen Rechnern laufen soll und da kann ich ja schlecht alles ändern. Zumindest müsste ich das irgendwie im Programm bereitstellen können. Wie meinst du, Ausgangszahl? Ich hab jetzt die ersten 50 Variablen und da hab ich bisher nur bei einer eine Differenz im Bereich von Max E-7. |
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. |
AW: Programmergebnise verschieden auf zwei Rechnern
Hallo,
für alle: Ich berechne Belastungen (Kraft [N]) für bestimmte Bauteile. Die sollten am Ende in einem Bereich von kN liegen. Das Programm funktioniert so, dass man Bauteilgeometrien einträgt und mit der hinterlegten Methode die Belastung herausbekommt. Da die Bauteile sehr komplex sind, ist die Methode entsprechend komplex und kompliziert und das macht imho keinen Sinn das hier alles aufzuschreiben, zumal die Methode zwecks Untersuchung auf Fehler sehr zerlegt ist. @Bra: Wie groß kann ich nachher erst definitiv sagen, wenn ich jede Variable einzeln inspiziert habe ^^ Vielen Dank schonmal für eure Hilfe. Ich melde mich wieder, wenn ich weitergekommen bin :( |
AW: Programmergebnise verschieden auf zwei Rechnern
Ok, dann sollten die Ergebnisse eigentlich gleich sein. Mysteriös. Dann noch andere Überlegungen:
Zuerst würde ich eine ganz einfache und simple Berechnung mit einem kleinen Ergebnis das definitiv im grünen Bereich sein sollte. Wenn das dann bei beiden Rechner gleich ist, dann scheint es wirklich mit den Typen Double, Integer o.ä. zu tun zu haben was überschritten wird. Dann würde ich hier den Fehler suchen. Wie sieht es denn mit Komazahlen aus? Z.B. bei der Eingabe (, oder .) oder evtl. auch während der Berechnungen; Werden dort die Zahlen irgendwie hin- und her formatiert? (Bei dem es vielleicht von System zu System unterschiedlich sein kann). Oder gibt es vielleicht eine Stelle an der "künstlich" (alla als String) irgendwas verschoben wird, ein Koma, Leerzeichen o.ä. eingefügt. Könnte vielleicht auch die Eingabezahlen missinterprediert werden (z.B. ein Buchstabe wird irgendwie als Zahl umgewandelt und damit gerechnet). Oder andere Überlegungen, wenn die Zahlen nicht händisch eingegeben werden, kommen auch wirklich die selben Zahlen bei beiden Systemen an? Ein Schuss ins blaue: gibt es auf dem System, bei dem die Ergebnisse falsch sind, eine Software, die evtl. an dem Programm rumfummeln könnte? (Antivirensoftware o.ä.) Werden die Zwischenergebnisse irgendwo zwischengespeichert? Wenn ja wo und wie? Gleiche Typen usw.? |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
|
AW: Programmergebnise verschieden auf zwei Rechnern
Kann es sein, dass du ein numerisch schlecht konditioniertes Problem mit einem Algorithmus löst, der dafür nicht so gut geeignet ist?
Bei einem instabilen Algorithmus können die paar zusätzlichen Bits eines Extended beitragen, dass dennoch sinnvolle und halbwegs akkurate Ergebnisse herauskommen. Typischer Anfängerfehler wäre bspw. ein FE-Problem mit einem einfachen Gaußverfahren zu lösen. |
AW: Programmergebnise verschieden auf zwei Rechnern
Hallo Physikerin,
ich denke es macht nicht viel Sinn, weiter "Topfschlagen" zu veranstalten. Was man m.E. ausschließen kann - Extended vs. Double (weil dein Programm ein 32Bit Programm ist, und somit Extended auch wirklich Extended ist) - Unterschiedliche ControlWords (weil das ControlWord vom Programm selbst definiert wird) Bleibt also p80286: Das klingt wie einer von den Standardfehlern "Initialisierung durch Zufall". stell doch mal das Programm (incl. komplettem Source Code) ins Forum. Vielleicht hat der eine oder andere Lust und Zeit sich da durchzuarbeiten und zu prüfen, ob wirklich überall mit definierten Variablen gearbeitet wird. Lokale Variablen, so sie denn nicht ausdrücklich definiert werden, haben z.B. "Zufallswerte". |
AW: Programmergebnise verschieden auf zwei Rechnern
Zitat:
Zitat:
|
AW: Programmergebnise verschieden auf zwei Rechnern
Hallo,
wie sieht es denn aus mit nicht initialisierten Variablen? Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz