IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Ne pas se faire avoir avec les modulo


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Par défaut Ne pas se faire avoir avec les modulo
    Je me suis fais surprendre, avec l'utilisation des modulos.

    confiant de l'indication donné par Bob dans l'article :
    http://c.developpez.com/faq/c/?page=...RATEURS_modulo

    je me suis laissé allé, et j'ai utilisé l'opération sans plus m'en soucier. Manque de pot, j'avais un comportement hératique de mon programme (les valeurs modifiées dans un tableau n'étaient pas les bonnes)

    solution :

    L'operateur modulo, ainsi que la division entière dépendent de l'implémentation du compilateur. Et si la définition coincide avec la formule mathématique, sur les entiers positifs, ce n'est pas forcément le cas pour les entiers négatifs.

    ainsi
    -1 % 4 vaudra soit -1 (cas le plus courant) soit 3 (respect de la formule mathématique).
    moi qui m'attendais à un resultat positif j'ai été bien surpris.

    la seule recommendation dans la norme, c'est que le choix doit etre cohérent de sorte que :

    a = (a/b)*b + (a%b)

    Donc pour conclure, il faudrait mettre à jour l'article.

    Et voila ma question, y'a t-il une option du compilateur (gcc en l'occurence) pour le forcer à utiliser la définition mathématique plutôt que la définition par défault qui ma fois ne sert à rien puisqu'elle ne vérifie pas la propriété :

    0 <= i%N < N

    Et s'il n'y en a pas, quel sont les versions de gcc qui utilise la définition que je veux.

    Merci

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Non. En fait, la réponse -1 est exigée en C99 (en C90 le compilateur a le choix) et il me semble me souvenir que le changement a été fait après avoir remarqué que pas une implémentation ne donnait ce que tu considères comme la bonne solution. (Je viens d'aller voir le Rationale, il indique juste que le Fortran a la même règle que C99).

    On en a parlé ici récemment.

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Par défaut
    oui désolé, je parlais de la vieille norme ANSI/C, je ne sais pas à qu'elle norme ISO elle correspond.

    En faite, je ne sais même qu'elle est la norme en cours!

    merci pour ta réponse rapide, même si ce que tu m'apprend ne me convient pas du tout .

    Et au sujet d'une option miracle tu ne sais rien?

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Par défaut
    J'ai remarqué que j'ai même pas dis "bonjour", La belle goujaterie que c'est là.

    Pardon, et Bonjour

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par buzard
    oui désolé, je parlais de la vieille norme ANSI/C, je ne sais pas à qu'elle norme ISO elle correspond.
    C90

    En faite, je ne sais même qu'elle est la norme en cours!
    C99+TC1+TC2 (TC: Technical Corrigendum, autrement dit, bug fix)

  6. #6
    Membre averti
    Inscrit en
    Août 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 26
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    pas une implémentation ne donnait ce que tu considères comme la bonne solution.
    En faite, je ne le considère pas, mais seulement elle m'aurait été pratique dans ce cas particluier (cela m'aurais éviter au moins cinq minutes de débogage, à essayé de comprendre pourquoi j'avais ce comportement).

    Ce n'est pas trés grave, en faite. Je m'en tire en ajoutant une valeur suffisement grande et multiple de mon operande, ainsi je retombe sur le cas positif.

    Le pire c'est que j'avais hésité à utilisé un simple mask sur les deux derniers bits, car j'utilise des modulo 4. Et je me suis dis que j'y perdais en généralité. Finallement je crois que je vais le faire, ainsi ce sera un peu optimisé.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par buzard
    Le pire c'est que j'avais hésité à utilisé un simple mask sur les deux derniers bits, car j'utilise des modulo 4. Et je me suis dis que j'y perdais en généralité. Finallement je crois que je vais le faire, ainsi ce sera un peu optimisé.
    Faire des masques sur des signés, c'est du comportement indéfini quand les nombres sont négatifs. Tu peux faire un cast en unsigned avant, mais alors mettre % fonctionnera tout aussi bien.

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/05/2018, 14h23
  2. Excel ne peux pas compléter la tache avec les ressources disponible
    Par hbc87 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/07/2010, 15h05
  3. iReport/ compilation/ erreur avec les modulo
    Par jamesleouf dans le forum iReport
    Réponses: 5
    Dernier message: 23/04/2009, 16h37
  4. Réponses: 27
    Dernier message: 24/05/2007, 23h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo