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

Langage Pascal Discussion :

Calcul erroné d'un carré dans un longint


Sujet :

Langage Pascal

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 85
    Points
    85
    Par défaut Calcul erroné d'un carré dans un longint
    Salut,
    je ne comprends pas pourquoi Pascal se trompe dans le calcul de 297 au carré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    program test;
    uses wincrt;
    var x : longint ;
    begin
    x := sqr(297) ;
    writeln(x);
    end.
    Il m'affiche 22673 au lieu de 88209 !!
    Merci.

  2. #2
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par paskal++ Voir le message
    Salut,
    je ne comprends pas pourquoi Pascal se trompe dans le calcul de 297 au carré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    program test;
    uses wincrt;
    var x : longint ;
    begin
    x := sqr(297) ;
    writeln(x);
    end.
    Il m'affiche 22673 au lieu de 88209 !!
    Merci.
    lazarus me donne 88209.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    lazarus me donne 88209.
    je connais pas la version de mon turbo pascal pour windows ( non précisé au menu aide) mais je crois que le problème vient de sqr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    program test;
    uses wincrt;
    var x : longint ;
    begin
    x := 297 ;
    x := x * x ;
    writeln(x);
    end.
    résultat correct !

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    CA c'est un ce que j'appelle un effet de bord !!!!!!! (Votre autre post sur la question des effets de bord est totalement à côté de la plaque à mon avis).

    Tu t'attends à 88209 mais tu obtiens 22673, soit 88209 - 65536. Pourquoi ? Ta variable x longint avec le premier compilateur que tu as utilisé était stocké sur 16 bits, donc peut varier de 0 à 65535. Si tu avais faire x := 65535 + 1, le résultat aurait été 0 (il faut regarder la représentation binaire pour comprendre plus en détail, si ça t'intéresse j'expliquerai ça).

    Sous un autre compilateur, la variable longint est stockée sur 32 bits, et là ça marche... Et oui 88209 ne peut être codé sur 17 bits minimum :
    • Dans 32 bits, ca rentre (bon résultat du deuxième compilateur)
    • Dans 16 bits, seuls les 16 premiers bits sont pris en compte, ce qui équivaut à 22673


    Compris ? Ca pour moi c'est un effet de bord....
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Voe,

    Ce n'est pas un effet de bord, mais une simple limitation due aux types utilisés par un compilateur donné.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par wormful_sickfoot Voir le message
    Tu t'attends à 88209 mais tu obtiens 22673, soit 88209 - 65536. Pourquoi ? Ta variable x longint avec le premier compilateur que tu as utilisé était stocké sur 16 bits, donc peut varier de 0 à 65535. Si tu avais faire x := 65535 + 1, le résultat aurait été 0 (il faut regarder la représentation binaire pour comprendre plus en détail, si ça t'intéresse j'expliquerai ça).
    salut,
    je suis pas sûr mais je crois pas qu'une variable de type longint (type signé) varie de 0 à 65535 (je dirais plutôt le type word ).

    pour l'effet de bord je voulais tout simplement comprendre cette notion mais j'avoue que la question est peut être involontairementmal posée !

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Les étendues des types de variables changent d'un compilateur à l'autre, en fonction de l'architecture sur laquelle ils sont sensés compiler. Pour TP, c'est un compilateur 16bits pour plateforme x86 16bits (ça tourne sur 32bits et 64bits grâce à des mécanismes assurant la compatibilité). Donc sous TP, par exemple un integer est codé sur 16 bits. Sous Delphi ou FreePascal, qui sont des compilateurs 32bits, un integer est stocké sur 32 bits. Le même procédé s'applique aux autres variables, dont longint.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

Discussions similaires

  1. Calcul de plus court chemin dans un graphe
    Par Elmilouse dans le forum Prolog
    Réponses: 6
    Dernier message: 21/03/2010, 20h26
  2. [TSQL] calculer le nombre de mot dans une cellule
    Par ricachu dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 31/07/2006, 11h12
  3. [Dates] Calculer le nombre de jours dans le mois suivant...
    Par Life Hunter dans le forum Langage
    Réponses: 5
    Dernier message: 14/03/2006, 00h01
  4. Integrer un carré dans un RichEdit
    Par Harry dans le forum Composants VCL
    Réponses: 3
    Dernier message: 29/09/2004, 15h02
  5. Comparaison de base et calculs du nombre d'éléments dans Bas
    Par BXDSPORT dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/07/2004, 08h00

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