簡體   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