2 votes

Résultats atan2 incohérents entre les architectures 64 bits et 32 bits

Lorsque vous utilisez std::atan2 J'obtiens des résultats différents selon que j'effectue une compilation croisée pour une architecture 32 bits plutôt qu'une compilation pour l'architecture 64 bits (native).

$ cat test.cc 
#include <cmath>
#include <stdio.h>

int main(int argc, char **argv) {
    printf("%f\n", std::atan2(366.470947f, -116.213623f));
}

$ gcc test.cc -o test -lm -ffp-contract=off -ffloat-store
$ ./test 
1.877880
$ gcc -m32 test.cc -o test -lm -ffp-contract=off -ffloat-store
$ ./test 
1.877881

J'espérais que les résultats seraient les mêmes, puisque je porte une application sur 64 bits et que j'ai besoin de résultats identiques en virgule flottante. Comme vous pouvez le constater, j'ai déjà essayé -ffp-contract=off -ffloat-store ce qui, j'en suis conscient, peut provoquer des incohérences en virgule flottante. Y a-t-il autre chose qui m'échappe ? Ou les fonctions trigonométriques ne sont-elles tout simplement pas normalisées de cette manière ?

J'utilise Ubuntu 18.04.2, avec gcc 7.5.0. Le processeur est un i7-1065G7.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X