Turbo Pascal : Fonction arrondi plante après 32000 ?
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Turbo Pascal : Fonction arrondi plante après 32000 ?



  1. #1
    invite364f36a1

    Turbo Pascal : Fonction arrondi plante après 32000 ?


    ------

    Bonjour à tous.

    Je suis en train de faire un petit programme dan lequel j'ai besoin que toutes les valeur soient arrondies à l'entier supérieur.
    Donc j'ai fait ça :

    Code:
    function MyRound( Value: real): integer;
    
    var 
    	result : integer;
    	b : real;
    
    begin
    
    		if ( (value - int(value) ) < 0.5 ) then
    			begin
    
    				b := value + 0.5;
    				result := round(b);
    				MyRound := result;
    			end
    		else 
    			begin
    				result := round(value);
    				MyRound := result;
    			end;
    end;
    L'affaire se passe très bien jusqu'à à peu près 32000 après quoi la fonction me renvoi des valeurs aberrantes (négatives entre autre).

    Je vois pas pourquoi ça ne marche que pour certaines valeurs et pas d'autres, si quelqu'un voit on est le bug ce serai gentil de s'aiguiller.

    Merci d'avance

    ++

    -----

  2. #2
    invitee840409b

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Bonjour,

    Personnellement, j'aurais codé la fonction comme ceci:
    Code:
    function MyRound( Value: real): integer;
    
    var 
    	result : integer;
    
    begin
    
    		if ( (value - int(value) ) < 0.5 ) then
    			begin
    				result := round(value)+1;
    				MyRound := result;
    			end
    		else 
    			begin
    				result := round(value);
    				MyRound := result;
    			end;
    end;
    Cordialement,
    ProgVal

  3. #3
    JPL
    Responsable des forums

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Excuse mon ignorance en programmation mais manifestement tu as une valeur entière codée sur 16 bits signés. Donc le butoir est 32768. Au delà tu auras en effet des résultats négatifs.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  4. #4
    invite2d7144a7

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Bonjour,

    Au lieu d'utiliser Turbo Pascal, compilateur et environnement de développement qui fut incontournable, mais est depuis longtemps un dinosaure (programme en 16 bits uniquement !!), utilise un système plus récent, genre FreePascal.

    La remarque de JPL est exacte, et un compilateur plus récent t'évitera ce genre de problème ... tant que tu ne dépasseras pas leur propre capacité.

    D'autre part, les fonctions proposées sont fausses ?

    Si, si, regardez ce qui se passe si la partie décimale du nombre à traiter est nulle :

    si Value = 2.0 :
    (value - int(value) ) vaut 0
    donc < 0.5,
    et on ajoute 1 à la valeur, ce qui n'est sans doute pas désiré ?

    Sinon, il existe la fonction trunc, qui évitera de faire ce test < 0.5.

    Et attention aux valeurs négatives si elles sont possibles !!

  5. A voir en vidéo sur Futura
  6. #5
    JPL
    Responsable des forums

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Citation Envoyé par JPL Voir le message
    Donc le butoir est 32768.
    Je corrige une erreur de débutant : 32768 valeurs cela donne un maximum de 32767 (à cause du 0)
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  7. #6
    invite2d7144a7

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Bonjour,
    Citation Envoyé par JPL Voir le message
    Je corrige une erreur de débutant : 32768 valeurs cela donne un maximum de 32767 (à cause du 0)
    Plutôt une erreur d'inattention. Et le propos restait compréhensible, donc pas de problème.

  8. #7
    invitee840409b

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    C'est inadmissible une erreur pareil! En plus, à ce niveau, on a besoin de beaucoup de précision !

  9. #8
    invite364f36a1

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Merci pour ces réponses.

    J'ai édité le code pour avoir des résultats corrects avec des valeurs de type 2.0. Ça donne ça:
    Code:
    function MyRound( Value: real): integer;
    
    var 
    	result : integer;
    
    begin
    
    		if ( (value - trunc(value) ) = 0 ) then
    			begin
    				result := trunc(value) ;
    				MyRound := result;
    			end
    		else if ( (value - trunc(value) ) < 0.5 ) then
    			begin
    				result := round(value)+1;
    				MyRound := result;
    			end
    		else 
    			begin
    				result := round(value);
    				MyRound := result;
    			end;
    end;
    Par contre le résultat est le même pour les valeurs supérieur à 32 767

    Pour freePascal, je veux bien mais ça ne règle pas le problème. Une fois compiler avec freepascal, l'erreur d'arrondi reste entière

    Excuser l'amateur que je suis mais comment avoir des arrondis à l'unité supérieur pour des nombres plus grands que cette limite ?

    Merci pour le coup de main.

  10. #9
    invite770d9cfe

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Pourquoi avoir utilisé le type Int (entier) qui est codé sur 2 octets (de -32.768 à + 32.767) alors que les entiers longs (Longint) sont codés sur 4 octets (de -2.147.483.648 à 2.147.483.647). C'est tout de même plus confortable, même si la plage est limitée. De toute manière elle sera toujours limitée, même en 64 bits.

  11. #10
    invite2d7144a7

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Bonjour,

    Comme je l'avais précisé, il existe la fonction trunc, qui simplifie la fonction :
    Code:
    function MyRound( Value: real): integer;
    
    var 
    	result : integer;
    
    begin
      result := trunc(value);
    
      if ( (value - trunc(value) ) <> 0 ) then Inc(result);
      
      MyRound := result;
    end;

  12. #11
    invite364f36a1

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Excellente remarque, surement le manque de pratique qui m'a fait choisir le type integer

    Problème résolu en passant tout ça en longint.

    Cela dit le passage sous freepascal m'a permis de voir qu'il rend un exécutable plutôt qu'un fichier.PAS, ce qui est bien plus pratique pour donner le programme.

    Un grand merci à vous.

    ++

    EDIT pour whoami :
    effectivement elle est plus simple de cette façon, j'en prend bonne note, merci

  13. #12
    invite2d7144a7

    Re : Turbo Pascal : Fonction arrondi plante après 32000 ?

    Bonjour,
    Citation Envoyé par djamoussa Voir le message
    EDIT pour whoami :
    effectivement elle est plus simple de cette façon, j'en prend bonne note, merci
    D'ailleurs, il faut éviter le double emploi de la fonction trunc, ça devient :
    Code:
    function MyRound( Value: real): integer;
    
    var 
    	result : integer;
    
    begin
      result := trunc(value);
    
      if (value - result <> 0 ) then Inc(result);
      
      MyRound := result;
    end;

Discussions similaires

  1. plante c3 et plante C4 en géochimie
    Par invitea2475195 dans le forum Géologie et Catastrophes naturelles
    Réponses: 3
    Dernier message: 24/05/2009, 21h28
  2. L'ananas :fonction de la forme de la plante Ananas et l'ananas.
    Par inviteb52e46db dans le forum Biologie
    Réponses: 2
    Dernier message: 19/11/2005, 19h31
  3. Chimie après MPSI - après MP ? - et après PSI ?
    Par inviteaeeb6d8b dans le forum Orientation après le BAC
    Réponses: 8
    Dernier message: 20/08/2005, 13h35
  4. Arrondi ou pas arrondi ?
    Par invite37a56d45 dans le forum Physique
    Réponses: 9
    Dernier message: 05/12/2004, 14h59
  5. Cône arrondi dans le plan
    Par invite96a93ba8 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 18/10/2003, 22h21
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...