我希望此类型仅包含值为(x > 0) && (x <= 10.0)
为真的值
我用这种方式声明了我的类型larger_than_zero
:
type a_float is digits 6 range - 1.0E38 .. 1.0E38;
type larger_than_zero is new a_float range a_float'Adjacent(0.0, 1.0) .. 10.0;
现在无法将0.0
分配给larger_than_zero
类型的变量。
'Adjacent(A, B)
从非A
的{{1}}开始接收下一个可能的机器值,并指向A
的方向
我的问题是,这是否会导致一些通常不会出现类型的怪异行为。
也许B
甚至不是larger_than_zero'First
模型的一部分?
任何关于该主题的详细信息的指针都将被指定。
答案 0 :(得分:3)
不应该导致任何问题。从技术上讲,range
上的type
声明对类型完全没有任何影响;它只影响第一个子类型。您的type larger_than_zero
声明定义了类型和第一个子类型。该类型包括浮点格式中可表示的每个浮点数,包括负数,零和大于10.0的数字。 第一个子类型是该类型的子范围,仅包含您在范围中指定的数字。使用类型执行计算,并且中间结果可能超出范围。子类型仅与约束检查相关;在分配larger_than_zero
变量或传递larger_than_zero
参数时,将检查该值以确保其在范围内,否则将引发Constraint_Error
。由于这是该范围的唯一用途,因此不应引起任何奇怪的行为。
需要注意的一点是a_float'Adjacent(0.0, 1.0)
在不同的实现中可能不会返回相同的内容,即使在两种情况下都使用IEEE浮点数,因为某些实现可能不支持非规范化数字。它应该是相同的,只要a_float'Denorm
返回相同的值(见A.5.3(10))。当然,如果其中一个实现是在不使用IEEE浮点数的计算机上,例如VAX,则'Adajcent
的值可能不同。当然,z_float'Adjacent(0.0, 1.0)
,其中z_float
是IEEE 64位浮点数,与a_float
版本不同,假设a_float
是32位浮点数。< / p>