Spec-Zone.ru › GCC 15

6.1.3 Комплексные числа

ISO C99 поддерживает комплексные типы данных с плавающей точкой, а в качестве расширения GCC поддерживает их в режиме C90 и в C++. GCC также поддерживает комплексные целочисленные типы данных, которые не входят в ISO C99. Комплексные типы можно объявлять с помощью ключевого слова _Complex. В качестве расширения также поддерживается устаревшее ключевое слово GNU __complex__.

Например, ‘_Complex double x;’ объявляет x переменной, вещественная и мнимая части которой имеют тип double. ‘_Complex short int y;’ объявляет y с вещественной и мнимой частями типа short int; это вряд ли будет полезно, но показывает, что множество комплексных типов является полным.

Чтобы записать константу комплексного типа данных, используйте суффикс ‘i’, ‘I’, ‘j’ или ‘J’ (любой из них; они эквивалентны). Например, 2.5fi имеет тип _Complex float, а 3i имеет тип _Complex int. Такая константа всегда имеет чисто мнимое значение, но, прибавив её к вещественной константе, можно получить любое комплексное значение. Эта возможность входит в ISO C2Y, а для более ранних редакций C является расширением GNU. Если у вас есть библиотека C, соответствующая ISO C99 (например, GNU C Library), и вы хотите создавать комплексные константы с плавающей точкой при использовании стандартов, предшествующих ISO C2Y, подключите <complex.h> и используйте макросы I или _Complex_I.

В C++ суффикс также является расширением GNU, если включён параметр -fext-numeric-literals; в противном случае он обрабатывается как любой другой пользовательский литерал C++. В библиотеке ISO C++14 также определён суффикс ‘i’, поэтому код C++14, подключающий заголовок ‘<complex>’, не может использовать ‘i’ для расширения GNU. Суффиксы ‘I’, ‘j’ и ‘J’ по-прежнему имеют значение GNU.

GCC обрабатывает неявные и явные преобразования между типами _Complex с разными базовыми скалярными типами, преобразуя вещественную и мнимую части к базовому типу результата. GCC также обрабатывает неявные и явные преобразования из скалярного типа в тип _Complex, присваивая мнимой части нулевое значение.

Фронтенд C может выполнять неявные и явные преобразования из типа _Complex в скалярный тип: при этом используется значение вещественной части, а мнимая часть игнорируется. В коде C++ такое преобразование считается некорректным, и G++ выдаёт сообщение об ошибке.

В GCC есть несколько расширений, позволяющих извлекать вещественную и мнимую части выражения с комплексным значением. Обратите внимание: эти выражения являются lvalue, если exp является lvalue. Операнды этих выражений имеют комплексный тип, который может быть получен повышением скалярного типа до комплексного. Например, __real__ (int)x эквивалентно преобразованию к _Complex int перед выполнением __real__.

Выражение Описание
__real__ exp Извлекает вещественную часть exp.
__imag__ exp Извлекает мнимую часть exp.

Для значений с плавающей точкой следует использовать функции ISO C99, объявленные в <complex.h> и также предоставляемые GCC в качестве встроенных функций.

Выражение float double long double
__real__ exp crealf creal creall
__imag__ exp cimagf cimag cimagl

Оператор ‘~’ выполняет комплексное сопряжение при применении к значению комплексного типа. Это расширение GNU; для значений с плавающей точкой следует использовать функции ISO C99 conjf, conj и conjl, объявленные в <complex.h> и также предоставляемые GCC в качестве встроенных функций. Обратите внимание: в отличие от операторов __real__ и __imag__, этот оператор не выполняет неявное преобразование к комплексному типу, поскольку ‘~’ уже является обычным оператором.

GCC может размещать автоматические комплексные переменные непоследовательно; возможен даже случай, когда вещественная часть находится в регистре, а мнимая — в стеке (или наоборот). Такое представление поддерживает только формат отладочной информации DWARF, поэтому рекомендуется использовать DWARF. Если вы используете формат отладочной информации stabs, GCC описывает непоследовательно размещённую комплексную переменную как две отдельные переменные некомплексного типа. Если фактическое имя переменной — foo, две фиктивные переменные называются foo$real и foo$imag. Эти фиктивные переменные можно просматривать и изменять с помощью отладчика.

Встроенная функция: type __builtin_complex (real, imag)

Встроенная функция __builtin_complex предназначена для реализации макросов ISO C11 CMPLXF, CMPLX и CMPLXL. Типы real и imag должны совпадать и быть вещественным двоичным типом с плавающей точкой; результат имеет соответствующий комплексный тип, а его вещественная и мнимая части равны real и imag. В отличие от выражения ‘real + I * imag’, эта функция работает и при наличии бесконечностей, NaN и отрицательных нулей.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Complex.html

Spec-Zone.ru

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