GCC 如何理解复杂的算术?
How GCC understand complex arithmetics?
我对 C 语言有点陌生,我对 C 的一些基本原理有疑问。我正在实现一个处理定点运算的自定义复杂库。
我们可以在 C 中使用名为 complex.h 的库。使用该库,我们可以如下声明和初始化复杂变量。
complex float a = 2 + 3I;
complex float b = 5 + 2I;
complex float c = a + b;
但是当我们添加这两个复数浮点数时,编译器如何理解我们要添加两个复数。编译器是否使用其数据类型理解它?
那么我们需要遵循什么方法来实现复杂的数据类型?
我已经知道如何使用结构来实现它。但是我需要知道如何制作该结构来处理以 a + bI
.
格式给出的变量
更清楚地说,我的问题是我如何处理结构中的 'I' 字符?
编译器知道如何处理对 complex
类型执行算术运算。然后,您可以使用函数 crealf
和 cimagf
(或 creal
和 cimag
for complex double
)来获取每个部分。
complex float a = 2 + 3I; complex float b = 5 + 2I;
complex float c = a + b;
printf("result: %f%+fi\n", crealf(c), cimagf(c));
输出:
7.000000+5.000000i
在 C 中,复杂类型内置于语言本身。包括 <complex.h>
只是让您使用 complex
这个词来处理它们;如果没有 header,您必须将其拼写为 _Complex
。1 复杂类型内置于语言中,因此编译器对它们有先天的了解。您不能自己创建类似的类型。
在 C++ 中(问题最初被标记为),<complex>
中的 std::complex
是 class。 +
和其他一些操作员使用它,因为它们是 overloaded。这并没有什么神奇之处,您可以制作自己的 classes 以这种方式运行。与 C++ 不同,C 没有运算符重载,因此在 C 中是不可能的。
1 这样做是为了保持与将单词 complex
用于其他目的的程序的向后兼容性。以 _
开头后跟大写字母的单词是 保留的 ,因此在引入复数之前,程序出于任何目的使用单词 _Complex
都是非法的进入语言。
我对 C 语言有点陌生,我对 C 的一些基本原理有疑问。我正在实现一个处理定点运算的自定义复杂库。
我们可以在 C 中使用名为 complex.h 的库。使用该库,我们可以如下声明和初始化复杂变量。
complex float a = 2 + 3I;
complex float b = 5 + 2I;
complex float c = a + b;
但是当我们添加这两个复数浮点数时,编译器如何理解我们要添加两个复数。编译器是否使用其数据类型理解它?
那么我们需要遵循什么方法来实现复杂的数据类型?
我已经知道如何使用结构来实现它。但是我需要知道如何制作该结构来处理以 a + bI
.
更清楚地说,我的问题是我如何处理结构中的 'I' 字符?
编译器知道如何处理对 complex
类型执行算术运算。然后,您可以使用函数 crealf
和 cimagf
(或 creal
和 cimag
for complex double
)来获取每个部分。
complex float a = 2 + 3I; complex float b = 5 + 2I;
complex float c = a + b;
printf("result: %f%+fi\n", crealf(c), cimagf(c));
输出:
7.000000+5.000000i
在 C 中,复杂类型内置于语言本身。包括 <complex.h>
只是让您使用 complex
这个词来处理它们;如果没有 header,您必须将其拼写为 _Complex
。1 复杂类型内置于语言中,因此编译器对它们有先天的了解。您不能自己创建类似的类型。
在 C++ 中(问题最初被标记为),<complex>
中的 std::complex
是 class。 +
和其他一些操作员使用它,因为它们是 overloaded。这并没有什么神奇之处,您可以制作自己的 classes 以这种方式运行。与 C++ 不同,C 没有运算符重载,因此在 C 中是不可能的。
1 这样做是为了保持与将单词 complex
用于其他目的的程序的向后兼容性。以 _
开头后跟大写字母的单词是 保留的 ,因此在引入复数之前,程序出于任何目的使用单词 _Complex
都是非法的进入语言。