PDA

نسخه کامل مشاهده نسخه کامل : يك مشكل اساسي با ++c (عزيزان زود جواب بديد كه براي فردا مي خوام)



mhentezari
24-12-2005, 22:36
سلام
آقا من يك متغير float يا double تعريف مي كنم مثل x . بعدش ميگم

x=5/12 . اما pc در جواب اين معادله ساده مي نويسه

x=0 !!!!!!!!!

peyman_joojoo
25-12-2005, 00:04
اگه مقدار ثابتی هست از کانست استفاده کن من که با این مشکا مواجه نشدم

mhentezari
25-12-2005, 00:13
نه ثابت نيست.
اين كل برنامست:

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

int main(void)
{
double x,y; //position of the dot
int cir=0,sqr=0,counter=0;
float result;

do
{
x=(2*rand()/RAND_MAX)-1; //random numbers between [-1,1]
y=(2*rand()/RAND_MAX)-1;

if ( pow(x,2)+pow(y,2) <1) //the dot is in circle and square
{
cir++;
sqr++;
}
else //the dot is just in square
sqr++;
counter++;
}while (counter <=20000000);

result = (cir/sqr)*4;
cout <<result;

getch();
return 0;
}


اگر اين برنامه درست اجرا بشه بايد عدد پي رو بده.
x,y دو عدد بين -1 تا 1 خواهند بود اما توي اينجا هميشه يا صف ميشه يا يك. در واقع با اونها مثل يك int بر خورد ميكنه.

كمك كنيد!!

mhentezari
25-12-2005, 00:15
اما x= 5/12 رو هم كه تست كردم بازم صفر شد!

_LOVE_CODER_
25-12-2005, 00:19
#include <iostream>
#include <conio.h>
#include <math.h>
#include <vector>
using namespace std;

int main(void)
{
double x,y; //position of the dot
int cir=0,sqr=0,counter=0;
float result;

do
{
x=(2*rand()/RAND_MAX)-1; //random numbers between [-1,1]
y=(2*rand()/RAND_MAX)-1;

if ( pow(x,2)+pow(y,2) <1) //the dot is in circle and square
{
cir++;
sqr++;
}
else //the dot is just in square
sqr++;
counter++;
}while (counter <=20000000);

result = (float)cir/sqr*4;
printf("%f\n",result);

getch();
return 0;
}

mhentezari
25-12-2005, 00:44
لطفا با cout بنويسيد نه با printf .ممنون

hamidreza_buddy
25-12-2005, 13:56
خب مشخصه.
ما دو نوع تقسیم داریم.:
1- تقسیم int بر int که حاصل آن حتما یک int است ( 0=5/12 یا 3=10/3)
اگر دقت کردید حاصل جواب فقط خارج قسمت تقسیم است. (یعنی یک عدد صحیح)
2- یک یا دو طرف آن double یا float باشد. که در این صورت حاصل تقسیم به صورت اعشاری و دقیق خواهد بود.

ببینید توی این تقسیم ای ن اتفاق ها می افتد.
1- 5 از نوع int در نظر گرفته می شود.
2- 12 هم از نوع int در نظر گرفته می شود.
3- پی تقسیم از نوع تقسیم int بر int است.
4- پس حاصل صفر می شود.
5- int به float تبدیل می شود و به صورت صفر در float ذخیره می شود.

پس نتیجه صفر است.
ولی اگر این کار را کنی:
float a=5;
float b=12;
float c;
c= a/b;

c در آخر به صورت یک عدد اعشاری ذخیره می شود. c = 0.4166

hamidreza_buddy
25-12-2005, 14:01
برای اینکه مقدار واقعی ذخیره بشه این کارو بکن:

float c;
c = (float)5 / (float) 12;
پس دو طرف را به صورت float ذخیره کرده و حاصل تقسیم بهصورت 0.41666 در c ذخیره می شود.

mhentezari
25-12-2005, 17:20
ممنونم. كارم راه افتاد. البته به روش ديگه.