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 C11CMPLXF,CMPLXиCMPLXL. real и imag должны иметь один и тот же тип, вещественный бинарный тип с плавающей точкой, и результат имеет соответствующий комплексный тип с вещественной и мнимой частями real и imag. В отличие от ‘real + I * imag’, это работает даже при наличии бесконечностей, NaN и отрицательных нулей.
Далее: Типы с плавающей точкой, Предыдущее: Long Long, Вверх: Расширения C [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Complex.html