Y a-t-il une différence entre ceux-ci:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Si je comprends bien, les deux cas ont le même résultat. Y a-t-il une différence dans le code compilé?
c++
c
floating-point
OgreSwamp
la source
la source
floor
, mais attention que ce n'estdouble
pas pourfloat
. C99 a égalementfloorf
pourfloat
.#include<cmath>
et utilisezstd::floor
)bar
?Réponses:
La conversion en un entier tronquera vers zéro.
floor()
tronquera vers l'infini négatif. Cela vous donnera des valeurs différentes si ellesbar
étaient négatives.la source
floor()
c'est l'intention, est si la valeur debar
est trop grande pour tenir dans unint
.Comme cela a été dit précédemment, pour les nombres positifs, ils sont identiques, mais ils diffèrent pour les nombres négatifs. La règle est que int arrondit vers 0, tandis que le plancher arrondit vers l'infini négatif.
Cela étant dit, il existe également une différence de temps d'exécution. Sur mon système, j'ai chronométré que le casting est au moins 3 fois plus rapide que le sol.
J'ai du code qui nécessite le fonctionnement au sol d'une plage limitée de valeurs, y compris des nombres négatifs. Et il doit être très efficace, nous utilisons donc la fonction suivante pour cela:
Bien sûr, cela échouera pour de très grandes valeurs de x (vous rencontrerez des problèmes de dépassement de capacité) et pour des valeurs négatives inférieures à -100000, etc. pour notre application. Prenez-le avec un grain de sel, testez-le sur votre système, etc. mais cela vaut la peine d'être considéré à mon humble avis.
la source
float
, nondouble
- peut-êtredouble
était votre application. Si en C, veillez à utiliserfloorf()
avecfloat
s.SO 101, ne changez pas votre question une fois que les gens ont répondu à votre question, écrivez plutôt une nouvelle question.
Pourquoi pensez-vous qu'ils auront le même résultat?
la source
fabs
? La question portait surfloor
. Le sol de0.33333
... est0
.EDIT: Parce que la question peut avoir été modifiée en raison de la confusion entre
fabs()
etfloor()
.Compte tenu des lignes d'exemple de question d'origine:
La différence est que si la barre est négative, le résultat sera négatif avec le premier mais positif avec le second. Le premier sera tronqué à un entier et le second renverra la valeur décimale complète, y compris la partie fractionnaire.
la source
Oui.
fabs
renvoie la valeur absolue de son argument, et le transtypage en int provoque la troncature de la division (jusqu'à l'entier le plus proche), de sorte que les résultats seront presque toujours différents.la source
Il existe deux différences principales:
Comme d'autres l'ont souligné, la conversion en un entier tronquera vers zéro, alors que
floor()
sera toujours tronquée vers l'infini négatif; c'est un comportement différent pour un opérande négatif.Personne (encore) ne semble avoir signalé une autre différence - si votre argument est supérieur ou égal à
MAX_INT+1
(ou inférieur à-MAX_INT-1
), alors la conversion en unint
entraînera la suppression des bits les plus hauts (C, probablement) ou un comportement indéfini ( C ++ et éventuellement C). EG si votreint
est de 32 bits, vous n'aurez qu'un bit de signe plus 31 bits de données. Donc, utiliser ceci avec undouble
qui est de grande taille va produire des résultats inattendus.la source
int
débordement est que l'argument soit supérieur ou égal àINT_MAX
+1. Symétriquement, la condition du dépassement inférieur est que l'argument soit inférieur ou égal àINT_MIN
-1.(int) x
est une requête pour conserver la partie entière dex
(il n'y a pas d'arrondi ici)fabs(x)
= | x | pour que ce soit>= 0
;Ex:
(int) -3.5
retourne-3
;fabs(-3.5)
retourne3.5
;En général,
fabs (x) >= x
pour tout x;x >= (int) x
six >= 0
x < (int) x
six < 0
la source