Spec-Zone.ru › Ada 95
Справочник Ada 95

G.2.3 Модель фиксированной арифметики

В строгом режиме предопределенные арифметические операции типа с фиксированной точкой должны удовлетворять требованиям точности, указанным здесь, и должны избегать или сигнализировать о переполнении в описанных ситуациях.

Требования к реализации

Требования к точности для предопределенных операций арифметики с фиксированной точкой и преобразований, а также результатов отношений над операндами с фиксированной точкой, приведены ниже.
Операторы сложения с фиксированной точкой, абсолютное значение и сравнения имеют операнды одного типа. Эти операции должны давать точный результат, если только не происходит переполнение.
Разрешены умножения и деления между операндами любых двух типов с фиксированной точкой; результат должен быть (явным или неявным) преобразован в какой-либо другой числовой тип. Для целей определения правил точности умножение или деление и преобразование рассматриваются как одна операция, точность которой зависит от трех типов (операндов и результата). Для десятичных типов с фиксированной точкой атрибут T'Round может использоваться для явного преобразования с округлением (см. 3.5.10).
Когда тип результата — тип с плавающей точкой, точность задается в G.2.1. Для некоторых комбинаций типов операндов и результата в оставшихся случаях результат должен принадлежать небольшому набору значений, называемому идеальным набором результатов; для других комбинаций требуется лишь принадлежность к более широкому, определяемому реализацией набору значений, называемому близким набором результатов. Когда тип результата — десятичный тип с фиксированной точкой, идеальный набор результатов содержит единственное значение; таким образом, операции над десятичными типами всегда полностью определены.
Когда один операнд умножения или деления фиксированной-фиксированной точкой имеет тип universal_real, этот операнд не преобразуется неявным образом в обычном смысле, так как контекст не определяет уникальный целевой тип, но точность результата умножения или деления (т. е., должен ли результат принадлежать идеальному набору результатов или просто близкому набору результатов) зависит от значения операнда типа universal_real и типов другого операнда и результата.
Для умножения или деления с фиксированной точкой, математический результат которого (точный) v, и для преобразования значения v в тип с фиксированной точкой, идеальный набор результатов и близкий набор результатов определяются следующим образом:
  • Если тип результата — обычный тип с фиксированной точкой со small s,
  • если v является целым кратным s, то идеальный набор результатов содержит только значение v;
  • в противном случае, он содержит целое кратное s, непосредственно меньшее v, и целое кратное s, непосредственно большее v.
    Близкий набор результатов — определяемый реализацией набор последовательных целых кратных s, содержащий идеальный набор результатов в качестве подмножества.
  • Если тип результата — десятичный тип со small s,
  • если v является целым кратным s, то идеальный набор результатов содержит только значение v;
  • в противном случае, если применяется усечение, он содержит только целое кратное s в направлении к нулю, а если применяется округление, то он содержит только ближайшее целое кратное s (в случае равенства, округление производится от нуля).
    Близкий набор результатов — определяемый реализацией набор последовательных целых кратных s, содержащий идеальный набор результатов в качестве подмножества.
  • Если тип результата — целочисленный тип,
  • если v — целое число, то идеальный набор результатов содержит только значение v;
  • в противном случае, он содержит ближайшее целое число к значению v (если v равноудалено от двух последовательных целых чисел, идеальный набор результатов содержит то, которое дальше от нуля).
    Близкий набор результатов — определяемый реализацией набор последовательных целых чисел, содержащий идеальный набор результатов в качестве подмножества.
Результат умножения или деления с фиксированной точкой должен принадлежать либо идеальному набору результатов, либо близкому набору результатов, как описано ниже, если переполнение не происходит. В следующих случаях, если тип результата — тип с фиксированной точкой, пусть s будет его small; в противном случае, т. е. когда тип результата — целочисленный тип, пусть s будет 1.0.
  • Для умножения или деления, ни один из операндов которых не является типа universal_real, пусть l и r будут smalls левого и правого операндов. Для умножения, если (l · r) / s — целое число или обратное целое число (в этом случае smalls называются «совместимыми»), результат должен принадлежать идеальному набору результатов; в противном случае, он принадлежит близкому набору результатов. Для деления, если l / (r · s) — целое число или обратное целое число (т. е., smalls совместимы), результат должен принадлежать идеальному набору результатов; в противном случае, он принадлежит близкому набору результатов.
  • Для умножения или деления с одним операндом universal_real со значением v, обратите внимание, что всегда возможно разложить v как целое кратное «совместимого» small, но целое кратное может быть «слишком большим». Если существует разложение, в котором это кратное меньше некоторого определяемого реализацией предела, результат должен принадлежать идеальному набору результатов; в противном случае, он принадлежит близкому набору результатов.
Разрешены также умножение P * Q операнда типа с фиксированной точкой F на операнд целочисленного типа I или наоборот, и деление P / Q операнда типа с фиксированной точкой F на операнд целочисленного типа I. В этих случаях тип результата — F; явное преобразование результата никогда не требуется. Требуемая точность в этих случаях такая же, как и для умножения F(P * Q) или деления F(P / Q), полученных путем интерпретации операнда целочисленного типа как имеющего тип с фиксированной точкой со small 1.0.
Точность результата преобразования из целочисленного или типа с фиксированной точкой в тип с фиксированной точкой, или из типа с фиксированной точкой в целочисленный тип, такая же, как и для умножения с фиксированной точкой исходного значения на операнд с фиксированной точкой, имеющий small 1.0 и значение 1.0, как указано в вышеуказанных правилах. Результат преобразования из типа с плавающей точкой в тип с фиксированной точкой должен принадлежать близкому набору результатов. Результат преобразования операнда universal_real в тип с фиксированной точкой должен принадлежать идеальному набору результатов.
Возможность переполнения в результате предопределенной арифметической операции или преобразования, дающего результат типа с фиксированной точкой T, аналогична таковой для типов с плавающей точкой, за исключением того, что она связана с базовым диапазоном, а не безопасным диапазоном. Если все разрешенные результаты принадлежат базовому диапазону T, то реализация должна предоставить один из разрешенных результатов; в противном случае,
  • если T'Machine_Overflows истинно, реализация должна либо предоставить один из разрешенных результатов, либо вызвать Constraint_Error;
  • если T'Machine_Overflows ложно, результат определяется реализацией.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API