Ada:常量声明

3

我正在阅读Norman Cohen的Ada 95书籍,第129页有常量声明:

 Pi: constant Float := 3.1415926536

and

Pi: constant := 3.1415926536

第二个声明被解释为:“具有适当范围的任何浮点或定点类型”。我的问题是,如果使用Long_Float精度,例如要声明一个常量2 * PI,是否需要像这样明确声明:
Two_Pi : CONSTANT Long_Float := 2.0 * 3.1415926536

或者更好的方法是:
Two_Pi: CONSTANT Long_Float :=  2.0 * Ada.Numerics.Pi;

(第二个声明可以利用小数点后更多的数字)?
你想要吗?
Two_Pi : CONSTANT := 2.0 * 3.1415926536   

或者更好的是
Two_Pi: CONSTANT  :=  2.0 * Ada.Numerics.Pi;

能否像书中所说的那样优秀,这样Ada编译器会知道当我在Long_Float计算中使用Two_Pi时,编译器将提供所需的精度位数?由于Pi值3.1415926536不是Long_Float类型(因为其精度位数较少),我猜想最后一个声明即

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

如果我需要在Long_Float计算中使用Two_Pi,那么只需要这样做就可以了。我的理解正确吗?如果有类似的理解,那么...
Two_Pi: CONSTANT  :=  2.0 * Ada.Numerics.Pi;

这个概念同样适用于浮点数计算,在编译时只提供所需的位数精度。

非常感谢...

1个回答

3

数字声明,例如

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

有时称为“命名数字”。这样的数字在类中是通用的,“因为它可以在期望类中某些特定类型的地方被接受(参见8.6)”。
补充:由于这些数字是通用的,所以它们可以“与相应类中任何类型的原始子程序一起用作操作数”。例如,Two_Pi可以与FloatLong_Float或从universal_real派生的任何类型相乘。
相关说明,您可能会喜欢这个Ada binding 到GNU GMP和MPFR库。

附加说明:该绑定允许使用GNU库从Ada中调用,可参见此示例


谢谢。如果我理解正确的话,那么我不需要添加Long_Float。你给出的表达式足以让编译器知道要使用什么精度。 - yCalleecharan
我使用Adacore的GNAT GPL编译器。如果我理解正确,那么这个GNU GMP和MPFR数值库只适用于GCC。我是对的吗? - yCalleecharan
@yCalleecharan:分别是是和否;请参见上文。 - trashgod
@yCalleecharan:哎呀,我误解了第二个问题。我知道绑定可以在GNAT中使用,但它也应该适用于其他支持与GCC二进制文件链接的编译器。 - trashgod
谢谢。所以第一个是“是”,第二个是“是/否”:)。我将尝试检查这个绑定是否适用于Adacore的GNAT。 - yCalleecharan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接