الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الدوال المثلثيه

بدأه C++er في 17 أغسطس 2008 · 8 رد · 3,734 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

فكرت كثيرا عن كيفية تضمين الدوال المثليه مثل sin , cos and tan و ايضا دالة الجذر التربيعى و الأسس داخل الـ c++

بالنسبه للدوال المثلثيه و خصوصا الداله sine

بحثت على الإنترنت فوجدت من يقول انه بإستخدام الــ lookup table او بإستخدام for-loop

و من الأكواد التى وجدتها للداله sin التالى

double mysin1(double x)
{
double numerator = x;
double denominator = 1.0;
double sign = 1.0;
double sin = 0;

 // terms below define the number of terms you want
 int terms=10;

 for ( int i = 1; i <= terms; i++ )
 {
  sin += numerator / denominator * sign;
  numerator *= x * x;
  denominator *= i*2 * (i*2+1);
  sign *= -1;
 }
return sin;
}

عندما جربته لم يعطى نتائج سليمه مع كل الزاويا، لذا حاولت تضمينه بشكل اخر و هو كتابة داله للداله cos و من خلالها استدعاء الدالة sin بكود اخر و هو التالى

ملحوظه : (لمن لا يعرف) الدوال المثلثيه يمكن تضمينها كالتالى

sin (theta) = (PI / 2) - theta
cos(theta) = (PI / 2) - theta

const double PI = 3.14159265358979323846;

double mycos1(double x)
{
	double numerator = 1.0;
	double denominator = 1.0;
	double sign = 1.0;
	double cos = 0;

	// terms below define the number of terms you want
	int terms = 10;

	for ( int i = 1; i <= terms; i++ )
	{
		cos += numerator / denominator * sign;
		sign *= -1;
		numerator *= x * x;
		denominator *= (i*2-1) * i*2;
	}

	return cos;
}

double mysin2(double x)
{
	return mycos1((PI/2) - x);
}

بالنسبه للداله mysin2 اعطت نتائج سليمه اما الداله mycos فليست كل نتائجها سليمه، لذا قمت بتضمينها مره اخرى بإستخدام المعاداله الذكوره بالأعلى كالتالى

double mycos2(double x)
{
	return mysin1((PI/2) - x);
}

هذه المره اعطت نتائج سليمه، ما ادهشنى هو ان كل من الدالتين mysin1 و mycos1 ليست كل نتائجهم سليمه فى حين ان الدالتين mysin2 و mycos2 يعطوا نتائج سليمه.

طبعا لا اعتقد ان الدالتين sinf و cosf الموجودين فى math.h تم تضمينهم على مرحلتين لذا فسؤالى الأول هو : ما هو الكود المستخدم للدالتين sin , cos?

سؤالى الثانى متعلق بدالة الأس و الجذر التربيعى

اما بالنسبه لدالة الأس فهى سهله

double Power(int pwr,double number)
{
	double sum=1;

	for(int i=1; i<=pwr; i++)
		sum *= number;
}

اما بالنسبه لدالة الجذر التربيعى فقد وجدت بعض الطرق اليدويه للحصول على الجذر التربيعى و لكنى لم استطع تطبيق اى منها. لذا فسؤالى الثانى هو: ما هو الكود المستخدم لدالة الجذر التربيعى؟

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#2

يتم ذلك عن طريق استخدام تعليمات معالج الـFPU ,, هذا المقال يشرح الموضوع عن طريق عمل reversing لأكواد الـ++C بعد ترجمتها :

http://programmers-corner.com/viewTutorial.php/31

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

اصدقاء الـــ Games سبقونا فى الموضوع

اخى Game Expert ... انا كنت اريد حل مشكلة Fractional Exponent يدويا و لكنى لم استطع و لكن اثناء البحث وجدت بعض المواقع التى قد تفيد .....

راجع هذا الرابط لا اجد حل لــ Power هذا موضوع كنت فتحته فى منتدى الرياضيات و الحمد لله توصلت للحل .. المشاركتين 12 - 14 يحتويان على الحل

تم تعديل هذه المشاركة بواسطة Omar Eladel في 17 أغسطس 2008 في 09:17

#4

جارى قراءة الموضوع

تم تعديل هذه المشاركة بواسطة Game Expert في 17 أغسطس 2008 في 09:34

مدونتي: C++ Tips and Tricks

#5

السلام عليكم

