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

Delphi Discussion :

Je ne sais pas faire une addition ?


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Je ne sais pas faire une addition ?
    Bonjour a tous

    Y a t il quelqu'un qui peux me dire pour quoi
    2,0173838401E+1078 + 3,0691830754E+1194 = 2,0173838401E+1078

    Comme vous l'avez pu le constatez l'addition est fosse car le résultat est égale au 1er opérande bien que le 2eme opérande soit différant de 0

    Vous pouvez vérifier cela avec la calculatrice de windows.

    Merci .

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Même le correcteur orthographique ne marche pas !

  3. #3
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut
    Même le correcteur orthographique ne marche pas !
    Il y a déjà pas mal de temps que j'ai constaté qu'il y a peu de membres chez lesquels il fonctionne.

    Mais trève de plaisanterie, chez moi, le résultat est 3,0691830754E+1194, ce qui n'est pas mieux.

  4. #4
    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
    je regrette mais je suis bien d'accords avec ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    2.0173838401e+1078 +  3.0691830754e+1194 =  3.0691830754e+1194
    cette réponse est exacte!

    une preuve?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    1.0e+100 + 1.0e+100 = 2.0e+100
    1.0e+100 + 1.0e+101 = 1.1e+101
    1.0e+100 + 1.0e+105 = 1.00001e+105
    1.0e+100 + 1.0e+110 = 1.0000000001e+110
    1.0e+100 + 1.0e+120 = 1.00000000000000000001e+120
    1.0e+100 + 1.0e+150 = 1.0e+150
    cqfd

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    La réponse :
    2,0173838401E+1078 + 3,0691830754E+1194 = 3,0691830754E+1194
    peut être considérée comme juste.


    Par contre effectivement :
    2,0173838401E+1078 + 3,0691830754E+1194 = 2,0173838401E+1078
    ça craint...

  6. #6
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    j'ai le meme probleme que defluc j' ne arrive meme pas a faire l'opération avec EXCEL a mon avis le valeur et trops importante pour etres contenu dans variable Extentend alors il renvoi un opérande le mieux serai une exception.

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Hal,
    Citation Envoyé par aityahia
    j'ai le meme probleme que defluc j' ne arrive meme pas a faire l'opération avec EXCEL a mon avis le valeur et trops importante pour etres contenu dans variable Extentend alors il renvoi un opérande le mieux serai une exception.
    Pourquoi une exception ?

    Ce genre de truc arrive plus souvent que tu veux bien le croire, et est simplement dû aux limites de précisions des nombres flottants :
    dans le cas présent, ajouter 2 nombres qui différent d'environ 1E116, alors que la précision max des flottants est d'environ 19 chiffres (en extended, moins en double, et encore moins en float), soit 1E19, conduit inévitablement au réultat : le plus grand des 2,
    d'où l'étonnement quand on lit
    2,0173838401E+1078 + 3,0691830754E+1194 = 2,0173838401E+1078
    On en revient très souvent là : il faut faire attention quand on travaille avec des flottants, et bien être conscient des problèmes que ça peut poser.

  8. #8
    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 à tous

    On en revient toujours au même problème ! C'est surprenant le nombre de programmeurs qui ne sont pas informés de ce problème "fondamental" qu'est le calcul en virgule flottante. Ca fait vraiment peur si on considère le nombre de logiciels qui réalise ce type de calculs, j'ose espèrer qu'une majorité de développeurs ont conscience de ce problème. Il faut le dire une fois pour toutes : les calculs en virgule flottante ne respectent pas les lois arithmétiques de base telles l'associativité, il convient d'en avoir conscience et de coder de façon à limiter la casse.

    Par exemple, la comparaison de deux valeurs en virgule flottante doit être faite avec prudence : il suffit de comparer la valeur absolue de la différence des deux valeurs à une précision donnée.

    cdlt

  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
    Ce problème d'imprécision est effectivement agaçant ... il m'a fait mettre sous le coude une appli destinée à la résolution d'équations polynomiales de degré N à coefficients complexes où la partie réelle et la partie dite imaginaire des coefficients étaient du type Extended ... mais pour capter le x pour lequel f(x) <= Epsilon lorsque le plus-petit-DeltaX fait passer f(x) de f(x) à f(x)+-kE+QQChose j'ai vite compris la douleur de l'imprécision. Bon cela marchait quand même à peu près correctement et rapidement jusqu'aux environs du degré 15.

    Pour essayer de faire mieux j'ai remplacé le type Extended par un type dérivé d'un array d'int64 utilisable pour calculer avec des nombres entiers astronomiques et après avoir galéré pour placer la virgule au bon endroit la précision commençait à être acceptable ... sauf que la lenteur d'execution commencait à devenir agaçante bien avant le degré 10.

    Comme le responsable de cette lenteur était la procédure qui transforme une chaine de caractères numériques vers les cases de l'array d'int64 ... j'ai recommencé les essais et au lieu de transformer les chaines de cette façon j'ai calculé directement sur ces chaines dans le style "9+3 = je pose 2 dans la chaine-résultat et je retiens 1" ... et après avoir ainsi reprogrammé toutes les fonctions de calcul élémentaire j'ai pu constater que la vitesse d'execution était juste un peu moins agaçante tout en ayant écrêté les chaines à une soixantaine de chiffres après la virgule. Depuis j'ai confié à mon subconscient le soin de trouver une parade ... à moins qu'il ne faille choisir entre rapide-et-imprécis et lent-et-précis.

Discussions similaires

  1. une manipulation de Form que je ne sais pas faire
    Par JeanNoel53 dans le forum C++Builder
    Réponses: 6
    Dernier message: 07/02/2011, 14h19
  2. JS ne sais plus faire une addition
    Par kernelfailure dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 23/06/2009, 01h31
  3. Amélioré une dll, je sais pas faire.
    Par Veler dans le forum C#
    Réponses: 3
    Dernier message: 05/10/2007, 17h47
  4. Réponses: 1
    Dernier message: 19/02/2006, 19h52
  5. Faire une addition en asp
    Par PrinceMaster77 dans le forum ASP
    Réponses: 9
    Dernier message: 29/11/2004, 15h25

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