Question

  

5,6 $ / 4 en C ++ 03 Unis- « Si les deux   opérandes sont alors non négatif   reste est positive, sinon, la   signe du reste est   définie par l'implémentation 74) .

où la note 74 est

  

Selon les travaux en cours vers la   révision de l'ISO C, la préférence   algorithme de division entière   suit les règles définies INTHE ISO   Fortran standard, ISO 1539 / IEC: 1991,   dans lequel le quotient est toujours   arrondi vers zéro.

C ++ 0x états -

  

5,6 $ / 4- « Pour opérandes intégrantes l'opérateur / donne le quotient algébrique avec une partie fractionnaire mis au rebut; 79 si le quotient a / b est représentable dans le type du résultat, (a/b)*b + a%b est égal a.

Note 79 dit

  

Ceci est souvent appelé troncature vers zéro.

J'ai donc deux questions:

  • Quelqu'un peut-il expliquer ce concept de «troncature vers zéro?

  • est le module avec des opérandes négatifs d'un comportement défini dans C ++ 0x?

Était-ce utile?

La solution

troncature vers zéro des moyens de conversion un nombre réel à un nombre entier en sélectionnant l'entier le plus proche de zéro. De manière équivalente, vous écrivez le numéro, et d'ignorer tout ce qui suit le point décimal, si le nombre est positif ou négatif.

Considérez 11/4 = 2,75 -. Si vous truncate vers zéro, vous obtenez 2

considérer -11/4 ou 11 / -4 = -2,75 -. Si vous truncate vers zéro, vous obtenez -2

Il est important pour certaines opérations mathématiques qui (a / b) * b + a% b == a. Si nous devons faire de cette prise d'équation, et nous acceptons également que la division entière tronque vers zéro, alors on peut en déduire le fonctionnement de l'opérateur % comme suit:

a == 11, b == 4:
a/b == 2, 2*4 + a%b == 11, therefore a%b == 3.

a == -11, b == 4:
a/b == -2, -2 * 4 + a%b == -11, therefore a%b == -3.

a == 11, b == -4:
a/b == -2, -2 * -4 + a%b == 11, therefore a%b == 3.

a == -11, b == -4:
a/b == 2, 2 * -4 + a%b == -11, therefore a%b == -3.

Il peut être déroutant au premier abord, mais C ++ 0x définit le comportement de l'opérateur a%b en utilisant l'équation (a/b)*b + a%b == a. Cette équation est valable même pour les nombres négatifs, donc a%b est définie pour les nombres négatifs.

Autres conseils

a) Examine (±5)/(±3) -> ±1. Sur la ligne numéro:

  (-5)/3                                     5/3
     5/(-3)                               (-5)/(-3)
      =                                       =
    -1.66 --> -1                       1 <-- 1.66
       v       v                       v       v
-  +  -  -  -  +  -  -  -  +  -  -  -  +  -  -  -  +  -
   |           |           |           |           |
  -2          -1           0           1           2

l'arrondissement est donc vers zéro.

b) Oui. Depuis a/b est maintenant défini pour tous a et b (sauf b == 0), et (a/b)*b + a%b == a, il n'y a que 1 solution unique pour a%b, donc l'opérateur % est également bien defiend pour tous a et b (sauf b == 0).

a) « troncature vers zéro » signifie simplement que toute partie décimale est élagué. Le nombre tronqué est toujours au moins aussi proche de 0 que, et le plus souvent plus que, le nombre initial.

Ceci est le plus notable dans les nombres négatifs, mais le but est de rendre moins difficile à utiliser / et % avec des chiffres négatifs (depuis le moment, toute mise en œuvre peut gérer mais ils choisir). -7/4 peut être considéré de deux façons: -2 avec un reste de 1 ou -1 avec un reste de -3. Et il y a des compilateurs et des processeurs qui manipulent les deux sens. Depuis -7/4 est en fait -1,75, « troncature vers zéro » vous donnera -1, donc la dernière manière est ce qui va être standard.

b) Voilà ce que cela ressemble. Il a toujours été semi-défini ( « l'application »), mais cela ressemble à une tentative de définir ce qui aurait été la norme depuis le début.

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