Question

Je travaille en C pour implémenter un pseudo-code qui dit:

delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay

Le floatDelay sera toujours positif. Y a-t-il un avantage à utiliser la fonction round de math.h:

#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));

ou puis-je utiliser:

delay=(int)(64*(floatDelay - intDelay) + 0.5))
Était-ce utile?

La solution

Vous devez toujours utiliser les bibliothèques mathématiques appropriées pour traiter les nombres à virgule flottante. Un float peut n'être qu'une approximation très proche de la valeur réelle, et cela peut causer une bizarrerie.

Par exemple, 5f peut être approximé à 4.9999999 ... et si vous essayez de convertir directement en int, il sera tronqué à 4.

Pour savoir pourquoi en profondeur, vous devriez rechercher des nombres à virgule flottante sur wikipedia. En bref, au lieu de stocker le nombre sous la forme d’une série droite de bits, comme un int, il est stocké en deux parties. Il y a une " fraction " et un exposant, où la valeur finale du float est fraction * (base ^ exposant).

Autres conseils

Il n'y a aucun avantage à ma connaissance, mis à part le fait que le transtypage vers int n'est peut-être pas immédiatement évident pour les autres programmeurs qu'il fonctionne comme un tronc ...

Alors qu'avec la fonction round, vos intentions sont claires.

Tout va bien, à condition que vous disiez que floatDelay est positif.

Il est possible que l’un soit légèrement plus rapide que l’autre, mais il serait difficile de dire lequel sans analyse comparative, étant donné que round () est probablement implémenté en tant qu’intrinsèque du compilateur. Il est encore plus probable que toute différence de vitesse soit sans importance dans la plupart des cas, utilisez donc celui que vous croyez le plus clair.

J'ai trouvé " tronquer une valeur décimale en c ++ . fourni une discussion utile sur les nombres en virgule flottante.

Greg Hewgill a notamment fourni ce lien: Ce que tout informaticien devrait savoir Arithmétique en virgule flottante de David Goldberg

  

Par exemple, 5f pourrait être approximé à 4.9999999 ...   et si vous essayez de lancer directement sur int, il sera tronqué à 4.

Est-ce vraiment vrai?

Si vous vous assurez d’ajouter le 0.5 avant de tronquer int,
est vraiment un problème 4.9999.

je veux dire: 4,9999 + 0,5 = 5,4999 - > 5

/ Johan

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top