Ограничения типа фиксированной точки Ады

Читая это http://en.wikibooks.org/wiki/Ada_Programming/Types/delta заставил меня задуматься, каково предельное значение delta.

Например

delta 127 range 0..1_000_000;

требуется один байт для хранения дельта-значения.

Но

delta 0.0000000001 range 0..1;

потребуется больше байтов, верно?

Так есть ли предел дельта? Конечно, мы не можем бесконечно продолжать меньшие приращения?

В приведенной выше ссылке написано

Если компилятор принимает ваше определение типа с фиксированной точкой, он гарантирует, что значения, представленные этим типом, будут иметь по крайней мере указанную степень точности (или лучше). Если компилятор не может поддерживать определение типа (например, из-за ограниченного оборудования), возникает ошибка времени компиляции.


person Community    schedule 12.03.2013    source источник


Ответы (1)


Скомпилированный код нигде не содержит значение Delta; сохраненные значения типа масштабируются, поэтому требуемый размер соответствует диапазону, деленному на Small (помните, что если Delta не является степенью двойки, вам нужно указать Small, чтобы он был таким же, как Delta).

Для 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!)

person Simon Wright    schedule 12.03.2013
comment
Значит ли это, что с GNAT наименьшее возможное приращение равно 2**(-80)? - person ; 12.03.2013
comment
Да (если Delta является степенью числа 2, то Small равно ему; если нет, то это следующая меньшая степень числа 2). См. LRM. - person Simon Wright; 12.03.2013
comment
Почему 67? 64 бита будут охватывать диапазон 0 .. 1, 65 бит диапазон от 0 до 2, 66 бит диапазон от -2 до 2 ... теперь увеличьте масштаб в верхнем конце, и вы увидите, что он останавливается на 2,0 - дельта, то же самое way integer'last = 2^31 - 1... 67-й бит необходим, чтобы дать вам эту последнюю дельту! - person user_1818839; 12.03.2013
comment
@ Брайан, оу. В предыдущей версии я установил (эквивалент) Larger_Delta на 2,0 ** (-63). Если я также установлю Larger_Bound на 1.0, GNAT будет достаточно умен, чтобы понять, что я действительно имею в виду, что верхняя граница будет Larger_Bound — Larger_Delta. Я думаю, что 3.5.9(13..15) дают на это разрешение. - person Simon Wright; 13.03.2013
comment
На самом деле 3.5.9(22..24). Я предполагаю, что если этот подход не увенчается успехом, GNAT сообщит о полном требовании к битам. - person Simon Wright; 13.03.2013