В частности, у класса не так много способов определения структур данных комплексных чисел. Вы можете представить это:
struct complex{
double real;
double imaginary;
};
Но мнимое число i = sqrt (-1) не может быть сведено к примитивному типу, поскольку примитивные числовые типы обязательно являются действительными числами. Так что это должно быть определено неявно с помощью сложного продукта. Это очень легко сделать на объектно-ориентированном языке, который допускает перегрузку операторов, но как это сделать с процедурным языком, таким как C?
Ты можешь написать:
_Complex double x = _Complex_I;
Вы можете делать обычные арифметические операции над комплексными числами. Заголовок #include <complex.h>
объявляет сложные версии обычных математических функций (триг, корни и т. д.)
Раздел §6.2.5 Типы из Стандарт C11 (ISO / IEC 9899: 2011) частично говорит:
№10 Есть три реальные плавающие типы, обозначен как
float
,double
, а такжеlong double
,42) Набор значений типаfloat
является подмножеством набора значений
типdouble
; набор значений типаdouble
является подмножеством набора значений
типlong double
,¶11 Есть три сложные типы, обозначен как
float _Complex
,double _Complex
, а такжеlong double _Complex
,43) (Сложные типы являются условными
особенность, которую реализации не должны поддерживать; см. 6.10.8.3.) Реальное плавание и
сложные типы все вместе называются плавающие типы.For12 Для каждого плавающего типа есть соответствующий реальный тип, который всегда настоящий плавающий
тип. Для реальных плавающих типов это тот же тип. Для сложных типов это тип, данный
удалив ключевое слово_Complex
от имени типа.Each13 Каждый сложный тип имеет те же требования к представлению и выравниванию, что и массив
тип, содержащий ровно два элемента соответствующего реального типа; первый элемент
равна реальной части, а второй элемент мнимой части комплекса
число.42) См. «Будущие языковые указания» (6.11.1).
43) Спецификация для мнимых типов приведена в приложении G.6.11.1 Плавающие типы
F1 Будущая стандартизация может включать дополнительные типы с плавающей запятой, в том числе с
больший диапазон, точность или оба, чемlong double
,
Там также спецификация библиотеки §7.3 Комплексная арифметика <complex.h>
:
7.3.1 Введение
№1 Заголовок
<complex.h>
определяет макросы и объявляет функции, которые поддерживают сложные
арифметика.192)Imple2 Реализации, которые определяют макрос
__STDC_NO_COMPLEX__
не нужно предоставлять
этот заголовок не поддерживает ни один из его объектов.Each3 Каждый синопсис определяет семейство функций, состоящее из главной функции с одним
или большеdouble complex
параметры иdouble complex
или жеdouble
вернуть
значение; и другие функции с тем же именем, но сf
а такжеl
суффиксы, которые
соответствующие функции сfloat
а такжеlong double
параметры и возвращаемые значения.4 Макрос
complex
расширяется до
_Complex
; макрос_Complex_I
расширяется до константного выражения типа
const float _Complex
со значением
мнимая единица.193)№5 Макросы
imaginary
а также
_Imaginary_I
определяются тогда и только тогда, когда реализация поддерживает мнимые типы;194) если определено,
они расширяются до_Imaginary
и постоянное выражение типаconst float
со значением мнимой единицы.
_Imaginary№6 Макрос
I
расширяется либо
_Imaginary_I
или же_Complex_I
, Если_Imaginary_I
не определено,I
расширится до_Complex_I
,¶7 Несмотря на положения 7.1.3, программа может быть неопределена и, возможно, затем
переопределить макросыcomplex
,imaginary
, а такжеI
,192) См. «Будущие направления библиотеки» (7.31.1).
193) Мнимая единица — это число я такой, что я2 = −1.
194) Спецификация для мнимых типов содержится в информативном приложении G.
И есть 14 страниц Приложение G, который начинается:
Приложение G
(Обязательное)
МЭК 60559-совместимая комплексная арифметика
G.1 Введение
This1 Это приложение дополняет приложение F, чтобы определить сложную арифметику для совместимости с
МЭК 60559 вещественная арифметика с плавающей точкой. Реализация, которая определяет
__STDC_IEC_559_COMPLEX__
должны соответствовать спецификациям в этом приложении.375)375) Реализации, которые не определяют
__STDC_IEC_559_COMPLEX__
не обязаны соответствовать этим спецификациям.G.2 Типы
¶1 Появилось новое ключевое слово _Imaginary, которое используется для указания мнимых типов. это
используется в качестве спецификатора типа в спецификаторах объявления так же, как _Complex
(таким образом, _Imaginary float является допустимым именем типа).¶2 Существует три воображаемых типа, обозначаемых как float _Imaginary, double
_Imaginary, и длинный двойной _Imaginary. Мнимые типы (наряду с
реальные плавающие и сложные типы) являются плавающими типами.For3 Для мнимых типов соответствующий действительный тип задается удалением ключевого слова.
_Imaginary от имени типа.¶4 Каждый воображаемый тип имеет те же требования к представлению и выравниванию, что и
соответствующий реальный тип. Значение объекта воображаемого типа — это значение реального
раз представления мнимой единицы.Domain5 Область мнимого типа состоит из мнимых типов.
Любопытно, что сноска 194 определяет Приложение G как «информативное», но Приложение идентифицирует себя как «нормативное». В сноске 43 упоминается «нормативный» или «информативный».
Раздел 6.2.5-13 стандарта C совершенно ясно показывает, как должна быть представлена комплексная переменная.