Meine psychischen Kräfte sind nicht großartig, und es ist schwer zu sagen, was passiert, ohne es tatsächlich zu debuggen. Aber hier ist eine Vermutung. Die Frage, die ich hier diskutieren:
Why does this floating-point calculation give different results on different machines?
gilt nicht nur für "Cross-Maschine", sondern auch "debug vs release". Es ist nicht nur möglich, aber wahrscheinlich, dass die Release-Version Ihres Programms höhere Genauigkeit Mathematik als Ihre Debug-Version verwendet. Wenn Sie dort Gleitkomma-Bugs haben, ist es durchaus möglich, dass Sie nur durch Pech die Bugs nur in der höherpräzisen Release-Version und nicht in der weniger präzisen Debug-Version treffen.
Warum der Unterschied? Da der C# -Compiler in der nicht optimierten Version häufig Code für temporäre Werte generiert, als wären es lokale Variablen; Der Jitter weist dann temporäre Zwischenspeicher auf dem Stapel zu und schreibt die temporären Werte aus den Registern in die lokalen Variablen. Dann, wenn es sie braucht, liest es sie aus den Provisorien in die Register zurück. Diese Reise kann dazu führen, dass der Wert, der in dem Hochpräzisionsregister enthalten war, auf eine Genauigkeit von nur 64 Bits verkürzt wird, wodurch Genauigkeitsanteile verloren gehen.
In der optimierten Version arbeiten der C# -Compiler und der Jitter härter, um alles in Registern die ganze Zeit zu behalten, denn das ist natürlich schneller und höhere Präzision, obwohl schwieriger zu debuggen.
Viel Glück. Bugs, die nur im Release-Modus repro- duzieren, sind ein absoluter Schmerz.
Vielleicht ist dieser Thread ein gutes Beispiel: http://stackoverflow.com/questions/2225503 –