#pragma STDC FENV_ACCESS ON
Поддержка остается включенной до тех пор, пока программа не достигнет конца блока, содержащего прагму, либо, если прагма является внешней, то до конца файла или единицы трансляции. Для отключения поддержки применяется такая директива:
#pragma STDC FENV_ACCESS OFF
Можно также записать следующую прагму:
#pragma STDC FENV_ACCESS DEFAULT
Это восстановит стандартное состояние компилятора, которое зависит от реализации.
908 Приложение Б
Данное средство важно для тех разработчиков, которые имеют дело с критически важными вычислениями с плавающей запятой, но представляет ограниченный интерес для большинства пользователей, поэтому здесь мы не будем вдаваться в особые детали.
прагма stdc fp_contract
Некоторые процессоры с плавающей запятой могут объединять выражения с плавающей запятой, содержащие множество операций, в единую операцию. Например, процессор может быть в состоянии выполнить оценку следующего выражения за один шаг:
х*у - Z
Это увеличивает скорость вычислений, но может привести к снижению их предсказуемости. Прагма STDC FP CONTRACT позволяет включать и отключать данное средство. Стандартное состояние зависит от реализации.
Чтобы отключить это средство сжатия для определенного вычисления, а затем включить его снова, можно поступить так:
#pragma STDC FP_CONTRACT OFF
val = x * у - z;
#pragma STDC FP_CONTRACT ON
дополнения библиотеки math.h
В математической библиотеке С90 функции по большей части объявлены с аргументами double и типом возвращаемого значения double:
double sin(double);
double sqrt(double);
Библиотеки C99 и СП предоставляют версии float и long double для всех этих функций. Имена такие функций содержат суффиксы f и 1:
float sinf(float); /* версия float функции sin() */
long double sinlllong double); /* версия long double функции sin() */
Наличие семейств функций с разными уровнями точности позволяет выбирать наиболее эффективную комбинацию типов и функций, необходимую для достижения конкретной цели.
В С99 также добавлено несколько функций, часто используемых в научных, инженерных и математических вычислениях. Такие дополнения С99 продемонстрированы в табл. B.V.16, где перечислены версии double всех математических функций. Во многих случаях эти функции возвращают значения, которые могут быть вычислены существующими функциями, однако новые функции делают это быстрее или с большей точностью. Например, loglp(x) представляет то же значение, что и log (1 +х),но в loglp(x) применяется другой алгоритм, который обеспечивает более точный результат при малых значениях х. Поэтому вы должны использовать функцию log() для вычислений в большинстве случаев, a loglp (х) — в случаях с малыми значениями х, когда важна высокая точность.
В дополнение к этим функциям в математической библиотеке определено несколько констант и функций, связанных с классификацией чисел и их округлением. Например, значение может быть классифицировано как бесконечное, не число (NaN), нормальное, субнормальное и истинный ноль. (NaN — это специальное значение, указывающее на то, что значение не является числом; например, asin (2.0) возвращает NaN,
Справочные материалы 909
т.к. asin() может принимать аргументы от -1 до 1. Субнормальным называется такое число, абсолютная величина которого меньше минимально допустимого значения, которое можно представить с максимальной точностью.) Существуют также специализированные функции сравнения, которые ведут себя иначе, чем стандартные операции отношений, когда один или более аргументов являются ненормальными значениями.
Схемы классификации С99 можно применять для обнаружения разного рода отклонений от нормы в вычислениях. Например, макрос isnormal() из math.h возвращает true, если его аргумент является нормальным числом. Ниже представлен пример кода, в котором эта функция используется для прекращения цикла, когда число становится субнормальным:
#include // для isnormal()
float num = 1.7e-19;
float numprev = num;
while (isnormal(num)) // пока num имеет полную точность float
{
numprev = num; num /= 13.7f;
}
Короче говоря, существует расширенная поддержка детализированного управления выполнением вычислений с плавающей запятой.
поддержка комплексных чисел
Комплексное число — это число, состоящее из действительной и мнимой частей. Действительная часть является обычным вещественным числом, которое может быть представлено типом с плавающей запятой. Мнимая часть представляет мнимое число. Мнимое число, в свою очередь, представляет собой величину, кратную квадратному корню из -1. В математике комплексные числа часто записываются в форме А .2 + 2.01; где i символически представляет квадратный корень из -1.
Читать дальше