remquo, norme C et signe de 0

Le
Vincent Lefevre
Bonjour,

La norme ISO C99 dit:

7.12.10.3 The remquo functions
[]
[#2] The remquo functions compute the same remainder as the
remainder functions. In the object pointed to by quo they store
a value whose sign is the sign of x/y and whose magnitude is
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
congruent modulo 2^n to the magnitude of the integral quotient
of x/y, where n is an implementation-defined integer greater
than or equal to 3.

Mais avec toutes les implémentations testées jusqu'à présent (Linux
(glibc), Mac OS X 10.4.9 et Solaris 10), on obtient, pour certaines
valeurs de (x,y), 0 dans quo bien que x/y soit différent de 0. Est-ce
un bug de ces implémentations, ou bien la norme C parle-t-elle du
signe du 0 entier quelque part (je n'en ai pas l'impression), ou bien
est-ce une interprétation large de la norme (0 étant considéré à la
fois comme positif et négatif ici, mais pas ailleurs[*])?

[*] Cf l'emploi de "nonnegative" dans la norme, qui signifie >= 0
et non > 0.

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #1005329
Vincent Lefevre
Bonjour,

La norme ISO C99 dit:

7.12.10.3 The remquo functions
[...]
[#2] The remquo functions compute the same remainder as the
remainder functions. In the object pointed to by quo they store
a value whose sign is the sign of x/y and whose magnitude is
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
congruent modulo 2^n to the magnitude of the integral quotient
of x/y, where n is an implementation-defined integer greater
than or equal to 3.

Mais avec toutes les implémentations testées jusqu'à présent (Linux
(glibc), Mac OS X 10.4.9 et Solaris 10), on obtient, pour certaines
valeurs de (x,y), 0 dans quo bien que x/y soit différent de 0. Est-ce
un bug de ces implémentations, ou bien la norme C parle-t-elle du
signe du 0 entier quelque part (je n'en ai pas l'impression), ou bien
est-ce une interprétation large de la norme (0 étant considéré à la
fois comme positif et négatif ici, mais pas ailleurs[*])?


Je crois que les implémentations sont plus proches de ce qui était désiré
que la formulation -- qui m'a plutôt l'air d'oublier le cas 0 que de le
considérer à la fois comme positif et négatif. Les spécifications sur le
signe et le modulo ne sont à mon sens présentes plus pour spécifier le
comportement quand le quotient entier n'est pas représentable dans un int,
que pour envoyer un quotient entier vers quelque chose de généralement
inutile.

De même, je m'attends à ce que le "quotient entier" ne soit pas floor(x/y)
-- qui me semble être la définition de quoitient entier -- mais plutôt
l'entier le plus proche de la valeur exacte de x/y avec les valeurs paires
utilisées pour trancher les ex-aequo, pour le les deux résultats de la
fonction soient cohérent.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Vincent Lefevre
Le #1002767
Dans l'article Jean-Marc Bourguet
Je crois que les implémentations sont plus proches de ce qui était désiré
que la formulation -- qui m'a plutôt l'air d'oublier le cas 0 que de le
considérer à la fois comme positif et négatif. Les spécifications sur le
signe et le modulo ne sont à mon sens présentes plus pour spécifier le
comportement quand le quotient entier n'est pas représentable dans un int,
que pour envoyer un quotient entier vers quelque chose de généralement
inutile.


Même avec cette précision sur le signe de quo, le comportement n'est
pas complètement spécifié (d'ailleurs la norme dit bien "a value" et
non pas "the value", si bien que je ne pense pas qu'elle sous-entend
également que la magnitude doive être < 2^n). Cette spécification sur
le signe ne sert pas à grand chose, sauf peut-être en vue de
l'application d'un "quo % (1<<k)" avec k <= n, et d'obtenir ainsi une
symétrie par rapport à 0 sans avoir à faire de test supplémentaire.
Mais ce n'est pas si évident: a priori, je pensais que le signe pouvait
permettre de déterminer rapidement le signe de x/y (toujours pas très
utile, ceci dit). L'oubli du cas 0 ne serait-il pas un défaut de la
norme?

De même, je m'attends à ce que le "quotient entier" ne soit pas floor(x/y)
-- qui me semble être la définition de quoitient entier -- mais plutôt
l'entier le plus proche de la valeur exacte de x/y avec les valeurs paires
utilisées pour trancher les ex-aequo, pour le les deux résultats de la
fonction soient cohérent.


Il me semble que la définition générale de "quotient entier" inclut
à la fois floor(x/y) et ceil(x/y), mais c'est trunc(x/y) quand le
contexte ne permet pas de dire autrement. Ici, ce que la norme
entend par quotient entier est déterminé par le contexte. Redonner
la définition alourdirait probablement le paragraphe.

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

