remquo Résultats ne faisant pas sens

Je lis ici que remquo devrait revenir:

En cas de succès, renvoie le rest en virgule flottante de la division x/y tel que défini dans std :: rest, et une valeur dont le signe est le signe de x/y et dont la magnitude est congruante modulo 2 n à la magnitude du quotient intégral. de x/y , où n est un entier défini par l’implémentation supérieur ou égal à 3 .

Maintenant, clairement, j’ai mal compris tout ce discours techno parce que je pensais que j’allais récupérer le résultat partiel de la division. Au lieu de cela cette opération:

 int quot; const float rem = remquo(7.0F, 4.0F, &quot); 

Fixe quot à 2 et rem à -1.0 ! Je peux voir en quoi cela est valable car 4.0 * 2 = 8.0 et 7.0 – 8.0 = -1.0 . Mais pourquoi utilisons-nous un quot qui aboutira à un rem négatif? Est-ce que je ne devrais pas obtenir un quot de 1 et un rem de 3,0 ?

Puisque votre question concerne la valeur renvoyée par remquo , elle concerne uniquement std::remainder remquo , car cette partie du remquo de remquo est définie directement comme identique à celle de std::remainder .

std::remainder fournit l’opération restante IEEE 754, qui est différente de fmod en ce que le fmod de deux valeurs positives peut toujours être positif, alors que le rest IEEE 754 est défini par rapport au quotient intégral q comme l’entier le plus proche. au quotient mathématique x / y, de sorte que remainder = x - y*q produit un résultat négatif chaque fois que le quotient mathématique arrondit au nombre entier le plus proche.

L’opération restante IEEE 754 est celle qui est traitée dans la question «Math.IEEERemainder renvoie des résultats négatifs» . Vous souhaiterez donc peut-être la lire ainsi que la réponse acceptée bien qu’il s’agisse d’un langage de programmation différent.

Remarque: la partie de la spécification relative au quotient étant «congruante modulo 2 n avec la magnitude du quotient intégral» signifie simplement que vous n’obtenez pas l’intégralité du quotient intégral, qui pourrait en fait ne pas correspondre à un type int (pensez à remquo(FLT_MAX, 1.0f, ...) Au lieu de cela, vous obtenez un nombre défini par l’implémentation des bits les moins significatifs du quotient intégral. Le nombre de bits défini par l’implémentation que vous obtenez doit être au moins de trois, mais peut être supérieur.

Le comportement est correct; comme indiqué dans std :: rest, le quotient est arrondi à l’entier le plus proche, le rest peut être négatif.

Si vous travaillez avec un entier, je vous suggère la fonction C div ()