الگوریتم محاسبه لگاریتم؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

الگوریتم محاسبه لگاریتم؟

+1 امتیاز

سلام , الگوریتم محاسبه لگاریتم رو می خوام و یه طوری باشه که برای هر پایه لگاریتم جواب بده ؟

 

سوال شده تیر 7, 1393  بوسیله ی daniyaltjm (امتیاز 840)   47 88 103

2 پاسخ

+1 امتیاز

الگوریتم:تا جایی که جا داره اون عدد رو تقسیم بر مبناش کنه(تا اون جایی که جا داره هم ینی تا جایی که اون عدد از مبنای خودش کوچیکتر بشه)

اینم شبه کدش:

while(b > a){
   b = b/a;
   s++;
}
print ---- > s+1;

 

پاسخ داده شده تیر 8, 1393 بوسیله ی senator77 (امتیاز 226)   5 14 25
این بهترین الگوریتمه؟
نه راه های سریع تری مخصوصا برای پیدا کردن لگاریتم در مبنا 2 وجود داره
http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn
+3 امتیاز

سلام!

در این مثال ابتدا تابع ln با استفاده از بسط Taylor تابع (ln(x+1 اطراف ۰، موسوم به Mercator Series یا Newton-Mercator Series محاسبه می شه:

 

Mercator series

 

 

 

 

 

که در این برنامه ۱۰۰۰ جمله ی اول محاسبه می شه. هر چه جملات بیش تر و بیش تری محاسبه بشه، خطا کم تر و کم تر می شه...

برای مقادیر بزرگ تر ۱ از این رابطه استفاده شده:

 

 

 

... بعد تابع log در هر مبنای دیگه ای با توجه به این رابطه پیاده سازی می شه:

 





#include <iostream>
#include <cmath>

using namespace std;

double my_ln(double x)
{
	if (x == 1) return 0;
	double s = 0;
	if (abs(-1 + x) < 1)
	{
		for (int k = 1; k <= 1000; k++)
			s += pow(-1, k) * pow(-1 + x, k) / k;
		return -s;
	} else return -my_ln(1 / x);
}

double my_log(double x, double base)
{
	return my_ln(x) / my_ln(base);
}

int main()
{
	cout << "x = "; double x; cin >> x;
	cout << "ln(x) = " << my_ln(x) << endl;
	return 0;
}

 

پاسخ داده شده مرداد 6, 1393 بوسیله ی مسعود لپه‌چی (امتیاز 928)   12 31 50
...