是否可以声明具有无限上限的 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 ;
我只想要这个数字的零正值...
你不能 -- 但由于 Speed
是 Float
类型,它的值无论如何不能超过 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;
这可能就是您想要的。
我想在 Ada 中声明一个记录类型的速度范围。以下方法不起作用,但有没有办法让它起作用?
--Speed in knots, range 0 to unlimited
Speed : float Range 0.0 .. unlimited ;
我只想要这个数字的零正值...
你不能 -- 但由于 Speed
是 Float
类型,它的值无论如何不能超过 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;
这可能就是您想要的。