Я портирую код с 32 до 64 бит и гарантирую, что ответы будут одинаковыми. При этом я заметил, что atan2f дает разные результаты между ними.atan2f дает разные результаты с флагом m32
Я создал этот мин репро:
#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);
}
Когда построен с:
gcc compilerTest.c -m32 -o 32bit.out -lm
это дает:
atan2f: 1.914544820785522
atan2: 1.914544820785522
Когда построен с:
gcc compilerTest.c -o 64bit.out -lm
это дает:
atan2f: 1.914544701576233
atan2: 1.914544820785522
Обратите внимание, что atan2 дает тот же результат в обоих случаях, но atan2f не делает.
вещей я пытался:
Построения 32 разрядной версии с -ffloat-магазином
Построения 32-битную версии с -msse2 -mfpmath = сс
Построение 64-битной версии с -mfpmath = 387
Ничего не меняли результаты для меня.
(Все они были основаны на предположении, что она имеет что-то делать с тем, как операции с плавающей точкой произойдет на 32 бит против 64 разрядных архитектур.)
Вопрос:
Каковы мои варианты для получения того же результата? (Есть ли флаг компилятора, который я мог бы использовать?) А также, что здесь происходит?
Я работаю на машине i7, если это полезно.
Prinitng with '" atan2f:% .15f \ n "' _may be_ недостаточно точный. Используйте ''% .16e \ n "' или лучше ''% a \ n "' для исследования. – chux
Почему вы ожидаете, что две разные библиотеки будут предоставлять точно такие же результаты и какие размеры имеют 'float' на обеих платформах? Различия не в том, что можно было бы волноваться. – Olaf
Обратите внимание, что '1.914544701576233' и' 1.914544820785522' отличаются на 2 бита в [ULP] (https://en.wikipedia.org/wiki/Unit_in_the_last_place) – chux