2010-02-25 7 views
6

Ich habe eine Anwendung geschrieben in C#, die auch einige C-Code aufruft. Der C# -Code erhält einige doppelte Eingaben, führt einige Berechnungen durch, übergibt sie an die native Ebene, die ihre eigenen Berechnungen daran ausführt, und kehrt dann zur C# -Schicht zurück.Kann sich eine Berechnung von Gleitkommazahlen auf verschiedenen Prozessoren unterscheiden? (+ Passing doubles zwischen C# und C)

Wenn ich die gleichen exe/dlls auf verschiedenen Maschinen (alle x64 von Intel) laufen, ist es möglich, dass das endgültige Ergebnis, das ich bekommen werde auf verschiedenen Maschinen unterschiedlich sein wird?

+2

Interessante Frage ... vor allem für diejenigen, die sich an den berüchtigten Pentium FDIV Fehler im ursprünglichen Pentium Prozessor erinnern. – Nick

Antwort

4

Wenn Sie die gleichen ausführbaren Dateien verwenden, sollten die Ergebnisse identisch sein. Es ist jedoch zu beachten, dass Gleitkommaberechnungen in der Regel in hohem Maße anpassbar sind durch eine Anzahl von dauerhaften Einstellungen (Unendlichmodus, Rundungsmodus usw.). Dies bedeutet, dass die gleiche Fließkommaanweisung abhängig von der aktuellen Kombination der Einstellungen unterschiedliche Ergebnisse liefern kann. Wenn Ihre Anwendung sicherstellt, dass alle diese Einstellungen zu Beginn der Ausführung auf dieselben Werte zurückgesetzt werden, sollten die Ergebnisse identisch sein. Wenn jedoch einige dieser Einstellungen nicht zurückgesetzt werden oder von externen Parametern (wie Umgebungsvariablen) abhängen, können unter bestimmten Umständen unterschiedliche Ergebnisse auf verschiedenen Computern beobachtet werden.

+0

Welche Art von Umgebungsvariablen könnte die Gleitkommaberechnungen beeinflussen? –

+0

@opc: Das wäre die Frage der OS-spezifischen Anwendung Loader sowie der Startup-Code der Anwendung. Ich sage nur, dass Floating-Point-Berechnungen von persistenten (applikationsglobalen) Einstellungen beeinflusst werden, so dass die Ersteinrichtung dieser Einstellungen von Bedeutung ist. Und es kann von absolut allem abhängen, einschließlich Umgebungsvariablen. – AnT

0

Die meisten modernen Hardware ist standardisiert, wie die Definition der doppelt so hoch ist. Sie können überprüfen, ob beide den gleichen Typ verwenden, indem Sie den Speicherbedarf jeder Variablen überprüfen - z. B. sizeof (x).

Das sollte auch einige Informationen sein, um in float.h abzufragen.

Soweit ich mich erinnern kann, ist Int tendenziell in Konsistenzbegriffen problematischer. Einige standardmäßig auf 2 Byte, andere auf 4, aber Sie könnten immer lange verwenden, um die Größe sicherzustellen.