Spec-Zone.ru › GCC 13

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

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

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

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

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

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

GCC предоставляет встроенную функцию __builtin_complex для построения комплексного значения.

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-13.3.0/gcc/Complex.html

Spec-Zone.ru

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