【发布时间】:2021-02-08 16:44:49
【问题描述】:
如何在 C 语言中高效处理复数?
我们有 3 个选择:
- 使用结构并按值将它们传递给函数:
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 字节,可能效率不高。
- 将指针传递给结构:
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 字节。也许这样更有效。
- 使用 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 是如何实际传入函数并从函数返回的?是否像第一个带有结构的变体一样按值复制?
我应该使用哪种变体?
【问题讨论】:
-
既然所有符合标准的 C 实现中已经有一个,为什么还要创建自己的实现?
-
选项4)升级到C++
-
选项 4) 通过传递
double complex *组合选项 2 和 3。 -
Andrew Henle,我只是想了解 C99 标准数据类型“双复数”是如何实现的。
标签: c c99 complex-numbers