j'ai obtenu le calcul suivant:ramification dans la déclaration suivante
if (x==0) x=1.0;
Y = x * A
Toute idée comment puis-je éviter le « si » branchement ci-dessus en utilisant des fonctions de serrage mathématiques/étape.
j'ai obtenu le calcul suivant:ramification dans la déclaration suivante
if (x==0) x=1.0;
Y = x * A
Toute idée comment puis-je éviter le « si » branchement ci-dessus en utilisant des fonctions de serrage mathématiques/étape.
Y=((x==0)+(x!=0)*x)*A;
compile ce cpi -O3 sans JMP (gcc/LLVM ne) pour x86-64 (vérifié avec https://gcc.godbolt.org).
Clang et GCC font aussi, si vous compilez avec -ffast-math (ICC est un peu plus lâche avec cela par défaut il semble) – harold
Je pensais à l'imprécision aussi bien lors de la création de l'expression proposée mais je ne vois pas comment l'expression affichée pourrait entraîner une différence avec l'expression initiale, donc -ffast-math ne devrait faire aucune différence. Est-ce que je manque quelque chose? – FPK
Bien vérifier le [code] (https://godbolt.org/g/mLoQ5W), beaucoup d'opérations au niveau du bit – harold
pouvez-vous fournir du code autour? quelles sont les valeurs possibles pour x? – Psi
Votre CPU pourrait utiliser une instruction CMOV * (en supposant qu'une instruction Intel/AMD est définie ici, mais d'autres familles de puces ont des capacités similaires) pour (re-) charger 'x', ce qui éviterait une branche si vous le souhaitez utiliser l'assemblage en ligne (ou même l'assemblage non intégré). Que votre compilateur produise ou non un tel code dépend beaucoup du compilateur, de la version du compilateur et des options que vous lui donnez. – twalberg