2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 класс комплексных чисел в си
Сообщение16.12.2008, 15:27 
Подскажите нормально ли написан класс комплексных чисел или что-то можно изменить для ускорения работы осноыной программы?

с-файл и h-файл:



Код:
#include "complex.h"
#include <math.h>

complex_t mul(complex_t x, complex_t y)
{

complex_t t;
t.a=x.a*y.a-x.b*y.b;
t.b=x.a*y.b+x.b*y.a;
return t;
}

complex_t add(complex_t x, complex_t y)
{

complex_t t;
t.a=x.a+y.a;
t.b=x.b+y.b;
return t;
}

complex_t d(complex_t x, complex_t y)
{
complex_t t;
t.a=(x.a*y.a+x.b*y.b)/(y.a*y.a+y.b*y.b);
t.b=(x.b*y.a-x.a*y.b)/(y.a*y.a+y.b*y.b);
return t;
}

void eq(complex_t *x, complex_t y)
{
x->a=y.a;
x->b=y.b;
}

complex_t neg(complex_t x)
{
complex_t t;
t.a=-x.a;
t.b=-x.b;
return t;
}
double absval(complex_t x)
{

double r;
r=sqrt((x.a)*(x.a)+(x.b)*(x.b));
return r;
}




Код:
Код:
#ifndef __COMPLEX_H__
#define __COMPLEX_H__
typedef struct
{double a,b;}
complex_t,*pcomplex_t;
complex_t mul(complex_t x, complex_t y);
complex_t add(complex_t x, complex_t y);
complex_t d(complex_t x, complex_t y);
void eq(complex_t *x, complex_t y);
complex_t neg(complex_t x);
double absval(complex_t x);
#endif






 
 
 
 
Сообщение16.12.2008, 15:59 
Аватара пользователя
Функция d неоптимальна, так как знаменатель в ней считается дважды.

Все функции можно объявить как inline, если они вызываются часто, то это может ускорить работу.

Слово "класс" здесь употреблять неправильно, так как данный код совершенно не использует преимуществ классов C++. Гораздо лучше было бы делать это через настоящие классы; в частности, перегрузить все стандартные операторы (+, -, *, +=, -=, ==,...), тогда все арифметические выражения для комплексных чисел можно будет писать как для стандартных типов.

 
 
 
 
Сообщение16.12.2008, 16:39 
спасибо, только как это - объявить инлайн? и возможно ли это в си?

 
 
 
 
Сообщение16.12.2008, 17:43 
Аватара пользователя
Код:
inline complex_t mul(complex_t x, complex_t y);


Это лишь рекомендация компилятору, сделает ли он так на самом деле - на его усмотрение. Правильнее уточнять этот вопрос в описаниях к используемому компилятору.

Можно провести профилирование программы и посмотреть, фиксируются ли в полученном списке вызовы функций. Если да, то тогда указание было проигнорировано. Если такая элементарная функция вызывается слишком часто, то накладные расходы на вызов могут оказать влияние на быстродействие. В этом случае следует все-таки постараться приложить усилия, чтобы функция стала inline.

Добавлено спустя 1 минуту 52 секунды:

Вообще же обычно делают inline функции-члены классов. Для них вроде бы даже разумные компиляторы при разумных настройках сами разберутся, что эту функцию лучше внедрить.

 
 
 
 
Сообщение16.12.2008, 22:36 
икс и грек писал(а):
спасибо, только как это - объявить инлайн? и возможно ли это в си?

Ключевое слово "inline" определено в стандарте C99. Если Ваш компилятор его поддерживает, можете использовать.

А вот классов в языке С точно нет. Поэтому то, что Вы написали - это скорее модуль.

 
 
 
 Re: класс комплексных чисел в си
Сообщение26.03.2009, 23:55 
икс и грек писал(а):
Подскажите нормально ли написан класс комплексных чисел или что-то можно изменить для ускорения работы осноыной программы?

с-файл и h-файл:



Код:
#include "complex.h"
#include <math.h>

