Справочное руководство Ada 95
G.2.4 Требования к точности для элементарных функций
В строгом режиме производительность Numerics.Generic_Elementary_Functions должна соответствовать указанной здесь спецификации.
Требования к реализации
Если исключение не генерируется, результат вычисления функции в экземпляре EF Numerics.Generic_Elementary_Functions принадлежит интервалу результатов, определенному как наименьший модельный интервал типа EF.Float_Type, содержащий все значения вида f · (1.0 + d), где f — точное значение соответствующей математической функции при заданных значениях параметров, d — вещественное число, и |d| меньше или равно максимальной относительной ошибке функции. Функция возвращает значение, принадлежащее интервалу результатов, когда обе его границы лежат в безопасном диапазоне типа EF.Float_Type; в противном случае,
- если EF.Float_Type'Machine_Overflows равно True, функция либо возвращает значение, принадлежащее интервалу результатов, либо генерирует исключение Constraint_Error, сигнализируя о переполнении;
- если EF.Float_Type'Machine_Overflows равно False, результат определяется реализацией.
Максимальная относительная ошибка, демонстрируемая каждой функцией, указана ниже:
- 2.0 · EF.Float_Type'Model_Epsilon для функций Sqrt, Sin и Cos;
- 4.0 · EF.Float_Type'Model_Epsilon для функций Log, Exp, Tan, Cot и обратных тригонометрических функций; и
- 8.0 · EF.Float_Type'Model_Epsilon для прямых и обратных гиперболических функций.
Максимальная относительная ошибка, демонстрируемая оператором возведения в степень, зависящая от значений операндов, составляет (4.0 + |Right · log(Left)| / 32.0) · EF.Float_Type'Model_Epsilon.
Указанная выше максимальная относительная ошибка применима ко всему домену прямых тригонометрических функций, когда параметр Cycle указан. Когда параметр Cycle опущен, максимальная относительная ошибка применима только тогда, когда абсолютное значение параметра угла X меньше или равно некоторому определённому реализацией пороговому значению угла, которое должно быть не меньше EF.Float_Type'Machine_Radix Floor(EF.Float_Type'Machine_Mantissa/2). За пределами порогового значения угла точность прямых тригонометрических функций определяется реализацией.
Предписанные результаты, указанные в A.5.1 для определённых функций при определённых значениях параметров, имеют приоритет над границами максимальной относительной ошибки; фактически, они сужают интервал результатов, разрешённый границами максимальной относительной ошибки, до единственного значения. Дополнительные правила с аналогичным эффектом приведены в таблице ниже для обратных тригонометрических функций при определённых значениях параметров, для которых математический результат, возможно, не является модельным числом типа EF.Float_Type (или, действительно, даже трансцендентным). В каждой записи таблицы значения параметров таковы, что результат лежит на оси между двумя квадрантами; соответствующее правило точности, которое имеет приоритет над границами максимальной относительной ошибки, заключается в том, что интервал результатов представляет собой модель интервал типа EF.Float_Type, связанный с точным математическим результатом, указанным в таблице.
Этот абзац был удалён.
Последняя строка таблицы предназначена для применения, когда EF.Float_Type'Signed_Zeros равно False; две строки, расположенные непосредственно над ней, когда EF.Float_Type'Signed_Zeros равно True, а параметр Y имеет нулевое значение с указанным знаком.
Величина, на которую результат обратной тригонометрической функции допускается превышать квадрант, прилежащий к квадранту, соответствующему главному ответвлению, как указано в A.5.1, ограничена. Правило заключается в том, что результат принадлежит наименьшему модельному интервалу типа EF.Float_Type, содержащему обе границы квадранта, соответствующего главному ответвлению. Это правило также имеет приоритет над границами максимальной относительной ошибки, эффективно сужая интервал результатов, разрешённый ими.
| Функция | Значение X | Значение Y | Точный результат при указанном Cycle |
Точный результат при отсутствии Cycle |
|---|---|---|---|---|
| Arcsin | 1.0 | n.a. | Cycle/4.0 | PI/2.0 |
| Arcsin | -1.0 | n.a. | -Cycle/4.0 | -PI/2.0 |
| Arccos | 0.0 | n.a. | Cycle/4.0 | PI/2.0 |
| Arccos | -1.0 | n.a. | Cycle/2.0 | PI |
| Arctan и Arccot | 0.0 | положительное | Cycle/4.0 | PI/2.0 |
| Arctan и Arccot | 0.0 | отрицательное | -Cycle/4.0 | -PI/2.0 |
| Arctan и Arccot | отрицательное | +0.0 | Cycle/2.0 | PI |
| Arctan и Arccot | отрицательное | -0.0 | -Cycle/2.0 | -PI |
| Arctan и Arccot | отрицательное | 0.0 | Cycle/2.0 | PI |
Наконец, следующие спецификации также имеют приоритет над границами максимальной относительной ошибки:
- Абсолютное значение результата функций Sin, Cos и Tanh никогда не превышает единицы.
- Абсолютное значение результата функции Coth никогда не меньше единицы.
- Результат функции Cosh никогда не меньше единицы.
Рекомендации по реализации
Версии прямых тригонометрических функций без параметра Cycle не следует реализовывать, вызывая соответствующую версию с параметром Cycle равным 2.0*Numerics.Pi, так как это не обеспечит требуемую точность в некоторых частях домена. По той же причине версию Log без параметра Base не следует реализовывать, вызывая соответствующую версию с параметром Base равным Numerics.e.