【发布时间】:2014-03-03 23:44:31
【问题描述】:
在 Ada 中声明范围始终是包容性的。
如果我想要一个包含从0 到42 的所有整数的类型(或作为数学区间:[0, 42]),我将其声明如下:
type zero_to_42 is range 0 .. 42;
如果我想排除零(范围(0, 42]),这对于离散类型来说不是问题:
type not_zero_to_42 is range (zero_to_42'First + 1) .. zero_to_42'Last;
但我还是要手动做,没有zero_to_answer'NextAfterFirst
对于浮点类型,我不知道如何正确执行此操作。排除零很简单,但排除其他任何东西似乎都是我定义的实现。
type works is digits 6 range 0.0 .. 42.0
type also_works is new works range (0.0 + works'small) .. 42.0
type broken is new works range 0.0 .. (42.0 - works'small)
由于42.0 附近的浮点值的精度低于0.0 附近的浮点值,因此42.0 - works'small 被舍入为42.0
我当然可以手动找到一个有效的值(例如41.9999),但这对我来说似乎很难看,当我更改works 的位数时可能不再有效。
【问题讨论】:
-
我认为语言没有为浮点类型定义
'small;该属性用于定点。实现者可以定义自己的属性,尽管我不确定他们是否可以在语言未定义的地方定义语言定义的属性。在任何情况下,在浮点类型上使用'small似乎会给出实现定义的结果并且不可移植。 -
@ajb 正确关于“小但有浮点类型的分数属性”。还允许实现添加新的(非标准)属性,但它们必须记录在用户指南中。可以使用 pragma(不记得是哪一个)来禁止实现定义的属性。
-
@darkestkhan (1)
'Fraction在正数上总是返回 0.5 和 1 之间的结果,所以这里不适合。 (2) RM 4.1.4(12) 说新属性通常不能与语言定义的属性具有相同的标识符,因此除非在 Ada 83 中定义,否则实现不应定义自己的'small。 (3 )pragma Restrictions(No_Implementation_Attributes)就是你要找的东西。