2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 класс комплексных чисел в си
Сообщение16.12.2008, 15:27 


02/08/06
63
Подскажите нормально ли написан класс комплексных чисел или что-то можно изменить для ускорения работы осноыной программы?

с-файл и 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 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Функция d неоптимальна, так как знаменатель в ней считается дважды.

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

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

 Профиль  
                  
 
 
Сообщение16.12.2008, 16:39 


02/08/06
63
спасибо, только как это - объявить инлайн? и возможно ли это в си?

 Профиль  
                  
 
 
Сообщение16.12.2008, 17:43 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Код:
inline complex_t mul(complex_t x, complex_t y);


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

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

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

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

 Профиль  
                  
 
 
Сообщение16.12.2008, 22:36 
Заслуженный участник


15/05/05
3445
USA
икс и грек писал(а):
спасибо, только как это - объявить инлайн? и возможно ли это в си?

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

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

 Профиль  
                  
 
 Re: класс комплексных чисел в си
Сообщение26.03.2009, 23:55 


26/03/09
1
икс и грек писал(а):
Подскажите нормально ли написан класс комплексных чисел или что-то можно изменить для ускорения работы осноыной программы?

с-файл и 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 


23/12/08
245
Украина
Антон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 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Еще можно почитать стандарт C'99.
Там есть <complex.h>

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group