complex_t mul(complex_t x, complex_t y)
{

complex_t t;
t.a=x.a*y.a-x.b*y.b;
t.b=x.a*y.b+x.b*y.a;
return t;
}

complex_t add(complex_t x, complex_t y)
{

complex_t t;
t.a=x.a+y.a;
t.b=x.b+y.b;
return t;
}

complex_t d(complex_t x, complex_t y)
{
complex_t t;
t.a=(x.a*y.a+x.b*y.b)/(y.a*y.a+y.b*y.b);
t.b=(x.b*y.a-x.a*y.b)/(y.a*y.a+y.b*y.b);
return t;
}

void eq(complex_t *x, complex_t y)
{
x->a=y.a;
x->b=y.b;
}

complex_t neg(complex_t x)
{
complex_t t;
t.a=-x.a;
t.b=-x.b;
return t;
}
double absval(complex_t x)
{

double r;
r=sqrt((x.a)*(x.a)+(x.b)*(x.b));
return r;
}




Код:
Код:
#ifndef __COMPLEX_H__
#define __COMPLEX_H__
typedef struct
{double a,b;}
complex_t,*pcomplex_t;
complex_t mul(complex_t x, complex_t y);
complex_t add(complex_t x, complex_t y);
complex_t d(complex_t x, complex_t y);
void eq(complex_t *x, complex_t y);
complex_t neg(complex_t x);
double absval(complex_t x);
#endif









пожалуйста, объясните построчечно этот код. Только начал учить си++. Пока мало, что понимаю((. Но очень хочется разобраться. Заранее, спасибо!!!

 
 
 
 Re: класс комплексных чисел в си
Сообщение27.03.2009, 19:13 
Антон1555 писал(а):
икс и грек писал(а):
Подскажите нормально ли написан класс комплексных чисел или что-то можно изменить для ускорения работы осноыной программы?

с-файл и h-файл:



Код:
#include "complex.h"
#include <math.h>

complex_t mul(complex_t x, complex_t y)
{

complex_t t;
t.a=x.a*y.a-x.b*y.b;
t.b=x.a*y.b+x.b*y.a;
return t;
}

complex_t add(complex_t x, complex_t y)
{

complex_t t;
t.a=x.a+y.a;
t.b=x.b+y.b;
return t;
}

complex_t d(complex_t x, complex_t y)
{
complex_t t;
t.a=(x.a*y.a+x.b*y.b)/(y.a*y.a+y.b*y.b);
t.b=(x.b*y.a-x.a*y.b)/(y.a*y.a+y.b*y.b);
return t;
}

void eq(complex_t *x, complex_t y)
{
x->a=y.a;
x->b=y.b;
}

complex_t neg(complex_t x)
{
complex_t t;
t.a=-x.a;
t.b=-x.b;
return t;
}
double absval(complex_t x)
{

double r;
r=sqrt((x.a)*(x.a)+(x.b)*(x.b));
return r;
}




Код:
Код:
#ifndef __COMPLEX_H__
#define __COMPLEX_H__
typedef struct
{double a,b;}
complex_t,*pcomplex_t;
complex_t mul(complex_t x, complex_t y);
complex_t add(complex_t x, complex_t y);
complex_t d(complex_t x, complex_t y);
void eq(complex_t *x, complex_t y);
complex_t neg(complex_t x);
double absval(complex_t x);
#endif









пожалуйста, объясните построчечно этот код. Только начал учить си++. Пока мало, что понимаю((. Но очень хочется разобраться. Заранее, спасибо!!!

ожалуйста прочитайте хотябы одну книжку о С/С++, а потом просите о помощи.

Добавлено спустя 2 минуты 26 секунд:

Для новичков очень приятна будет книга Керниган и Риччи "Язык С"
Там описан необходимый минимум.

 
 
 
 
Сообщение27.03.2009, 20:02 
Аватара пользователя
Еще можно почитать стандарт C'99.
Там есть <complex.h>

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group