هذا كود لا يجاد الجذر النوني لكن يحتوي على تقريب جربه؟

#include <cstdlib>
#include <iostream>
using namespace std;
double  m_power(double a,int n){ return (n>0)? a*m_power(a,n-1):1; }
double m_sqr(double num,int s)
{
double t=1;       
while(m_power(t,s) <=num)
t+=0.00001;/*الدقه المطلوبه*/
return t;       
}


int main(int argc, char *argv[])
{    

    double a; int n=3;
    while(a!=0 && cin>>a && cout<<m_sqr(a,n)<<endl);

    system("PAUSE");
    return EXIT_SUCCESS;
}
tvquran_6.gif

#6

كل هذه الدوال يمكن حلها باستخدام Numerical Analysis (التحليل العددي) و هي خوارزميات لحل المسائل الرياضية المتصلة Continuous Mathematics على سبيل المثال

- التفاضل Differential Calculus

- التكامل Integral Calculus

- الجذور Roots

- المصفوفات Matrices

- الInterpolation و الExtrapolation و الRegression

و غيرها من المسائل و تعتمد في الأساس على تقريب المسائل باستخدام series (متسلسلات) أو عمليات Recursive و الحصول على الحل الأمثل ان امكن أو حل قريب بنسبة خطأ يتم التحكم في دقتها

و من أشهر هذه الخوارزميات

Newton Method لايجاد الجذور أو Gaussian Elimination لحل المصفوفات أو Jacobian Method لحل المصفوفات بطريقة Recursive

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#7

قمت بتنفيــذ برنامج لحساب دالة root بالطريقة المذكورة فى مشاركة #12 (Iterative calculation of an nth root)

هذا هو الكود

اى مشكلة فيه ... قل بس و كلنا تحت امر السائل :happy:

  1.  
  2. #include<iostream>
  3. using namespace std; //function prototype
  4. long double root(float ,float); //function prototype
  5. long double exponent(long double, int); //function prototype
  6.  
  7. //main function
  8. int main()
  9. {
  10. float base;
  11. float exp;
  12. cout << "Enter base: ";
  13. cin >> base;
  14. cout << "Enter fractional exponent (1/x): 1/ ";
  15. cin >> exp;
  16. long double sol = root(base,exp); //applying root function
  17. cout << exp << "nth root of " << base << " is: " << sol << endl;
  18. system("pause");
  19. return 0;
  20. }
  21.  
  22. //exponent function needed for calculating root
  23. long double exponent(long double base, int power)
  24. {
  25. long double base2 = base;
  26.  
  27. for (int counter=1; counter < power; counter++)
  28. {
  29. base *= base2;
  30. }
  31. return base;
  32. }
  33.  
  34. //root function
  35. long double root(float base, float exp)
  36. {
  37. long double x = 1;
  38. for (int i=1; i<= 900000; i++) //loop for iteration
  39. {
  40. x = (1/exp)*(((exp-1)*x)+(base /exponent(x,exp-1))); //applying (Iterative calculation
    of an nth root)
  41. }
  42. return x;
  43. }
  44.  

الكود كامل فى المرفقات

root_calc.rar

#8

يمكن إيجاد الجذر النونى لأى رقم او أى رقم مرفوعا لأى أس عن طريق استخدام اللوغارتم و مقلوبه كالتالى

#include <iostream>
#include <math.h>

using namespace std;

double aLog10(double num);
double Power(double base,double exp);
double root(double base, double exp);

#define PRNT(DATA)   \
				   cout << #DATA << " = " << DATA << endl;

void main()
{
	PRNT(Power(16 , 0.5));	// Power(16 , 0.5) = 4
	PRNT(root(9 , 0.5));		 //  root(9 , 0.5)=81

	PRNT(Power(6,2));  // Power(6,2) = 36
	PRNT(root(8,3));	 //  root(8,3) = 2
}

double aLog10(double num)
{
	return pow(10,num);
}

double Power(double base,double exp)
{
   return aLog(Log10(base) * exp);
}

double root(double base,double exp)
{
   return aLog(Log10(base) / exp);
}

راجع هذا الرابط Ask Dr. Math

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#9

غريب ان احد لم يذكر متسلسلة ماكلروين ..

اخي لحساب الدوال المثلثية تستطيع باستخدام متسلسلة ماكلروين لوجود تقريب لحلول الدوال المثلثية .

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

مواضيع مشابهة