Как комплексные числа (и мнимое число i) представлены в Native C, а не в C ++?

В частности, у класса не так много способов определения структур данных комплексных чисел. Вы можете представить это:

struct complex{
double real;
double imaginary;

};

Но мнимое число i = sqrt (-1) не может быть сведено к примитивному типу, поскольку примитивные числовые типы обязательно являются действительными числами. Так что это должно быть определено неявно с помощью сложного продукта. Это очень легко сделать на объектно-ориентированном языке, который допускает перегрузку операторов, но как это сделать с процедурным языком, таким как C?

1

Решение

Ты можешь написать:

_Complex double x = _Complex_I;

Вы можете делать обычные арифметические операции над комплексными числами. Заголовок #include <complex.h> объявляет сложные версии обычных математических функций (триг, корни и т. д.)

2

Другие решения

Раздел §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 совершенно ясно показывает, как должна быть представлена ​​комплексная переменная.

2

По вопросам рекламы [email protected]