saro |
Отправлено: 15.03.2007, 12:03 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 1
|
Есть код,написанный на Builder-e 5 его нужно перевести на Делфи 7,все бы хорошо,но есть один модуль.Проблема в том что функция
double find_p_for_e2 (double e0, double a) зацикливается,и не ыиходит из него. Может кто нибудь обьяснит что там делается.
и что это за конструкция
t2 = (double)(e2/n);
t1 = (double)(e0/n);
зачем переводить в double если реультат деления -double?
Буду очень благодарен если напишите код на Делфи!!
//----------------------------------------------------------------------------
double func_e2(double a, double p)
{ double e, pi = 3.1415926536;
if(alfabase) {e = (1+6*pi*pi*a/p)/((1+4*pi*pi*a/p)*sqrt(1+4*pi*pi*a/p));}
else {e = (1+6*pi*pi*a/sqrtl(p))/((1+4*pi*pi*a/p)*sqrt(1+4*pi*pi*a/p));}
return e;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
double func_He(double a, double p)
{ double He, pi = 3.1415926536;
He = (1.5*pi/log(2))*((a/p)+(1/4*pi*pi)*log(1+4*pi*pi*a/p));
return He;
}
//----------------------------------------------------------------------------
double find_p_for_e2 (double e0, double a)
{
int i = -1, x = 0, t1, t2;
double p = 100, e2, k = 10, n;
n = e0*0.00001;
while (x == 0) { e2 = func_e2(a, p);
// e2 = floor(e2 / n)*n;
t2 = (double)(e2/n);
t1 = (double)(e0/n);
if (t2 == t1)
{x = 1;}
else { if (e2> e0) {if (i == 0) k = k/10;
i = 1; p = p — k;
if (p <= 0) { p = p + k; k = k/10;
p = p — k;
}
}
else { if (i == 1) k = k/10;
p = p + k; i = 0;
}
}
}
return p;
}
//----------------------------------------------------------------------------
double find_p_for_He (double H0, double a)
{
int i = -1, x = 0, t1, t2;
double p = 1, He, k = 0.1, n;
n = H0*0.00001;
while (x == 0) { He = func_He(a, p);
// e2 = floor(e2 / n)*n;
t2 = (double)(He/n);
t1 = (double)(H0/n);
if (t2 == t1)
{x = 1;}
else { if (He < H0) {if (i == 0) k = k/10;
i = 1; p = p — k;
if (p <= 0) { p = p + k; k = k/10;
p = p — k;
}
}
else { if (i == 1) k = k/10;
p = p + k; i = 0;
}
}
}
return p;
} |
|
** Zor |
Отправлено: 22.03.2007, 03:19 |
|
Не зарегистрирован
|
Кусок кода — явно глубокая бета решения функции методом подгонки
можете все это переписывать заново — чище будет.
t2 = (double)(e2/n); -> глюк, результат все равно (int)
t1 = (double)(e0/n); -> глюк, результатт всегда = 100000
ограничение точности подсчета тоже не задается явно
|
|
|