是否可以声明具有无限上限的 Ada 范围?

Is it possible to declare Ada range with unlimited upper bound?

我想在 Ada 中声明一个记录类型的速度范围。以下方法不起作用,但有没有办法让它起作用?

   --Speed in knots, range 0 to unlimited
   Speed : float Range 0.0 .. unlimited ;

我只想要这个数字的零正值...

你不能 -- 但由于 SpeedFloat 类型,它的值无论如何不能超过 Float'Last

Speed : Float range 0.0 .. Float'Last;

(您可能想要声明一个显式类型或子类型。)

为了完整起见,您还可以定义自己的基本浮点类型,而不是使用称为 Float 的类型,它可能有也可能没有您需要的范围。

例如,Float 在编译器或 RTS(运行时系统)源中的某处定义,可能是 type Float is digits 7;type Long_Float is digits 15;,分别为您提供 7 位和 15 位精度。

您可以同样定义您的,以满足您的应用程序所需的精度和范围。其理念是,陈述您的需求(在范围和精度方面),并让编译器最有效地满足它。这是在问题域中编程,说明你想要什么——而不是在解决方案域中,将你的程序绑定到特定机器或编译器支持的内容。

编译器要么使用下一个最高精度的本机浮点数(通常是 IEEE 32 位或 64 位浮点数),要么抱怨它不能这样做

(例如,如果您声明

type Extra_Long_Float is digits 33 range 0.0 .. Long_Float'Last * Long_Float'Last;
如果您的编译器不支持 128 位浮点数,它可能会报错。

无限是不可能的。这将需要无限的内存。我不知道有任何平台有这个。可以编写一个包来提供尽可能大的可用内存可以处理的有理数(例如,请参见 PragmAda Reusable Components 中的 PragmARC.Rational_Numbers),但这可能不是您感兴趣的。您可以使用编译器支持的最大精度声明您自己的类型:

type Speed_Value_Base is digits System.Max_Digits;
subtype Speed_Value is Speed_Value_Base range 0.0 .. Speed_Value_Base'Last;
Speed : Speed_Value;

这可能就是您想要的。