Ich portiere Code von 32 Bit auf 64 Bit, und stellen Sie sicher, dass die Antworten die gleichen sind. Dabei habe ich festgestellt, dass Atan2f unterschiedliche Ergebnisse zwischen den beiden ergeben hat.atan2f gibt andere Ergebnisse mit m32 flag
Ich habe dieses min Repro:
#include <stdio.h>
#include <math.h>
void testAtan2fIssue(float A, float B)
{
float atan2fResult = atan2f(A, B);
printf("atan2f: %.15f\n", atan2fResult);
float atan2Result = atan2(A, B);
printf("atan2: %.15f\n", atan2Result);
}
int main()
{
float A = 16.323556900024414;
float B = -5.843180656433105;
testAtan2fIssue(A, B);
}
Wenn mit eingebautem:
gcc compilerTest.c -m32 -o 32bit.out -lm
es gibt:
atan2f: 1.914544820785522
atan2: 1.914544820785522
Wenn mit eingebautem:
gcc compilerTest.c -o 64bit.out -lm
es gibt:
atan2f: 1.914544701576233
atan2: 1.914544820785522
Hinweis gibt, dass atan2 das gleiche Ergebnis in beiden Fällen aber atan2f nicht.
Dinge, die ich habe versucht:
Aufbau der 32-Bit-Version mit -ffloat-store
Aufbau der 32-Bit-Version mit -msse2 -mfpmath = sse
der Aufbau der 64-Bit-Version mit -mfpmath = 387
Keine hat die Ergebnisse für mich verändert.
(Alle diese wurden basiert auf der Hypothese, dass es etwas mit der Art und Weise Gleitkommaoperationen passieren auf 32 Bit vs 64-Bit-Architekturen zu tun.)
Frage:
Was sind meine Optionen, um sie zum gleichen Ergebnis zu bringen? (Gibt es ein Compiler-Flag, das ich verwenden könnte?) Und was passiert hier?
Ich bin auf einem i7-Computer ausgeführt, wenn das hilfreich ist.
Prinitng mit '" atan2f:% .15f \ n "' _ kann _ ungenügend genau sein. Verwende '"% .16e \ n "' oder besser '"% a \ n "' zur Untersuchung. – chux
Warum erwarten Sie, dass zwei verschiedene Bibliotheken genau die gleichen Ergebnisse liefern und welche Größen "float" auf beiden Plattformen haben? Die Unterschiede sind nicht, dass man sich sorgen würde. – Olaf
Beachten Sie, dass sich '1.914544701576233' und' 1.914544820785522' um 2 Bits in der [ULP] (https://en.wikipedia.org/wiki/Unit_in_the_last_place) unterscheiden. – chux