Gleitkomma-Konflikt zwischen Compilern (Visual Studio 2010 und GCC)

Ich versuche, ein plattformübergreifendes Problem zu lösen, das auftaucht, und bin mir nicht ganz sicher, wie ich es angehen soll. Hier ist ein Demonstrationsprogramm:

#include <cmath>
#include <cstdio>

int main()
{
    int xm = 0x3f18492a;
    float x = *(float*)&xm;
    x = (sqrt(x) + 1) / 2.0f;
    printf("%f %x\n", x, *(int*)&x);
}

Die Ausgabe unter Windows beim Kompilieren in VS2010 ist:

0.885638 3f62b92a

Die Ausgabe bei der Kompilierung mit GCC 4.8.1(ideone.com-Beispiel)ist:

0.885638 3f62b92b

Diese kleinen Fehlpaarungen werden im Laufe eines Programms, das auf mehreren Plattformen identisch ausgeführt werden muss, zu einem schwerwiegenden Problem. Mir geht es nicht so sehr um "Genauigkeit", sondern um die Ergebnissezueinander passen. Ich habe versucht, das zu wechseln/fp Modus in VS zustrict vonprecise, aber das scheint es nicht zu beheben.

Welche anderen Möglichkeiten sollte ich beachten, damit diese Berechnung auf beiden Plattformen zum gleichen Ergebnis führt?

AKTUALISIEREN: Interessanterweise stimmt der Code, wenn ich ihn so ändere, plattformübergreifend überein:

#include <cmath>
#include <cstdio>

int main()
{
    int xm = 0x3f18492a;
    float x = *(float*)&xm;
    //x = (sqrt(x) + 1) / 2.0f;
    float y = sqrt(x);
    float z = y + 1;
    float w = z / 2.0f;
    printf("%f %x %f %x %f %x %f %x\n", x, *(int*)&x, y, *(int*)&y, z, *(int*)&z, w, *(int*)&w);
}

Ich bin mir jedoch nicht sicher, ob es realistisch ist, durch den Code zu gehen und alle Gleitkommaoperationen wie diese zu ändern!

Antworten auf die Frage(8)

Ihre Antwort auf die Frage