【问题标题】:Limits of Ada Fixed Point TypeAda 定点类型的限制
【发布时间】:2013-03-12 04:38:32
【问题描述】:

阅读本文http://en.wikibooks.org/wiki/Ada_Programming/Types/delta 让我想知道delta 的极限值是多少。

例如

delta 127 range 0..1_000_000;

需要一个字节来保存增量值。

但是

delta 0.0000000001 range 0..1;

需要更多字节,对吧?

那么 delta 有限制吗?当然我们不能无限地进行更小的增量吗?

在上面的链接中它说

如果编译器接受您的定点类型定义,它保证由该类型表示的值将至少具有指定的准确度(或更好)。如果编译器不支持类型定义(例如由于硬件限制),则会导致编译时错误。

【问题讨论】:

    标签: precision ada fixed-point delta


    【解决方案1】:

    编译后的代码在任何地方都没有 Delta 值;类型的存储值被缩放,因此所需的大小对应于除以 Small 的范围(请记住,如果 Delta 不是 2 的幂,则需要指定 Small 与 @ 相同987654326@).

    事实证明,对于 GNAT,支持的最小值为 Delta,对于以下类型的对象,最大值为 Size:在 Mac OS X (Intel) 上,

    Small_Delta : constant := 2.0 ** (-127);
    Small_Bound : constant := 2.0 ** (-64);
    type T1 is delta Small_Delta range -Small_Bound .. Small_Bound;
    

    失败

    "T1'Small" too small, minimum allowed is 2.0**(-80)
    

    Larger_Delta : constant := 2.0 ** (-64);
    Larger_Bound : constant := 2.0;
    type T2 is delta Larger_Delta range -Larger_Bound .. Larger_Bound;
    

    失败

    size required (67) for type "T2" too large, maximum allowed is 64
    

    (我不确定为什么是 67,而不是 65!)

    【讨论】:

    • 那么这是否意味着使用 GNAT 时最小可能的增量是 2**(-80)?
    • 是(如果 Delta 是 2 的幂,Small 等于它;如果不是,它是 2 的下一个幂)。见the LRM
    • 为什么是 67? 64 位将覆盖 0 .. 1 范围,65 位覆盖 0 到 2 范围,66 位覆盖 -2 到 2 范围……现在放大到上端,你会看到它停在 2.0 - delta 处,相同way integer'last = 2^31 - 1... 第 67 位是给你最后一个增量所必需的!
    • @Brian,哦。在以前的版本中,我将 Larger_Delta (相当于)设置为 2.0 ** (-63)。如果我还将 Larger_Bound 设置为 1.0,则 GNAT 足够聪明,可以计算出我真正的意思是上限是 Larger_Bound - Larger_Delta。我认为 3.5.9(13..15) 允许这样做。
    • 实际上是 3.5.9(22..24)。我猜如果这种方法不成功,GNAT 会报告完整的位要求。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多