繁体   English   中英

如何有效地处理 C 语言中的复数?

[英]How to efficiently work with complex numbers in C language?

如何有效地处理 C 语言中的复数?

我们有 3 个选项:

  1. 使用结构并按值将它们传递给函数:
struct complex_double
{
   double data[2];
}

typedef struct complex_double ComplexDouble;

ComplexDouble complex_double_add(ComplexDouble z_1, ComplexDouble z_2)
{
   ComplexDouble result;

   result.data[0] = z_1.data[0] + z_2.data[0];
   result.data[1] = z_1.data[1] + z_2.data[1];

   return result;
}

但是通过这种方式,我们对结构的值进行了 3 次复制(两个 arguments 和一个返回)。 ComplexDouble的大小是 16 字节,所以我们需要复制 3 * 16 字节 = 48 字节,这可能效率不高。

  1. 将指针传递给结构:
struct complex_double
{
   double data[2];
}

typedef struct complex_double ComplexDouble;

ComplexDouble * complex_double_initialize(double x, double y)
{
   ComplexDouble *z;
   
   z = (ComplexDouble *)malloc( sizeof(ComplexDouble) );

   if(z == NULL)
   {
     fprintf(stderr, "complex_double_initialize: Error! Failed to allocate memory for ComplexDouble\n");
     exit(EXIT_FAILURE);
   }

   z->data[0] = x;
   z->data[1] = y;

   return z;
}

void complex_double_add(ComplexDouble *result, ComplexDouble *z_1, ComplexDouble *z_2)
{
   result->data[0] = z_1->data[0] + z_2->data[0];
   result->data[1] = z_1->data[1] + z_2->data[1];
}

在这个变体中,我们传递 3 个指向结构的指针,即 3 * 8 字节 = 24 字节。 也许这更有效。

  1. 使用 C99 标准库中的复杂类型:
double complex z_1, z_2, z_3;

z_3 = z_1 + z_2;

double complex double_complex_add(double complex z_1, double complex z_2)
{
   return (z_1 + z_2);
}

但是对于 C99 复杂类型,我有一些不明白的地方。 double complex实际上是如何传入 function 并从 function 返回的? 它是否像第一个带有结构的变体一样按值复制?

我应该使用哪个变体?

使用它的标准版本。 它现在已集成到编译器中,是你能得到的最好的。

How is double complex actually passed into function and returned from function?

正如您的 function 的规范所示,它们可以按值访问,并且与任何其他 function 参数的情况一样,除非它们具有数组类型。

复数保证与两个实数的向量具有相同的表示(= memory 布局),但它们是正确的类型:

Each complex type has the same representation and alignment requirements as an array
type containing exactly two elements of the corresponding real type; the first element is
equal to the real part, and the second element to the imaginary part, of the complex
number.

尽管它们的字节模式与浮点值的二元素向量相同,但它们与任何其他数字一样被视为算术类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM