Справочные материалы 909
т.к. asin() может принимать аргументы от -1 до 1. Субнормальным называется такое число, абсолютная величина которого меньше минимально допустимого значения, которое можно представить с максимальной точностью.) Существуют также специализированные функции сравнения, которые ведут себя иначе, чем стандартные операции отношений, когда один или более аргументов являются ненормальными значениями.
Схемы классификации С99 можно применять для обнаружения разного рода отклонений от нормы в вычислениях. Например, макрос isnormal() из math.h возвращает true, если его аргумент является нормальным числом. Ниже представлен пример кода, в котором эта функция используется для прекращения цикла, когда число становится субнормальным:
#include
float num = 1.7e-19;
float numprev = num;
while (isnormal(num)) // пока num имеет полную точность float
{
numprev = num; num /= 13.7f;
}
Короче говоря, существует расширенная поддержка детализированного управления выполнением вычислений с плавающей запятой.
поддержка комплексных чисел
Комплексное число — это число, состоящее из действительной и мнимой частей. Действительная часть является обычным вещественным числом, которое может быть представлено типом с плавающей запятой. Мнимая часть представляет мнимое число. Мнимое число, в свою очередь, представляет собой величину, кратную квадратному корню из -1. В математике комплексные числа часто записываются в форме А .2 + 2.01; где i символически представляет квадратный корень из -1.
В С99 поддерживаются три комплексных типа:
• float /Complex
• double _Complex
• long double /Complex
Скажем, значение float Complex должно сохраняться с применением того же самого способа организации памяти, что и для двухэлементного массива float, где действительная часть сохраняется в первом элементе, а мнимая — во втором.
Реализации С99 и C11 могут поддерживать три мнимых типа:
• float _Imaginary
• double _Imaginary
• long double _Imaginary
Включение заголовочного файла complex.h позволяет использовать имя complex вместо /Complex и imaginary вместо _Imaginary.
Для комплексных типов определены арифметические операции, следующие обычным правилам математики. Например, значение (a + b* I) * ( c+d* I) равно:
(a*c-b*d)+(b*c+a*d)*1
910 Приложение Б
В заголовочном файле complex.h определено несколько макросов и функций, которые принимают и возвращают комплексные числа. В частности, макрос I представляет квадратный корень из -1. Это позволяет поступать следующим образом:
double complex cl = 4.2 + 2.0 * I; float imaginary c2= -3.0 * I;
Для присваивания значений комплексному числу в С11 предлагается второе средство — макрос CMPLX(). Например, если ге и int являются значениями double, можно сделать так:
double complex сЗ = CMPLX(re, im);
Смысл в том, что этот макрос может лучше обрабатывать необычные случаи, такие как ситуация, в которой im представляет собой бесконечность или не число, чем прямое присваивание.
В заголовочном файле complex.h содержится несколько прототипов комплексных функций. Многие из них являются комплексными эквивалентами функций math.h, в именах которых присутствует префикс с. Скажем, csin() возвращает комплексный синус своего комплексного аргумента. Другие функции касаются специфических свойств комплексных чисел. Например, creal() возвращает действительную часть комплексного числа, a cimag() — его мнимую часть в виде вещественного числа. То есть для переменной z типа double complex справедливо следующее: