Par exemple,
int result;
result = 125/100;
ou
result = 43/100;
Le résultat sera-t-il toujours le plancher de la division? Quel est le comportement défini?
"I just throw the dam fraction part in the trash and move on with life"
Par exemple,
int result;
result = 125/100;
ou
result = 43/100;
Le résultat sera-t-il toujours le plancher de la division? Quel est le comportement défini?
"I just throw the dam fraction part in the trash and move on with life"
Réponses:
Le résultat sera-t-il toujours le plancher de la division? Quel est le comportement défini?
Oui, quotient entier des deux opérandes.
6.5.5 Opérateurs multiplicatifs
6 Lorsque les entiers sont divisés, le résultat de l'opérateur / est le quotient algébrique avec toute partie fractionnaire rejetée. 88) Si le quotient a / b est représentable, l'expression (a / b) * b + a% b doit être égale à a.
et la note de bas de page correspondante:
88) Ceci est souvent appelé «troncature vers zéro».
Bien sûr, deux points à noter sont:
3 Les conversions arithmétiques habituelles sont effectuées sur les opérandes.
et:
5 Le résultat de l'opérateur / est le quotient de la division du premier opérande par le second; le résultat de l'opérateur% est le reste. Dans les deux opérations, si la valeur du deuxième opérande est nulle, le comportement n'est pas défini.
[Remarque: je souligne]
(a / b) * b + a % b == a
fallait bien sûr être satisfait, et la valeur absolue de a % b
devait être inférieure à a
, mais que ce a % b
soit négatif pour négatif a
ou b
non spécifié.
Dirkgently donne une excellente description de la division entière en C99, mais vous devez également savoir que dans la division entière C89 avec un opérande négatif a une direction définie par l'implémentation.
Du projet ANSI C (3.3.5):
Si l'un des opérandes est négatif, que le résultat de l'opérateur / soit le plus grand entier inférieur au quotient algébrique ou le plus petit entier supérieur au quotient algébrique est défini par l'implémentation, tout comme le signe du résultat de l'opérateur%. Si le quotient a / b est représentable, l'expression (a / b) * b + a% b doit être égale à a.
Faites donc attention aux nombres négatifs lorsque vous êtes coincé avec un compilateur C89.
C'est un fait amusant que C99 a choisi la troncature vers zéro parce que c'est ainsi que FORTRAN l'a fait. Voir ce message sur comp.std.c.
reliable integer division
une nouvelle fonctionnalité linguistique. Etonnant *-*
.
expr1 / expr2
et expr1 % expr2
doit être cohérente lorsque les deux instances de expr1
combiner les mêmes objets de la même manière, et de même pour expr2
, mais le choix de la troncature par rapport à la division au sol est par ailleurs non spécifié. Cela aurait permis une génération de code plus efficace sans casser beaucoup de compatibilité (et les implémentations pourraient documenter un comportement spécifique si elles étaient inclinées)
Lorsque le résultat est négatif, C tronque vers 0 plutôt que sur le sol - j'ai appris cette lecture sur les raisons pour lesquelles la division entière Python planifie toujours ici: Pourquoi les étages de la division entière de Python
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
itéré avec des valeurs changeantes de value
. Il fait une belle approximation entière d'un filtre passe-bas du premier ordre avec une constante de temps k
... mais il n'est symétrique que si la division est tronquée et carry
obtient des valeurs négatives. Les deux comportements de division sont utiles de temps en temps.
div
est un opérateur de division au sol et qu'il factor
est impair, filtered += (filter+(factor div 2)) div factor
cela donnerait un comportement propre et symétrique pour toutes les valeurs jusqu'à INT_MAX-(factor div 2)
.
Oui, le résultat est toujours tronqué vers zéro. Il arrondira vers la plus petite valeur absolue.
-5 / 2 = -2
5 / 2 = 2
Pour les valeurs signées non signées et non négatives, c'est la même chose que floor (arrondi vers -Infinity).
Le résultat sera-t-il toujours le plancher de la division?
Non. Le résultat varie, mais la variation ne se produit que pour les valeurs négatives.
Quel est le comportement défini?
Pour le rendre clair, le sol arrondit vers l'infini négatif, tandis que la division entière arrondit vers zéro (tronque)
Pour les valeurs positives, ce sont les mêmes
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Pour une valeur négative, c'est différent
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
Je sais que les gens ont répondu à votre question, mais en termes simples:
5 / 2 = 2
// puisque 5 et 2 sont des entiers et la division des entiers tronque toujours les décimales
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// ici 5 ou 2 ou les deux ont des décimales donc le quotient que vous obtiendrez sera en décimal.