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 :

Cacul impossible, Delphi limité


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Cacul impossible, Delphi limité
    Bonjour,

    Je souhaite faire faire un calcul à Delphi et je m'étonne de ses limites !

    Je suppose que c'est moi qui doit mal m'y prendre car sinon, cela voudrait dire que Delphi ne peut gérer les calculs évolué (style scientifiques).

    Mon problème est le suivant:

    J'ai une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultReal: real (donc, elle doit contenir de 5.0 x 10^-324 .. 1.7 x 10^308)
    Je pose le calcul suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     resultReal := 180 * 12103014 ;
    et j'obtiens l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Débordement dans opération de conversion ou arithmétique !
    Alors que 180 * 12103014 est bien compris entre 5.0 x 10^-324 .. 1.7 x 10^308.

    Je ne comprends pas pourquoi...

    Quelqu'un sait-il d'où mon erreur vient ? Et comment faire en sorte que Delphi prenne bien en compte le "vrai" intervalle de Real ? Car j'ai du mal à croire que Delphi soit limité par ce "petit" calcul...

    Par avance, merci.

    PS: j'ai aussi essayé avec le type Extended mais j'obtiens le même résultat

    Julien.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    amusant ! testé en D5 Pro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      a,b,c: Real;
    begin
      a:=180;
      b:=12103014;
      c:=a*b;  // sans pb
      c:=180*12103014;  // overflow
    voci au moins comment s'en sortir !!
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Le problème est que si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    resultReal: real;
    ...
    resultReal := 180 * 12103014 ;
    Les 2 valeurs que tu multiplies étant des entiers, avant de mettre la valeur dans resultReal, le compilateur fait le calcul 180 * 12103014 dans un entier, or ce calcul dépasse la valeur possible pour un entier (2^31 -1)
    la solution est de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    resultReal := 180;
    resultReal := resultReal * 12103014 ;
    Ou bien, puisque tu connaît la valeur à mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultReal := 2178542520; // = 180 * 12103014 ;

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultReal := 180.0 * 12103014 ;

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2002
    Messages : 223
    Par défaut
    Oui, c'est seulement un problème de typage.
    Comme l'écris Graffito, écrire 180.0 désigne un double, 180 seul désigne un entier.

    Le mieux c'est de tout typer, au moins, tu ne laisses pas d'interprétation implicite au pré-processeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultReal := 180.0 * 12103014.0

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 123
    Par défaut
    C'est un "hic" que Borland doit resoudre dans les prochaines versions, non? S'il faut necessairement savoir ce qui se passe en interne avant de faire une telle operation, c'est pas pour demain, la programmation ouverte au "grand public"...

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

Discussions similaires

  1. Connexion au réseau impossible ou limitée
    Par valarko dans le forum Windows 8
    Réponses: 13
    Dernier message: 05/02/2015, 13h32
  2. Impossible de limiter friend à une fonction
    Par NicolasJolet dans le forum C++
    Réponses: 15
    Dernier message: 03/08/2006, 15h42
  3. Réponses: 4
    Dernier message: 19/09/2005, 16h54
  4. Installation du BDE Delphi impossible
    Par KERISIT dans le forum Bases de données
    Réponses: 1
    Dernier message: 17/01/2005, 21h16
  5. Réponses: 2
    Dernier message: 28/10/2003, 10h55

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