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

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 равен True, реализация должна либо выдать один из разрешённых результатов, либо вызвать Constraint_Error;
  • если T'Machine_Overflows равен False, результат определяется реализацией.


Spec-Zone.ru

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