J'essaye de comparer, d'une manière propre et RAPIDE (par logique) si trois variables sont 0, ce sont toutes des nombres à virgule flottante, IEEE 754.

float x;
float y;
float z;

if(((x | y | z) == 0.0f)) { ... }

Mais je continue à recevoir:

main.cpp(15): error C2296: '|': illegal, left operand has type 'float'
main.cpp(15): error C2297: '|': illegal, right operand has type 'float'
main.cpp(18): error C2296: '|': illegal, left operand has type 'float'
main.cpp(18): error C2297: '|': illegal, right operand has type 'float'

J'ai lu quelque chose sur,

std::numeric_limits<T>::is_iec559
std::numeric_limits<float>::epsilon()
std::fabs()

Et Epsilon 10^−7

2
John Smith 1 sept. 2020 à 09:58

2 réponses

Meilleure réponse

Les opérateurs au niveau du bit ne sont définis que pour les types intégraux . Un float n'est pas un type intégral.

Ne micro-optimisez pas comme ça. Écrivez clairement votre intention et laissez la stratégie d'optimisation au compilateur.

4
Bathsheba 1 sept. 2020 à 07:00

Vous ne pouvez pas effectuer un "OU au niveau du bit" sur des nombres à virgule flottante.

Si vous le souhaitez vraiment, vous pouvez directement inspecter les bits représentant les nombres à virgule flottante et effectuer des comparaisons d'entiers sur eux, ce qui est le genre de chose que vous pourriez faire sur un système embarqué sans FPU ni bibliothèque à virgule flottante.

structure of float and double

Voir https://bob.cs.sonoma.edu/IntroCompOrg-RPi /sec-ieee.html et https://en.wikipedia.org/wiki / IEEE_754-1985 pour en savoir plus.

Bien que cela puisse être une entreprise amusante, il est presque toujours préférable de rendre votre code lisible afin qu'il puisse être maintenu; laissant l'optimisation au compilateur.

De plus, personnellement, je ne comparerais presque jamais une virgule flottante à zéro, mais je vérifierais que son abs est inférieur à un très petit nombre.

2
Den-Jason 1 sept. 2020 à 07:46