【问题标题】:How GCC understand complex arithmetics?GCC 如何理解复杂的算术?
【发布时间】:2021-03-16 19:56:29
【问题描述】:

我对 C 语言有点陌生,我对 C 的一些基本原理有疑问。我正在实现一个处理定点算术的自定义复杂库。

我们可以在 C 中使用一个名为 complex.h 的库。使用该库,我们可以如下声明和初始化复杂变量。

complex float a = 2 + 3I;
complex float b = 5 + 2I;

complex float c = a + b;

但是当我们添加这两个复数浮点数时,编译器如何理解我们要添加两个复数。编译器是否使用它的数据类型来理解它?

那么我们需要遵循什么方法来实现复杂的数据类型?

我已经知道如何使用结构来实现它。但我需要知道我如何制作该结构来处理以a + bI 格式给出的变量。

为了更清楚,我的问题是我如何处理我的结构中的那个“我”角色?

【问题讨论】:

  • 是的,编译器正在跟踪表达式的类型以决定如何添加数字,就像它决定如何将 int 添加到 double 一样。

标签: c header-files c99 complex.h


【解决方案1】:

在 C 中,复杂类型内置于语言本身中。包括<complex.h> 只是让您使用单词complex 与他们一起工作;如果没有标头,您必须将其拼写为_Complex1 复杂类型内置于语言中,因此编译器对它们有先天的了解。你不能自己创建类似的类型。

在 C++ 中(问题最初是用它标记的),来自<complex>std::complex 是一个类。 + 和其他一些运营商使用它,因为它们是 overloaded 的。这没有什么神奇之处,您可以创建自己的类以这种方式运行。与 C++ 不同,C 没有运算符重载,因此在 C 中是不可能的。


1 这样做是为了保持与将单词complex 用于其他目的的程序的向后兼容性。以_ 开头后跟一个大写字母的单词保留,因此在将复数引入语言之前,程序出于任何目的使用单词_Complex 都是非法的。

【讨论】:

  • 我在你的回答中明白了。这解决了我的困惑。非常感谢。
【解决方案2】:

编译器知道如何处理complex 类型的算术运算。然后,您可以使用函数crealfcimagf(或crealcimag 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

【讨论】:

  • 其实我只是想知道如果我们要实现一个自定义结构来处理以a + bI格式给出的复数,我们如何定义这样的操作
  • @BMTC 实际上你不需要,因为这是标准定义的类型。如果您希望严格地进行学习,您想要struct my_complex { double real, imag; }; 之类的东西,那么您需要定义函数来进行算术运算。
  • 我明白你所说的。但是当我只写 complex float c = a + b; 时,有没有办法通过编译器调用该算术函数? .因为 complex.h 库做了类似的事情。我需要知道如何在不将传统函数调用称为复杂 c = __sum(a , b); 的情况下做到这一点
  • @BMTC 这将涉及运算符重载,这是严格的 C++ 特性。
  • 我明白了。非常感谢您的回答。
猜你喜欢
  • 2012-09-17
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多