1

Тема: Як краще працювати з комплексними числами в C ?

Порадьте, будь-ласка, як краще та ефективніше працювати з комплексними числами в мові C ?

Варіант №1: Використовувати вбудований тип, що є в C99.

#include <complex.h>
...
double complex sum(double complex z1, double complex z2)
{
  return (z1 + z2);
}
...
double complex z1, z2, z3;

z1 = 1.0 + I*2.0;
z2 = 3.0 + I*4.0;
z3 = sum(z1, z2);

Варінт №2: Ввести структуру Complex, і передавати її по значенню.

struct Complex
{
double re;
double im;
}

typedef struct Complex Complex;

Complex sum(Complex z1, Complex z2)
{
  Complex temp;

  temp.re = z1.re + z2.re;
  temp.im = z1.im + z2.im;

  return temp;
}

Варінт №3: Передавати комплексні числа за допомогою покажчиків.

struct Complex
{
double re;
double im;
}

typedef struct Complex Complex;

Complex * complex_init(double real_part, double imaginary_part)
{
    Complex *temp;

    temp = (Complex *)malloc( sizeof(Complex) );

    temp->re = real_part;
    temp->im = imaginary_part;

    return temp;
}


void complex_free(Complex *z)
{
    free(z);
}


void complex_sum(Complex *result, Complex *z1, Complex *z2)
{
    result->re = (z1->re) + (z2->re);
    result->im = (z1->im) + (z2->im);
}

Здавалося би, працювати з покажчиками швидше, але записувати арифметичні операції накшталт z = a*(z1 + z2)*cos(z3)  зручніше використовуючи вбудований тип.

2

Re: Як краще працювати з комплексними числами в C ?

Для початку: велосипеди - зло. Стандартна структура майже точно не працюватиме гірше за вашу. Тобто питання виключно в тому, як краще використовувати стандартні комплексні з <complex> - безпосередньо чи за вказівниками.
double займає 8 байтів. Вказівник - теж 8. Тобто complex забиратиме на 8 байтів більше зі стека, але доведеться ще смикати malloc/new і додатково переходити за посиланнями. В цілому я б припустив, що передавання за значенням працюватиме швидше та з меншими витратами пам'яті, але потрібне тестування конкретного коду. До речі, це стосується і велосипеду - якщо вас не влаштовує швидкість та витрати пам'яті на стандартних елементах, можете спробувати використовувати власні. Але точно не варто дочасно оптимізувати код.

Подякували: leofun01, Watson2