Arrondi d'un point floattant

Arrondi d'un point floattant - Ada - Programmation

Marsh Posté le 23-01-2009 à 18:16:00    

Bonjour,
 
j'ai définit un type point fixe de la manière suivante :
 

Code :
  1. type T_Alphabet is delta 0.01 range 0.0..1.0;


Et j'utilise un un type point flottant définit comme suit :

Code :
  1. type Real is digits System.Max_Digits;


 
Je souhaite obtenir l'arrondi à 0.01 pré du type Real pour l'affecter au type T_Alphabet.
 
Exemple :  
var_real = 9.59600000000000E-2 => je veux affecter 0.1 à une variable de type T_Alphabet.
 
Comment faire ? Merci.

Reply

Marsh Posté le 23-01-2009 à 18:16:00   

Reply

Marsh Posté le 23-01-2009 à 18:39:18    


 
Il y a un attribut (de memoire: T_Alphabet'Round(var_real)).  Est-tu sur que tu ne voudrais pas
plutot

Code :
  1. type T_Alphabet is delta 0.01 digits 2;


pour avoir un type decimal?

Reply

Marsh Posté le 23-01-2009 à 19:29:49    

Un Programmeur a écrit :


 
Il y a un attribut (de memoire: T_Alphabet'Round(var_real)).  Est-tu sur que tu ne voudrais pas
plutot

Code :
  1. type T_Alphabet is delta 0.01 digits 2;


pour avoir un type decimal?


 
C'est possible ! Parce qu'en effet, l'attribut Round prend un préfixe de type décmal.
Je suis un peu dans la confusion avec ce genre de type.
 
J'ai testé une simple conversion : Var_Alphabet := T_Alphabet(Var_Real); ça donne pas mal.
Je vais voir ce que me dis le compilateur en déclarant mo type T_Alphabet comme tu le suggères.

Reply

Marsh Posté le 23-01-2009 à 19:59:36    


j'ai déclaré le type T_Alphabet is deltat 0.01 digits 2;  Et à l'utilisation de l'attribut Round Constraint_Error(Range check failed) est levée.
 
T'es sûr de ton coup ?

Reply

Marsh Posté le 23-01-2009 à 20:18:10    

Avec Var_Real = 9.999*E-01,  Je remarque qu'une simple conversion lève la même erreur.
 
 
 

Reply

Marsh Posté le 23-01-2009 à 20:22:06    


 
Ca fait 10 ans que je n'ai plus fait d'Ada.  Mais ceci a l'air de faire ce que tu veux.

Code :
  1. with Ada.Text_IO;
  2. procedure Rounding is
  3.    type Decimal is delta 0.01 digits 2;
  4.    package DIO is new Ada.Text_IO.Decimal_IO(Decimal);
  5.    X : Long_Float := 9.596E-2;
  6.    D : Decimal;
  7. begin
  8.    D := Decimal'Round(X);
  9.    DIO.Put(D);
  10.    Ada.Text_IO.New_Line;
  11. end;

Reply

Marsh Posté le 23-01-2009 à 20:45:06    

Un Programmeur a écrit :


 
Ca fait 10 ans que je n'ai plus fait d'Ada.  Mais ceci a l'air de faire ce que tu veux.

Code :
  1. with Ada.Text_IO;
  2. procedure Rounding is
  3.    type Decimal is delta 0.01 digits 2;
  4.    package DIO is new Ada.Text_IO.Decimal_IO(Decimal);
  5.    X : Long_Float := 9.596E-2;
  6.    D : Decimal;
  7. begin
  8.    D := Decimal'Round(X);
  9.    DIO.Put(D);
  10.    Ada.Text_IO.New_Line;
  11. end;



 
Oui, ton programme fonctionne. Mais avec une valeur de X telle que 9.999E-02, ça ne fonctionne plus.
 
 

Reply

Marsh Posté le 23-01-2009 à 20:48:26    

avec x = 9.999E-1
 
 
Pardon

Reply

Marsh Posté le 23-01-2009 à 21:46:30    

Merci Un Programmeur !
 
j'ai pigé pourquoi 9.999E-1 lève un erreur de contrainte.

Reply

Marsh Posté le 24-01-2009 à 10:16:30    

Pour les archives: 0.999E-1 est arrondi à 1.00 et le type décimal delta 0.01 digits 2 ne représente des valeurs que jusqu'à 0.99.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed