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))
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