jacob navia
Le #1002593
Vincent Lefevre wrote:
Bonjour,

La norme ISO C99 dit:

7.12.10.3 The remquo functions
[...]
[#2] The remquo functions compute the same remainder as the
remainder functions. In the object pointed to by quo they store
a value whose sign is the sign of x/y and whose magnitude is
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
congruent modulo 2^n to the magnitude of the integral quotient
of x/y, where n is an implementation-defined integer greater
than or equal to 3.

Mais avec toutes les implémentations testées jusqu'à présent (Linux
(glibc), Mac OS X 10.4.9 et Solaris 10), on obtient, pour certaines
valeurs de (x,y), 0 dans quo bien que x/y soit différent de 0. Est-ce
un bug de ces implémentations, ou bien la norme C parle-t-elle du
signe du 0 entier quelque part (je n'en ai pas l'impression), ou bien
est-ce une interprétation large de la norme (0 étant considéré à la
fois comme positif et négatif ici, mais pas ailleurs[*])?

[*] Cf l'emploi de "nonnegative" dans la norme, qui signifie >= 0
et non > 0.



1)
C'est possible de donner des examples?
(Avec des valeurs)

2)
lcc-win32 implemente aussi remquo. C'est different des autres?

Merci

http://www.cs.virginia.edu/~lcc-win32

Vincent Lefevre
Le #1002592
Dans l'article jacob navia
1)
C'est possible de donner des examples?
(Avec des valeurs)


http://www.vinc17.org/software/remquo.c donne sous Linux/x86:

x is positive, y is positive
x = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
y = 0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
y = 1: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0
y = 2: 0 0 1 2 2 2 3 4 4 4 5 6 6 6 7 0 0
y = 3: 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
y = 4: 0 0 0 1 1 1 2 2 2 2 2 3 3 3 4 4 4
y = 5: 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3
y = 6: 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 3
y = 7: 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2
y = 8: 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2
y = 9: 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2
y = 10: 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2
y = 11: 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
y = 12: 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
y = 13: 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
y = 14: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
y = 15: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
y = 16: 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

x is negative, y is positive
x = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
y = 0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
y = 1: 0 -1 -2 -3 -4 -5 -6 -7 0 -1 -2 -3 -4 -5 -6 -7 0
y = 2: 0 0 -1 -2 -2 -2 -3 -4 -4 -4 -5 -6 -6 -6 -7 0 0
y = 3: 0 0 -1 -1 -1 -2 -2 -2 -3 -3 -3 -4 -4 -4 -5 -5 -5
y = 4: 0 0 0 -1 -1 -1 -2 -2 -2 -2 -2 -3 -3 -3 -4 -4 -4
y = 5: 0 0 0 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -3 -3 -3 -3
y = 6: 0 0 0 0 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -3
y = 7: 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2
y = 8: 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2
y = 9: 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2
y = 10: 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2
y = 11: 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 12: 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 13: 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 14: 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 15: 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 16: 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1

x is positive, y is negative
x = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
y = 0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
y = 1: 0 -1 -2 -3 -4 -5 -6 -7 0 -1 -2 -3 -4 -5 -6 -7 0
y = 2: 0 0 -1 -2 -2 -2 -3 -4 -4 -4 -5 -6 -6 -6 -7 0 0
y = 3: 0 0 -1 -1 -1 -2 -2 -2 -3 -3 -3 -4 -4 -4 -5 -5 -5
y = 4: 0 0 0 -1 -1 -1 -2 -2 -2 -2 -2 -3 -3 -3 -4 -4 -4
y = 5: 0 0 0 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -3 -3 -3 -3
y = 6: 0 0 0 0 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2 -2 -3
y = 7: 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2 -2
y = 8: 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2 -2 -2
y = 9: 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2 -2
y = 10: 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -2
y = 11: 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 12: 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 13: 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 14: 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 15: 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1 -1
y = 16: 0 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 -1

x is negative, y is negative
x = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
y = 0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
y = 1: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0
y = 2: 0 0 1 2 2 2 3 4 4 4 5 6 6 6 7 0 0
y = 3: 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
y = 4: 0 0 0 1 1 1 2 2 2 2 2 3 3 3 4 4 4
y = 5: 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3
y = 6: 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 3
y = 7: 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2
y = 8: 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2
y = 9: 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2
y = 10: 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2
y = 11: 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
y = 12: 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
y = 13: 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
y = 14: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
y = 15: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
y = 16: 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

2)
lcc-win32 implemente aussi remquo. C'est different des autres?

Merci

http://www.cs.virginia.edu/~lcc-win32


Cela n'a pas l'air d'être documenté.

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)

Publicité
Poster une réponse
Anonyme