View Full Version : سوال در رابطه با math.h
storm_saeed
یک شنبه 26 شهریور 1391, 16:56 عصر
درود یه سوالی داشتم میخواستم بدونم مثلا وقتی کتابخانه math.h رو include میکنیم مثلا میخواهیم قدر مطلق یا سینوس یا ... بگیریم تابع قدرمطلق و سینوس و.... در math.h نوشته شده اند یا نه تابع ها رو تو math,h فقط اسمشو نوشته در یک کلاس و در یک فایل مثلا math.cpp این تابع ها نحوه عملکردشون نوشته شده
مچکر
manij_mhm
یک شنبه 26 شهریور 1391, 17:36 عصر
معمولا همانطور که گفتید اینترفیسی رو برای شما فراهم می کنه. و پیاده سازی ان در فایل cpp هست. که بتونه کدها از مخفی بمونه اما ارگومانها و ورودی خروجی و در واقع ساختار کلاس ،متد ها و توابع و مشخص باشه.که راحت تر بشه استفاده نمود.
storm_saeed
یک شنبه 26 شهریور 1391, 18:12 عصر
میشه بگید مثلا تو devc++ فایل math.h تابع هاش در چه فایلی نوشته شده اند (math.h منظورم نیستا امث دات اچ تو پوشه include هست میدونم )
مسعود اقدسی فام
یک شنبه 26 شهریور 1391, 19:42 عصر
میشه بگید مثلا تو devc++ فایل math.h تابع هاش در چه فایلی نوشته شده اند (math.h منظورم نیستا امث دات اچ تو پوشه include هست میدونم )
این کدها لزوما در دسترس نیستن. بعضی ها به صورت obj هستن که کد باینری هستن و کامپایلر ازش اطلاعات رو میخونه. در مورد math.h هم شاید همینطور باشه.
hadi0x7c7
سه شنبه 28 شهریور 1391, 00:19 صبح
توی کتاب Plauger - The Standard C Library همه این کتابخانه ها رو پیاده سازی کرده. اگه مایلی یه نگاه بنداز !
البته اکثرشون با سری توانی محاسبه میشن.
mr AHR
پنج شنبه 30 شهریور 1391, 23:34 عصر
من هم اوایل این سوال برام مطرح بود
شما اگر دستی کامپایل کنی میفهمی
یه برنامه داریم
main.c
int main()
{
PrintHello();
return 0;
}
PrintHello.c
#include <stdio.h>
void PrintHello() {
printf("Hello World!");
};
برای کامپایل اینها رو باید دونه دونه کامپایل کنیم بعد به هم لینک کنیم مگر نه ؟
خوب شما هم اگر جای کامپایلر باشی تو اولیه میگی این PrintHello چیه دیگه و یه ارور تر و تمیز بر میگردونی !
پس برای این که تو main.c به کامپایلر بفهمونیم PrintHello یه جای دیگه تعریف شده و توسط Linker تعریف میشه میایم یه چیزی به اسم Forward Deceleration اول main اضافه میکنیم پس main.c میشه:
void PrintHello();
int main()
{
PrintHello();
return 0;
}
دقت کن که اون Forward Deceleration کاری نمیکرد اصل کار جای دیگست فقط به کامپایلر میگه گیر نده این قراره لینک بشه !
حالا اگر پروژه بزرگتر بشه و ما با 100 تا تابع و 10 تا کلاس و 20 تا ستراکچر سر و کار داشته باشیم !!!
همرو باید اون بالا بذاریم !؟؟؟؟ نه ! شما میای یه فایل درست میکنی و Forward Deceleration هاتو میذاری اونتو بعد هرجایی Include شد انگار محتویات فایلتو اونجا کپی کردی مثلا تو مثال یه فایل داشته باشی به اسم PrintHello.h (این بحث قابل کش دادن هست یک کم از سر و ته بحث هدر ها زدم) :
void PrintHello();
حالا هر وقتی فایل فوق رو Include کنی چی میشه ؟؟؟ آورین ! محتویاتش به عینه تو فایلی که توش Include رو گذاشتی کپی میشه و جای دستور Include قرار میگیره !!!
حالا مراحل کامپایل رو در نظر بیار ... به نظرت نیازی به کامپای هر بارهی PrintHello.c هست ؟ مسلما نه چون تو 100 تا پروژه هم اگر بود تغییرش که نمیدی پس این رو یک بار کامپایل میکنی Forward Deceleration ش رو هم که تو Header File داری غمت نیست ! فقط همین رو لینک میکنی .
این همه قصه گفتم تا به اینجا برسیم math.h یک Header File هست Forward Deceleration ها رو فقط داره و قراره به کامپایلر بگه "این قراره بعدا لینک شه ول کن بیچاررو !" و دست آخر به اون کد های اصلی لینک میشه که از پیش کامپایل شدن . ( ببخشید اینقدر کش دادم )
storm_saeed
جمعه 31 شهریور 1391, 17:06 عصر
واقعا ممنون آموزش خیلی خوبی بود
ببخشید یه سوال دیگه اینارو کامل فهمیدم
خب math.h یه جایی تعریف شده ما وقتی include اش میکنیم داریم به کامپایلر میفهمونیم توابعی که داریم در برنامه مون استفاده میکنیم یکسریشون تو math.h هست مثلا الان من میخوام سینوس بگیرم
من مثلا نمیدونم چطور یک تابع بنویسم که سینوس بگیره میخوام بیام کدای math.h رو بخونم الگوریتمشو یاد بگیرم خب میام تو فایل math.h مثلا سینوس اونجاس
_CRTIMP double __cdecl sin (double);
خب من الات فقط به یکسری کد مشابه بالا برخوردم که اصلا ربطی به کداهای سی پلاس پلاس نداره و یه چیزه گنگی هست برام
ولی جایی رو پیدا نکردم که نحوه ی الگوریتمو سورس تابع سینوسو نشون بده خب این تو کجای کامپایلرم هست (dev c++ هستش )
hadi0x7c7
شنبه 01 مهر 1391, 09:21 صبح
ولی جایی رو پیدا نکردم که نحوه ی الگوریتمو سورس تابع سینوسو نشون بده خب این تو کجای کامپایلرم هست (dev C++ هستش )
توی کتاب Plauger - The Standard C Library همه این کتابخانه ها رو پیاده سازی کرده. اگه مایلی یه نگاه بنداز !
Ananas
دوشنبه 03 مهر 1391, 15:32 عصر
تو یونیت system.pas دلفی تابع سینوس رو به شکل اسمبلی نوشته که من قسمت اسمبلیشو کپی کردم تو c++ درست اجرا میشه :
long double Sinuse( long double x )
{
asm
{
FLD x
FSIN
FWAIT
};
};
برای بقیشونم مشابه همین.
برای محاسبه ی توابعی مثل سینوس لازم نیست از بسط ها استفاده کنید چون cpu خودش این توابع رو محاسبه میکنه سرعتش خیلی بیشتر از نوشتن بسط تیلور یا مکلورن هست.
Ananas
دوشنبه 03 مهر 1391, 16:17 عصر
اینم بقیشون :
long double MQSin( const long double X )
{
asm
{
FLD X
FSIN
FWAIT
};
};
long double MQCos( const long double X )
{
asm
{
FLD X
FCOS
FWAIT
};
};
long double MQTan( const long double X )
{
asm
{
FLD X
FPTAN
FSTP ST(0) // FPTAN pushes 1.0 after result
FWAIT
};
};
long double MQArcSin( const long double X )
{
asm
{
//Result := ArcTan2(X, Sqrt((1+X) * (1-X)))
fld1
fld X
fst st(2)
fmul st(0), st(0)
fsubp
fsqrt
fpatan
};
};
long double MQArcTan2( const long double Y, const long double X )
{
asm
{
//Result := ArcTan2(X, Sqrt((1+X) * (1-X)))
fld1
fld X
fst st(2)
fmul st(0), st(0)
fsubp
fsqrt
fpatan
};
};
long double MQLn( const long double X )
{
asm
{
FLD X
FLDLN2
FXCH
FYL2X
FWAIT
};
};
long double MQExp( const long double X )
{
asm
{
// e**x = 2**(x*log2(e))
FLD X
FLDL2E // y := x*log2e;
FMUL
FLD ST(0) // i := round(y);
FRNDINT
FSUB ST(1), ST // f := y - i;
FXCH ST(1) // z := 2**f
F2XM1
FLD1
FADD
FSCALE // result := z * 2**i
FSTP ST(1)
};
};
البته همرو امتحان نکردم.
این یکی هم نمیدونم چرا ارور میده:
void MQSinCos( long double X, long double & sin_, long double & cos_ )
{
asm
{
FLD X
FSINCOS
FSTP tbyte ptr [edx] // Cos
FSTP tbyte ptr [eax] // Sin
FWAIT
};
};
mr AHR
پنج شنبه 06 مهر 1391, 18:30 عصر
داریم
asm
{
//assembly codes here ...
}
چیزی که داخل {} هست assembly ( یک زبان خیلی سطح پایین ) هست و طبیعیه که من هم خوب متوجه نمیشم ! چون بلد نیستم ! به زبون دیگه ایه !. برای بالا بردن پرفومنس با assembly نوشتن .
IamOverlord
پنج شنبه 06 مهر 1391, 20:53 عصر
سلام.
اون دستورات، Instruction های FPU هستن که یه واحدی در کنار CPU هست (مثل SSE، MMX، ...) که کارش محاسبات Floating Point هست، اول دستوراتش هم F داره که اگه Assembly کار کرده باشی به چشمت خورده احتمالا... این جا رو نگاه کن لیستی از Instruction های FPU رو هم نوشته: en.wikipedia.org/wiki/X86_instruction_listings (http://en.wikipedia.org/wiki/X86_instruction_listings)
حالا اگه FPU که مخفف Floating Point Unit هست نباشه، اون موقع باید زحمت کشید و اون دستورات رو شبیه سازی کرد...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.