2010-07-05 13 views
3

Je lis le livre Ada 95 de Norman Cohen et à la page 129, nous avons les déclarations constantes:Ada: déclaration constante

Pi: constant Float := 3.1415926536 

et

Pi: constant := 3.1415926536 

La deuxième déclaration est dit être interprétée comme , Je cite: "tout point flottant de type à virgule fixe avec la gamme appropriée". Ma question est-dire travaille avec une précision Long_Float, alors par exemple de déclarer leur mot à dire constante 2 * PI faire on doit déclarer spécifiquement comme

Two_Pi : CONSTANT Long_Float := 2.0 * 3.1415926536 

ou bien mieux encore:

Two_Pi: CONSTANT Long_Float := 2.0 * Ada.Numerics.Pi; 

(la deuxième déclaration pour profiter de plus de chiffres après la virgule décimale)?

Would

Two_Pi : CONSTANT := 2.0 * 3.1415926536 

ou mieux encore

Two_Pi: CONSTANT := 2.0 * Ada.Numerics.Pi; 

être aussi bon que les revendications livre afin que le compilateur Ada ne saurait, par exemple, si j'utilise Two_Pi dans un calcul de Long_Float, puis le compilateur fournirait le nombre requis de chiffres de précision? Étant donné que la valeur Pi 3,1415926536 est pas de type Long_Float (car il a moins de chiffres de précision), je suppose que la dernière déclaration à savoir

Two_Pi: CONSTANT := 2.0 * Ada.Numerics.Pi; 

serait tout ce qui est nécessaire si je dois Two_Pi dans un calcul Long_Float. Est-ce que je comprends bien? Avec une compréhension similaire, puis

Two_Pi: CONSTANT := 2.0 * Ada.Numerics.Pi; 

serait également pertinent dans le calcul du flotteur et le compilateur ne fournir que le nombre requis de chiffres de précision.

Merci beaucoup ...

Répondre

2

Number Declarations tels que

Two_Pi : constant := 2.0 * Ada.Numerics.Pi; 

sont parfois appelés numéros nommés. Un tel nombre est universal "en ce sens qu'il est acceptable lorsqu'un type particulier de la classe est attendu (voir 8.6)."

Addendum: Parce que ces numéros sont universal, ils peuvent "être utilisés comme opérandes avec les sous-programmes primitifs de tout type dans la classe correspondante." Par exemple, Two_Pi peut être multiplié par Float, Long_Float ou n'importe quel type dérivé de universal_real. Sur une note connexe, vous pourriez aimer ce Ada binding aux bibliothèques GNU GMP et MPFR.

Addendum: La liaison permet d'utiliser les bibliothèques GNU de Ada, comme vu dans cette example.

+0

Merci. Si je comprends bien, je n'ai pas besoin d'ajouter le Long_Float.L'expression que vous avez donnée est suffisante pour que le compilateur sache quelle précision utiliser. – yCalleecharan

+0

J'utilise le compilateur GNAT GPL d'Adacore. Si je comprends bien alors ces bibliothèques numériques GNU GMP et MPFR sont pour GCC seulement. Ai-je raison? – yCalleecharan

+0

@yCalleecharan: Oui et non, respectivement; voir au dessus. – trashgod