PDA

View Full Version : درخواست کمک برای اعداد اعشاری بزرگ



abbas4833
شنبه 20 شهریور 1389, 19:44 عصر
سلام به همه
یه پروژه الکترونیک دارم که باید از معادله درجه 4 با ضرایب زیر استفاده کنم ولی هر کاری میکنم جواب نمیده فکر کنم متغیرها را اشتباه تعریف میکنم لطفا راهنمائی کنید



char buffer[200];
float Vout,y;
float f1,f2,f3,f4,a,b,c,d,h;
Vout=0.245;
f4=Vout*Vout*Vout*Vout;
f3=Vout*Vout*Vout;
f2=Vout*Vout;
f1=Vout;
a=72.7067965413e-9;
b=-59.4127406002e-6;
c=15.0162146142e-3;
d=1.90775290433;
h=-14.2121622468;
y=((a*f4)+(b*f3)+(c*f2)+(d*f1)+(h))*1000;





مثلا اینجا باید با Vout=0.245جواب در حدود 800 بده ولی 468 میده

Salar Ashgi
شنبه 20 شهریور 1389, 22:09 عصر
میخواین معادله درجه 4 رو حل کنید ؟!
اولا رنج اعداد اعشاری که انتخاب کرده اید از float زیاد تر است ، ثانیا مقداردهی متغیرها بصورت نماد علمی
زیاد صحیح نیست ! بهتر است اون کاری که میخواین انجام بدید رو دقیق تر مطرح کنید ، تا بهتر راهنمایی
بشید !

موفق باشید ./

abbas4833
شنبه 20 شهریور 1389, 23:04 عصر
نمیخوام معادله درجه 4 حل کنم فقط ضریب vout که از بیرون می آیدبجای متغیر های X^4,X^3,....بیاید و ضرایب a , b , c , d , h هم که بدست آورده ایم درآنها ضرب شود و درنهایت جواب معادله بدست آید

Salar Ashgi
یک شنبه 21 شهریور 1389, 21:11 عصر
در هرحال برای تمام متغیرها در تمام زبانهای برنامه نویسی یک محدوده مشخصی است ، اگه نیاز به Range
بیشتری دارید ، باید خودتان دست به کار شده و کلاس اعداد بزرگ را پیاده سازی کنید ./

Saeed_m_Farid
دوشنبه 22 شهریور 1389, 09:27 صبح
... اولا رنج اعداد اعشاری که انتخاب کرده اید از float زیاد تر است
آقا سالار کجاش زیاده؟ تا اونجایی که من میدونم float چهار بایت هست و Range اش از -3.4E38 تا +3.4E38 هست، اینا که خیلی عددهای کوچکی هستند


اینجا باید با Vout=0.245 جواب در حدود 800 بده ولی 468 میده
چطوری 800 باید بده!!! اعداد شما بسیار کوچک هستند و فقط ضریب آخری (یعنی h) با مقدار منفی همه چی رو منفی میکنه :


equation : y = a * X^4 + b * X^3 + c * X^2 + d * X + h
****************
a = 72.7067965413e-9 = 0.0000000727067965413
b = -59.4127406002e-6 = -0.0000594127406002;
c = 15.0162146142e-3 = 0.0150162146142;
d = 1.90775290433 ;
h = -14.2121622468;
X = 0.245
y = 0.0000000727067965413 * (0.245 ^ 4) - 0.0000594127406002 * (0.245 ^ 3) + 0.0150162146142 * (0.245 ^ 2) + 1.90775290433 * (0.245) - 14.2121622468
y = 0.0000000727067965413 * (0.003603000625) - 0.0000594127406002 * (0.014706125) + 0.0150162146142 * (0.060025) + 1.90775290433 * (0.245) - 14.2121622468
y = 0.0000000002619626333800517383125 - 0.000000873731189859116225 + 0.000901348282217355 + 0.46739946156085 - 14.2121622468
****************
y = -13.743862310426159870736173261688

Saeed_m_Farid
دوشنبه 22 شهریور 1389, 10:03 صبح
برنامه هم دقیقاً همین مقدار منفی (البته با ضریب 1000) رو برمیگردونه:

#include <conio>
int main()
{
float y,Vout,
f1,f2,f3,f4,a,b,c,d,h;
Vout=0.245;
f1=Vout;
f2=f1*Vout;
f3=f2*Vout;
f4=f3*Vout;
a = 72.7067965413e-9;
b = -59.4127406002e-6;
c = 15.0162146142e-3;
d = 1.90775290433;
h = -14.2121622468;
y = (a*f4 + b*f3 + c*f2 + d*f1 + h )*1000;
cprintf("%f", y);
getch();
}


خروجی = -13743.862305
http://www.barnamenevis.org/forum/attachment.php?attachmentid=56202&stc=1&d=1284357986

Salar Ashgi
دوشنبه 22 شهریور 1389, 13:42 عصر
آقا سالار کجاش زیاده؟ تا اونجایی که من میدونم float چهار بایت هست و Range اش از -3.4E38 تا +3.4E38 هست، اینا که خیلی عددهای کوچکی هستند

دوست عزیز ، منظورم خود عدد نیست ، تعداد ارقام اعشار هستش که اگه بخواید بالای 10 - 12 رقم اعشار
باشه در محدوده Float ,Double نخواهد گنجید ./

Saeed_m_Farid
سه شنبه 23 شهریور 1389, 09:40 صبح
دوست عزیز ، منظورم خود عدد نیست ، تعداد ارقام اعشار هستش که اگه بخواید بالای 10 - 12 رقم اعشار
باشه در محدوده Float ,Double نخواهد گنجید ./
شما Range فرمودید، بنده اون نمونه آوردم.
در مورد قسمت fraction هم تو استاندارد IEEE 754 (http://steve.hollasch.net/cgindex/coding/ieeefloat.html) تا 52 بیت در نوع Double به قسمت fraction اختصاص داده شده که عدد کوچکی نیست (4503599627370496).
من Double رو برای عدد پی امتحان کردم همونطورکه استاندارد گفته تا 15 رقم اعشار درست بود : 3.141592653589793 بقیه اش چرت و پرت بود.
البته برای نوع float تا 23 بیت (8388608) پیش بینی شده که همونطورکه شما فرمودین، جوابگوی مثال abbas4833 نیست.

abbas4833
سه شنبه 23 شهریور 1389, 17:24 عصر
ممنون از کمک همه دوستان من اشتباها245 را 245/0 تایپ کرده بودم و جواب با 245 حدود 800 می شود