PDA

View Full Version : محاسبه فرجه n ام عدد m تا x رقم



onimao
سه شنبه 06 دی 1390, 21:59 عصر
سلام ....
ببخشید یه الگویتم خوب و تمیز برای محاسبه ی فرجه n ام عدد m تا x رقم را می خواستم .
ممنون

onimao
چهارشنبه 07 دی 1390, 13:05 عصر
آقا هیشکی هیچی به ذهنش نمی رسه ؟؟؟ جان من یکی یچی بگه دیگه

pe32_64
چهارشنبه 07 دی 1390, 14:16 عصر
مشکل حل شد
نکته: این برنامه تا 7 رقم اعشار(حداکثر تا 7 رقم اعشار در float ) محاسبه می کند. برا کمتر کردن دقت ،تغییرات لازم رو بدید.

float getroot(int n,int m)
{
CHAR b[9+3];
float ret = 0;
if(n%2 == 0 && m<=0)
return 0;
ret = powf(2.71828f,(logf(fabs((float)m))/n));
if(m<0)
ret*=-1;
sprintf(b,"%9.7f",ret);
return (float) atof(b);
}


ابتدا طبق فرمول :pow(e,(ln(m)/n))
ریشه بدست میاد وبعد با sprintf ،دقت لازم اعمال میشه.
برای اعمال دقت اگه راه بهتری هست ، بگید تا بدونیم.
این تابع هم خودم با محاسبات ساده ی لگاریتمی بهش رسیدم (یعنی جایی دنبالش نگشتم،خودم بهش رسیدم)

onimao
چهارشنبه 07 دی 1390, 21:39 عصر
دست شما درد نکنه .... اما من تازه اول دبیرستانم .. لگاریتم نمی دونم چیه و محاسباتش چطوریه ....
می خواستم ببینم هیچ راه ساده تری نیست ؟
یه راه جالب و مبتکرانه ....

pe32_64
پنج شنبه 08 دی 1390, 18:15 عصر
من سوادم به یک راه بهتر از این نمی رسه
اگه شما راه اسانتری پیداکردی واسه ما هم بگو
البته ممکنه راههای ساده تری هم باشه،ولی ممکنه محاسبات بیشتری رو بطلبه

kitten
جمعه 09 دی 1390, 03:11 صبح
double NthRoot(double m_nValue, double index, double guess, double pc)
{
double result = guess;
double result_next;
do
{
result_next = (1.0/index)*((index-1.0)*result+(m_nValue)/(pow(result,(index-1.0))));
result = result_next;
pc--;
}while(pc>1);
return result;
}
این تایع رو می تونید استفاده کنید که خیلی خوبه
این هم لینک توضیحاتش از ویکی پدیا:
http://en.wikipedia.org/wiki/Nth_root_algorithm
و این هم لینک سایت اصلی:
http://rosettacode.org/wiki/Nth_root#C.2B.2B

pe32_64
جمعه 09 دی 1390, 12:31 عصر
جناب kitten ، (http://barnamenevis.org/member.php?48596-kitten)ممنون از مطالبی که گذاشتید.


For large n, the nth root algorithm is somewhat less efficient since it requires the computation of http://upload.wikimedia.org/wikipedia/en/math/9/e/0/9e0cc1c786a9828068d773156a4c15d3.png at each step, but can be efficiently implemented with a good exponentiation (http://en.wikipedia.org/wiki/Exponentiation) algorithm.

من رفتم مطالب سایت http://en.wikipedia.org/wiki/Nth_root_algorithm رو خوندم که مفید بود،ولی در آخرش گفته بود که باید برای ریشه های بزرگ از یک تابع نمایی استفاده کرد که خودم به دست اورده بودم!

onimao
جمعه 09 دی 1390, 15:01 عصر
double NthRoot(double m_nValue, double index, double guess, double pc)
{
double result = guess;
double result_next;
do
{
result_next = (1.0/index)*((index-1.0)*result+(m_nValue)/(pow(result,(index-1.0))));
result = result_next;
pc--;
}while(pc>1);
return result;
}
این تایع رو می تونید استفاده کنید که خیلی خوبه
این هم لینک توضیحاتش از ویکی پدیا:
http://en.wikipedia.org/wiki/Nth_root_algorithm
و این هم لینک سایت اصلی:
http://rosettacode.org/wiki/Nth_root#C.2B.2B

ببخشید میشه آرگومان های تابع رو یه توضیح کوچیک بدین ؟
ممنون میشم