微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C语言如何高效处理复数?

如何解决C语言如何高效处理复数?

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 次复制(两个参数和一个返回值)。 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 实际上是如何传入函数并从函数返回的?它是否像第一个带结构的变体一样按值复制?

我应该使用哪个变体?

解决方法

使用它的标准版本。它现在已集成到编译器中,并且是您可以获得的最佳选择。

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

它们可以按您的函数规范所指示的值访问,并且对于任何其他函数参数也是如此,除非它们具有数组类型。

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

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.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。