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 :

Bug de delphi ???


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Bug de delphi ???
    Alors, un petit problème pour votre sagacité.

    On est bien d'accord que Int(1.2*10) ça fait 12. D'ailleurs quand je fais ShowMessage(FloatToStr(Int(1.2*10))), il m'affiche bien 12.

    Maintenant je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var r: real;
    r := 1.2;
    ShowMessage(FloatToStr(int(r * 10)));
    Vous pouvez me dire pourquoi il affiche 11 et pas 12 ???

    (edit: je précise, au cas où, que je suis sous Delphi 7, Windows 32 sur processeur 64, et que le fait de passer du real au double ne change rien, et aussi que je tiens à mon arrondi).

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Non, avec les erreur d'arrondi ça fait 11.9999999999, Or int() arrondi toujours à l'entier inférieur.

    cf http://delphi.developpez.com/faq/?pa...e#reeltoentier
    et http://delphi.developpez.com/faq/?pa...e#arrondirreel

  3. #3
    Candidat au Club
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour la rapidité, mais je connaissais déjà toutes ces fonctions ^^

    Tu peux me dire comment c'est possible au niveau de la représentation interne ? Je veux dire, il renvoie pas le même résultat en faisant
    1.2*10

    qu'en faisant
    r := 1.2
    r*10

    pourtant quand le compilateur voit 1.2 la première fois (sans le r), il le traite bien comme un real, je vois pas pourquoi ça marche dans un sens et pas dans l'autre.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Effectivement, il y a bien une erreur pour 1.2, mais pas pour 1.3 ???
    L'erreur vient du type de R. Si on le met en tant qu' Extended, ca va parfaitement.

    L'aide Delphi ne dit pas grand chose sur le Type Real à part qu'il est moins précis qu'Extended

  5. #5
    Candidat au Club
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ça aurait pas un rapport avec le "Banker’s Rounding" ? (" If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called "Banker’s Rounding".") Pourtant la fonction int n'utilise pas ce type d'arrondi, c'est pour la fonction Round d'après l'aide...

    Et puis bon je veux bien que le type Real soit moins précis qu'Extended, mais si le Real n'est même pas foutu de stocker un nombre aussi "peu précis" que 1.2 alors où va-t'on ?

  6. #6
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par rheuh
    Tu peux me dire comment c'est possible au niveau de la représentation interne ? Je veux dire, il renvoie pas le même résultat en faisant
    1.2*10

    qu'en faisant
    r := 1.2
    r*10
    Ca dépend du type de R et ça dépend de la configuration actuelle de la précision de calcul du coprocesseur. En détail ce sera long à expliquer, dans les grandes lignes :

    Tu as nativement dans le copros intel les trois type suivant :
    Flottant 32 bits => Single
    Flottant 64 bits => Double, Real
    Flottant 80 bits => extended.

    Le coprocesseur travail avec une précision constante peut importe les valeurs 32,64 ou 80 bits qui lui sont transmises. Un registre d'état interne au copro permet de fixer ( entre autres ) sa précision de calcul. Il est possible de modifier ce registre dans Delphi via la fonction Set8087CW. L'aide de cette fonction te donnera des détails, mais pour le fonctionnement complet il faut aller voir sur le site d'Intel directement.

    Dans ton premier cas, la valeur en chargée une fois dans le coprocesseur ( 1.2 ) puis tous les calculs sont effectués avant la conversion dans le type final.

    Dans le deuxième cas il y a une conservion intermédiaire pour le stockage dans R. Ca peut suffir à changer très légèrement le résultat.

    Dans le registre du copro il existe aussi des notions d'arrondi qui peuvent changer le résultat.

  7. #7
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Citation Envoyé par rheuh
    Et puis bon je veux bien que le type Real soit moins précis qu'Extended, mais si le Real n'est même pas foutu de stocker un nombre aussi "peu précis" que 1.2 alors où va-t'on ?
    Pourquoi 1.2 est moins précis que 1.2082352997826356757657537 ?
    C'est 1.20000000000000000000000000000000 !!!! Donc c'est aussi compliqué à stocker

  8. #8
    Candidat au Club
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Hé ben écoute, en cours d'algo on m'a appris que 1.2 c'était 12*10^-1 et que1.2082352997826356757657537 c'était 1208235.....*10^-15, ça fait quand même une grande différence au niveau de la simplicité !

    12*10^-1 se code sur très peu de bits, alors que 1.208235298479516 en demande bien plus !

  9. #9
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Non tu te trompes, 1.2 est bien représenté. A un nombre de décimale infini 1.2000000000000000000 est égal à 1.199999999999999999999999

    C'est à toi de gérer l'erreur de représentation que tu auras toujours, tu peux très bien avoir le même soucis avec un Extended dans un autre cas particulier. C'est le Int() qui est une erreur dans ton cas.

  10. #10
    Candidat au Club
    Inscrit en
    Août 2003
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    OK, hé bien j'utiliserai des Extended et ça me bouffera un peu de mémoire en plus. Merci pour les infos en tout cas ^^

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

Discussions similaires

  1. [TOpenPictureDialog Delphi 2007] Bug de Delphi ou de Vista ?
    Par pascal07 dans le forum Composants VCL
    Réponses: 0
    Dernier message: 18/12/2007, 21h52
  2. Bug dans Delphi 7 ?
    Par Teddy dans le forum Delphi
    Réponses: 8
    Dernier message: 26/06/2007, 20h29
  3. Bug programme Delphi sur certains XP
    Par Philippe85 dans le forum Delphi
    Réponses: 11
    Dernier message: 13/12/2006, 12h51
  4. Bug dans delphi 2006? Include()
    Par the big ben 5 dans le forum Delphi .NET
    Réponses: 5
    Dernier message: 08/11/2006, 14h42
  5. [Delphi 7][Win 2000][IconeTray]Bug ?
    Par Giovanny Temgoua dans le forum Langage
    Réponses: 2
    Dernier message: 02/09/2004, 19h09

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