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 Delphi Discussion :

[D7 Ent. / XP] Trunc() sur un nombre négatif


Sujet :

Langage Delphi

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut [D7 Ent. / XP] Trunc() sur un nombre négatif
    Bonjour,

    J'aimerais savoir pourquoi Trunc(24930) renvoie 24930 alors que Trunc(-24930) renvoie -24929 ?

    Pour info, j'ai rencontré ce souci à l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := trunc( Value/10 )/100
    que j'ai corrigé en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := SimpleRoundTo(Value/10, -2)/100
    Qu'en pensez-vous ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Chez moi, ce code affiche les deux mêmes valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ShowMessage(IntToStr(Trunc(24930)));
    ShowMessage(IntToStr(Trunc(-24930)));
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Je te crois volontiers MD Software car je me suis demandé si, dans le projet que je reprends où j'ai trouvé cette erreur, la fonction Trunc n'a pas été redéfinie.

    J'ai donc fait un CTRL + CLIC DROIT pour aller sur la définition de la fonction et le curseur se positionne alors sur la 1ère ligne de l'unité System (et non pas de l'unité Math.pas).

    Là je commence à me perdre...
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  4. #4
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Trunc est une fonction de l'unité system. Si tu veux utiliser les fonctions de l'unité Math, tu as Ceil ou Floor.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Nan nan je veux pas utiliser les fonction de l'unité Math => ce qui m'étonne c'est que quand je recherche la définition d'une fonction avec CTRL + CLIC alors le curseur se positionne sur la définition de cette fonction dans l'unité où elle est déclarée.

    OR là, le curseur se trouve bien dans l'unité System comme indiqué dans l'aide mais je ne comprends pas pourquoi il se trouve sur la 1ère LIGNE au lieu de se mettre au niveau de la DECLARATION de la fonction (ce qu'il fait habituellement) ?

    Toujours est-il, de savoir que ça marche chez toi avec les nombres négatifs laisse donc supposer que la fonction Trunc est (dans ce projet) une fonction redéfinie, non ?

    Merci de ta réactivité.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  6. #6
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Si tu colles mon code dans le clic d'un bouton dans ton projet, les résultats sont différents ?
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Ben... ça donne exactement les mêmes résultats que chez toi : 24930 et -24930 ; pourtant j'ai fait pas mal de tests en mode débug avant d'arriver à la conclusion à l'origine de ce post.

    Je marque le sujet résolu mais je suis obligé de modifier le code pour pallier à ce problème : je stocke dans un booléen si le nombre est négatif est dans tous les cas je fais mes calculs d'arrondis sur un nombre positif que je multiplie éventuellement par (-1) en fin de traitement selon la valeur de ce booléen.

    Même si je n'ai pas (encore) compris la cause de mon problème : merci encore FLASH GORDON 8)
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Voici ce que j'ai en mode débug :
    Trunc(-249300/10)/100 renvoie -249.30 (normal)
    mais
    Trunc(Valeur*1000/10)/100 renvoie -249.29
    où Valeur est déclaré comme Double et vaut -249.3

    C'est fou non ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  9. #9
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Chez moi, ce code donne la même valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      var valeur : Double;
    begin
      valeur := 249.3;
      ShowMessage(FloatToStr(Trunc(Valeur*1000/10)/100));
      valeur := -249.3;
      ShowMessage(FloatToStr(Trunc(Valeur*1000/10)/100));
    end;
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Magnus
    Voici ce que j'ai en mode débug :
    Trunc(-249300/10)/100 renvoie -249.30 (normal)
    mais
    Trunc(Valeur*1000/10)/100 renvoie -249.29
    où Valeur est déclaré comme Double et vaut -249.3

    C'est fou non ?
    Il faut savoir que la machine travaille en base 2 dans laquelle il n'y a pas de représentation exacte de 249,3. donc selon les calculs précédents elle a pu arriver à 249,3000000000000001 ou 249,2999999999999999...

    Je pense que c'est l'explication.

  11. #11
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Citation Envoyé par sovitec
    Je pense que c'est l'explication.
    Je pense aussi
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Ah d'accord donc la solution que j'ai développé, c'est-à-dire : travailler toujours sur des valeurs positives (ce qui résoud mon problème actuellement) n'est pas une solution fiable ?

    D'autre part, le paramètre de la procédure "BUGUEE" est obtenu en effectuant l'opération suivante : 546.30 - 795.60 = -249.30 , ce qui ne donne pourtant pas un résultat avec un nombre de chiffres infini derrière la virgule ?

    Enfin, j'ai compris l'idée mais maintenant je n'ai plus trop confiance dans ce que j'ai développé

    Merci à vous 2
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Mais en fait c'est encore pire que ça parce que si cette erreur de représentation vient du fait que le programme ne travaille pas avec la valeur -249.30 EXACTEMENT alors je ne devrais pas obtenir un résultat correct en effectuant STRICTEMENT le même calcul en valeur absolue ?

    Et pourtant ça marche (ie : avec ce principe de calculer en valeur absolue, j'obtiens le bon résultat)
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Magnus
    D'autre part, le paramètre de la procédure "BUGUEE" est obtenu en effectuant l'opération suivante : 546.30 - 795.60 = -249.30 , ce qui ne donne pourtant pas un résultat avec un nombre de chiffres infini derrière la virgule ?
    Ces nombres n'ont pas une infinité de chiffres après la virgule en base 10, mais en base 2 si, et l'ordinateur, lui, travaille en base 2.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 488
    Points : 397
    Points
    397
    Par défaut
    Citation Envoyé par Magnus
    Mais en fait c'est encore pire que ça parce que si cette erreur de représentation vient du fait que le programme ne travaille pas avec la valeur -249.30 EXACTEMENT alors je ne devrais pas obtenir un résultat correct en effectuant STRICTEMENT le même calcul en valeur absolue ?

    Et pourtant ça marche (ie : avec ce principe de calculer en valeur absolue, j'obtiens le bon résultat)
    Hmm, c'est vrai qu'il faudrait se pencher sur la question pour voir ce qu'il se passe exactement. Mais sinon pourquoi ne pas utiliser Round plutôt que Trunc ?

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

Discussions similaires

  1. Génération d'une clé de contrôle sur un nombre
    Par soulryo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/02/2005, 14h50
  2. [langage] Erreur d'arrondi sur petits nombres
    Par Tchetch dans le forum Langage
    Réponses: 7
    Dernier message: 12/01/2005, 10h11
  3. [68000] EXT nombre négatif
    Par fastzombi dans le forum Autres architectures
    Réponses: 2
    Dernier message: 02/05/2004, 12h17
  4. Réponses: 3
    Dernier message: 08/09/2003, 15h06

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