PDA

View Full Version : سوال: محاسبه یک رادیکال تو در تو با عمل جمع



atoorpatkan
دوشنبه 25 اردیبهشت 1391, 14:01 عصر
سلام دوستان.کسی میتونه در باره کد این برنامه چه به صورت بازگشتی و چه به صورت غیر بازگشتی کمکی کنه.
با گرفتن مقدار n حاصل عبارت 87065 را محاسبه و چاپ کنه. مرسی

Ananas
سه شنبه 26 اردیبهشت 1391, 00:05 صبح
سلام.
این تابع برای اعداد غیر صفر تعریف نشده و
برای 0 مقدار 0 و
برای 1 مقدار بینهایت و
برای 2 مقدار 2 رو بر می گردونه.
چون تابع به شکلی هست که تا بینهایت مرحله ادامه داره ما فقط حلقمون رو تا جایی پیش می ریم که دیگه جواب تو هر مرحله با مرحله ی قبل تفاوت چندانی نکنه یعنی تا وقتی که :
رادیکال(n + y) تقریبا برابر بشه با y
حلقه ادامه پیدا میکنه و یا بهتر بگم خطای محاسبه کوچک تر بشه از مثلا 0.000000000000000001
این کد :

#include <tchar.h>
#include <stdio.h>

#include <math.h>
#include <iostream>
using namespace std;

long double SqrtAddSqrt(const long double X)
{
if (X <= 0)
{
return 0;
}
if (X == 1.0L) {
return (1.0L / 0.0L);
}
long double y = -1.0, out = sqrtl(X);

while (fabsl(y - out) > 0.00000000000000001L)
{
y = out;
out = sqrtl(X + out);
cout << out << " " << y << "\n";
}
return out;
}

int _tmain(int argc, _TCHAR* argv[])
{
cout << SqrtAddSqrt(5.0L) << "\n";
getchar();
return 0;
}

Ananas
سه شنبه 26 اردیبهشت 1391, 08:52 صبح
یه جواب بهتر و شسته رفته تر فرمول زیره که نتیجش همون فرمول قبلیه :
sqrtl(X + 0.25L) + 0.5L
برای ورودی 1 هم اشتباه کردم بینهایت نمیشه کد رو اصلاح کردم.
الان دو تا فرمول رو با هم مقایسه میکنیم :
#include <tchar.h>
#include <stdio.h>

#include <math.h>
#include <iostream>
using namespace std;

long double SqrtAddSqrt(const long double X)
{
if (X <= 0)
{
return 0;
}
long double y = -1.0, out = sqrtl(X);

while (fabsl(y - out) > 0.00000000000000001L)
{
y = out;
out = sqrtl(X + out);
cout << out << " " << y << "\n";
}
return out;
}

long double SqrtAddSqrt_2(const long double X)
{
//return (1.0L + sqrtl(1.0L + 4.0L * X)) / 2.0L;
return sqrtl(X + 0.25L) + 0.5L;
}

int _tmain(int argc, _TCHAR* argv[])
{
long double x = 1.0L;
cout << "formul 1 : " << SqrtAddSqrt(x) << "\n\n";
cout << "formul 2 : " << SqrtAddSqrt_2(x) << "\n";
getchar();
return 0;
}
/*
y = sqrt(x + y)
y^2 - y = x
y (y - 1) = x
y^2 - y - x = 0

1 +- sqrt(1 + 4x)
y = ------------------
2
*/

atoorpatkan
سه شنبه 26 اردیبهشت 1391, 13:22 عصر
مرسی دوست عزیز.کمک زیادی کردی اما وقتی کامپایل میکنم تو خط 31 خطا میده. میگه علامت { کم داره.در حالی که واقعا کم نداره.من واقعا موندم چرا خطا میده.:متعجب:

Ananas
سه شنبه 26 اردیبهشت 1391, 14:47 عصر
شاید بخاطر /**/ هست مطمئنی کامل بستیش؟ مثلا فقط /* باشه خطا میده باید بعدش */ هم باشه. نمیدونم تو پشت فرمونی ببین چطور درستش میکنی اگه { کم داره براش بگذار.