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 :

D6 : 100.0 - 81.12E-49 = 100 !?


Sujet :

Langage Delphi

  1. #1
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut D6 : 100.0 - 81.12E-49 = 100 !?
    Bonjour,

    Avec le code ci-dessous j'obtiens sous D6 100.0 - 81.12E-49 = 100 !!!???
    alors que pour -0.12578893859E-4930 - 81.12E-4930 j'obtiens un résultat exact.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button1Click(Sender: TObject);
    var A,B, Res : Extended;
    begin
      A := -0.12578893859E-4930; // E–4951 = mini
      B := -81.12E-4930;
      Res:=A+B;
      ShowMessage(FloatToStr(Res)); // Résulat = -8,124578893859E-4929 = EXACT
      edNombre.Text:=FloatToStr(Res);
      A := 100.0;
      B := -81.12E-49;
      Res:=A+B;
      ShowMessage(FloatToStr(Res)); // Résulat = 100 = FAUX
    end;
    D'où vient cette anomalie ??? S.V.P

    A+.

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 754
    Points : 13 340
    Points
    13 340
    Par défaut
    Un extended, c'est 19-20 chiffres significatifs. Tu en veux 49 !
    Et à l'affichage, c'est maximum 15 chiffres pour FloatToStr , 18 pour FloatToStrF .

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    Andnotor : Un extended, c'est 19-20 chiffres significatifs.
    OK, ça je le savais ... mais je n'avais pas pris conscience de ça :
    Tu en veux 49 !
    mais j'aurais été moins surpris si 100.0 - 81.12E-49 m'avait affiché comme résultat 99.9999999999999 donc 15 fois un '9' ce qui en plus serait beaucoup plus logique, et donc, à mon avis, c'est quand même un bug de D6.

    En tous cas merci, j'y vois plus clair.

    A+.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re-bonjour,


    OK, ça je le savais ... mais je n'avais pas pris conscience de ça :

    mais j'aurais été moins surpris si 100.0 - 81.12E-49 m'avait affiché comme résultat 99.9999999999999 donc 15 fois un '9' ce qui en plus serait beaucoup plus logique, et donc, à mon avis, c'est quand même un bug de D6.

    En tous cas merci, j'y vois plus clair.

    A+.
    ben non, c'est 100.0 - 0

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Paul TOTH : ben non, c'est 100.0 - 0
    Ayant médité sur ce sujet, je reconnais qu'avec AndNotOr vous avez raison.
    100 - Epsilon reste égal à 100 tant que Epsilon n'est pas suffisamment grand pour modifier la dernière décimale de l'Extended affiché.

    A+.

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    C'est le vieux démon de la réprésentation en virgule flottante, les règles habituelles de l'arithmétique ne s'applique plus de manière rigoureuse, elles sont largement dépendantes des différence d'ordre de grandeur entres les quantités, ainsi 1+x-1 est égale à x si x n'est pas trop petit par rapport à 1 et vaut 0 sinon car x a alors été négligé devant 1.

    Pour comprendre visuellement ce qui se passe, il suffit de poser l'opération sur papier et de ne retenir avant opération que les ordres de grandeur les plus élévés, c'est ce que fait le processeur.

    Ce genre de particularité a tôt fait d'introduire des bugs bien pourris, par exemple dans les calculs scientifiques ou financiers. Vigilance donc avec les calculs avec les Double, Extended.

    @+

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    E-ric : C'est le vieux démon de la représentation en virgule flottante, les règles habituelles de l'arithmétique ne s'appliquent plus de manière rigoureuse
    Exact, et ça me rappelle l'histoire de la division de 0 par 0 :

    '0' c'est "rien", et diviser "rien" par quelque chose c'est déjà impensable puisqu'il n'y a "rien à diviser"

    ... ensuite diviser '0' par '0' c'est encore plus tordant car c'est diviser "rien par rien" ... et diviser "rien par rien = rien".

    ... on peut ainsi démonter par l'absurde que '0' div '0' = '0' puisque "rien = 0".

    A+.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Un petit retour au source est de mise je crois....

    La division...c'est l'inverse de la multiplication...
    lorsqu'on divise, on cherche le chiffre que l'on peut multiplier par le diviseur....
    50 / 10 = 5 car 5 * 10 =50....

    0 div 0 = l'infini...d'où l'erreur sur toutes les calculatrices....
    car tout les chiffres multipliyés par 0 = 0

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Eric Boisvert : lorsqu'on divise, on cherche le chiffre que l'on peut multiplier par le diviseur....
    50 / 10 = 5 car 5 * 10 = 50..
    0 div 0 = l'infini
    Donc : infini * 0 = 0 : OK.

    ... Mais '0' div '0' = '0' est donc tout aussi vrai car 0 * 0 = 0
    ... Donc avec cela, lorsque le diviseur Epsilon tend vers 0 le résultat de la division tend vers l'infini puis arrivé à 0, hop le résultat remonte illico à 0 !!!

    A+.

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,
    ... Donc avec cela, lorsque le diviseur Epsilon tend vers 0 le résultat de la division tend vers l'infini puis arrivé à 0, hop le résultat remonte illico à 0 !!!
    Mais pas du tout!
    0 / 0 = N'importe quels chiffres!!!
    Vous pouvez choisir zero si vous le désirez
    mais tout autre chiffre est valide comme réponse...
    5e10 * 0 =0
    50 * 0 =0
    5 * 0 = 0
    0 * 0 =0

    donc toute division par zéro est infini...comme 0 / 0

  11. #11
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    La division de 0 par 0 donne un résultat indéterminé.
    Pas un résultat qui tend vers l'infini, pas 0, juste indéterminé.

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Eric Boisvert : Mais pas du tout! 0 / 0 = N'importe quels chiffres!!!
    Linkin : La division de 0 par 0 donne un résultat indéterminé.
    Pas un résultat qui tend vers l'infini, pas 0, juste indéterminé.
    En fait je pense qu'on est tous d'accord puisque diviser "rien par rien" c'est "rien" puisqu'il n'y a "rien à diviser" donc le résultat est indéterminé.

    Par contre cette discussion m'a aussi fait mieux piger pourquoi le '1' n'est pas un nombre premier alors qu'on peut dire hâtivement que '1' est divisible par '1' et "lui-même" ... mais en fait c'est faux : Y'a qu'à diviser "UN gâteau" par UN pour constater que le "gâteau" n'est nullement divisé, donc '1' div '1' est une non-division.

    A+.

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

Discussions similaires

  1. Sage 100 Comptabilité i7 et Sage 100 Immobilisations i7
    Par Community Management dans le forum SAGE
    Réponses: 0
    Dernier message: 03/06/2015, 11h07
  2. [Sage 100] Où trouver un driver ODBC ?
    Par Wasfi AG dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 14/03/2006, 10h49
  3. [W3C] height="100%" différent de style="height:100%
    Par Oluha dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 18/08/2005, 17h14
  4. premier nombre premier superieur à m=10^100+1
    Par azman0101 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 17/04/2003, 03h23
  5. Réponses: 11
    Dernier message: 17/03/2003, 10h56

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