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 :

calcul sur entiers


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut calcul sur entiers
    Bonjour,

    existe-t-il une règle ou une référence qui concernerait le calcul avec des nombres entiers signés (type int)?

    J'ai un petit soucis lors de la division d'un nombre impair:

    si on divise 3 par 2, le résultat est égal à 1
    si on divise 1 par 2, le résultat est égal à 0

    maintenant, si on divise -1 par 2, je trouve qu'il serait logique que le résultat soit égal à -1, ce qui correspond à la partie entière. Et bien non, Borland C++ trouve à nouveau 0.
    et ainsi de suite:
    -3/2 -> -1
    etc.

    Quelqu'un en sait-il plus?

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Je ne connais pas les règles de la division d'un nombre entier signé. Mais il me reste quelques souvenirs d'école concerant la division.

    3 / 2 = 1.5 ==> partie entière de 1.5 --> 1
    1 / 2 = 0.5 ==> partie entière de 0.5 --> 0

    -3 / 2 = -1.5 ==> partie entière de -1.5 --> -1
    -1 / 2 = -0.5 ==> partie entière de -0.5 --> 0

    Le résultat de ta division est la partie entière du quotient.

    CQFD non?

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    C90 laissait le choix à l'implémentation, C99 spécifie qu'il faut arrondir vers 0 comme tu l'as observé. Il me semble avoir lu que c'est après avoir vérifié que personne ne connaissait d'implémentation où ce n'était pas le cas.

    L'objectif de l'arrondi vers 0, c'est de conserver le fait que la division est impaire pour le dividende et pour le diviseur comme avec les réels (si on change le signe du dividende ou du diviseur, le résultat change simplement de signe). L'opérateur % lui est alors impair pour le dividende et pair pour le diviseur. On peut aussi dire que l'opérateur % a le signe du dividende.

    Si a et b sont positifs et c = a/b et d = a%b, alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -a/ b == -c && -a% b == -d;
     a/-b == -c &&  a%-b ==  d;
    -a/-b ==  c && -a%-b == -d;

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Est-ce que ca n'aurait pas, surtout à voir avec les règles classiques d'arrondi?

    Si la décimale est comprise entre .0 et .5-->arrondi inférieur
    Si la décimale est comprise entre .6 et .9-->arrondi supérieur

    Ainsi, 7/4 ==>1.75 donnera-t-il 1, ou 2? (je suis pris d'un doute)

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ainsi, 7/4 ==>1.75 donnera-t-il 1, ou 2? (je suis pris d'un doute)
    1 car l'arrondi se fait vers 0.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Citation Envoyé par seriousme
    1 car l'arrondi se fait vers 0.
    Ah... Mettons donc que je n'ai rien dit

  7. #7
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut
    Il me semble qu'aucun arrondi n'est appliqué : une troncature est faite, en enlevant la partie décimale, tout simplement, non ?

    A+

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    When integers are divided, the result of the / operator is the algebraic quotient with any
    fractional part discarded.88) If the quotient a/b is representable, the expression
    (a/b)*b + a%b shall equal a.

    88) This is often called ‘‘truncation toward zero’’.
    Draft 9899 6.5.5 point 6

  9. #9
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut
    Si je sais lire l'anglais correctement, ça confirme ce que je dis non ?

    A+ bonne soirée !

  10. #10
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    merci pour vos réponses.

    1 / 2 = -0.5 ==> partie entière de -0.5 --> 0

    Le résultat de ta division est la partie entière du quotient.

    CQFD non?
    ben non. La partie entière est l'entier immédiatement inférieur donc E(-0.5) = -1.

    Il semble bien qu'il s'agisse d'une troncature.

    J'ai trouvé un article dans wikipedia qui disait que ça dépendait des implémentations au niveau compilateur.

    A+

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par jackk
    J'ai trouvé un article dans wikipedia qui disait que ça dépendait des implémentations au niveau compilateur.
    Au risque de me répéter:
    - C90 laisse le choix
    - C99 impose la troncature.

  12. #12
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 480
    Points
    3 480
    Par défaut
    Merci pour cette précision Jean Marc

  13. #13
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Citation Envoyé par jackk
    merci pour vos réponses.

    ben non. La partie entière est l'entier immédiatement inférieur donc E(-0.5) = -1.

    Il semble bien qu'il s'agisse d'une troncature.

    J'ai trouvé un article dans wikipedia qui disait que ça dépendait des implémentations au niveau compilateur.

    A+
    Relis-moi correctement. Je n'ai pas parler d'arrondi mais de récupérer la partie entière du quotient.

    La partie entière de -0.5 est 0 et non -1.

  14. #14
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 516
    Points : 706
    Points
    706
    Par défaut
    Au risque de me répéter:
    - C90 laisse le choix
    - C99 impose la troncature.
    Désolé, tu fais peut-être référence à une normalisation du C?

    Je pensais que tu parlais d'un compilateur en particulier.

    Relis-moi correctement. Je n'ai pas parler d'arrondi mais de récupérer la partie entière du quotient.

    La partie entière de -0.5 est 0 et non -1.
    oui, oui, j'ai bien lu.

    Mais tu fais erreur, la partie entière de -0.5 est bien égale à -1

    A+

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par jackk
    Désolé, tu fais peut-être référence à une normalisation du C?
    Oui.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculs sur Grands entiers.
    Par elishac dans le forum Caml
    Réponses: 20
    Dernier message: 22/06/2009, 09h22
  2. Probleme de dépassement sur des calculs d'entiers
    Par Sébastien THEVOT dans le forum C
    Réponses: 21
    Dernier message: 06/09/2006, 10h02
  3. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  4. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55
  5. Réponses: 4
    Dernier message: 15/12/2002, 04h19

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