在声明浮动范围(0,10.0)时,我需要注意什么?

时间:2014-02-28 13:52:12

标签: floating-point ada floating-accuracy

我希望此类型仅包含值为(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模型的一部分? 任何关于该主题的详细信息的指针都将被指定。

1 个答案:

答案 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>