How to compute 1/(2*i)?

F

Francogrex

Hi, I have a problem with this very simple program:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
double n=16;
double t=2.78;
double x;
x=(t/sqrt(n));
int i=0;
double u[9];
while(i<8){
u[0]=1;
i=i+1;
u=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
cout <<"Iteration " <<i<<" is: "<<u<<"\n";
}
system("PAUSE");
return 0;
}

OUTPUT IS:
Iteration 1 is: 0.674297
Iteration 2 is: 0.454677
Iteration 3 is: 0.306588
Iteration 4 is: 0.206731
Iteration 5 is: 0.139398
Iteration 6 is: 0.093996
Iteration 7 is: 0.0633812
Iteration 8 is: 0.0427378
Press any key to continue . .

But the output should read:
0.337148733
0.170503902
0.095808624
0.056528074
0.034305063
0.021204166
0.013276636
0.008392877

the problem is that C++ is not doing this calculation 1/(2*i)
correctly. Is there a way to force him to do this division other than
using the brackets? Thanks.
 
F

Francogrex

Hi, I have a problem with this very simple program:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
double n=16;
double t=2.78;
double x;
x=(t/sqrt(n));
int i=0;
double u[9];
while(i<8){
u[0]=1;
i=i+1;
u=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
cout <<"Iteration " <<i<<" is: "<<u<<"\n";}

system("PAUSE");
return 0;

}

OUTPUT IS:
Iteration 1 is: 0.674297
Iteration 2 is: 0.454677
Iteration 3 is: 0.306588
Iteration 4 is: 0.206731
Iteration 5 is: 0.139398
Iteration 6 is: 0.093996
Iteration 7 is: 0.0633812
Iteration 8 is: 0.0427378
Press any key to continue . .

But the output should read:
0.337148733
0.170503902
0.095808624
0.056528074
0.034305063
0.021204166
0.013276636
0.008392877

the problem is that C++ is not doing this calculation 1/(2*i)
correctly. Is there a way to force him to do this division other than
using the brackets? Thanks.


ok i figured it out: if it's written 1.0/(2.0*i) it works. strange
that you have to specify the points after the values, so by default c+
+ considers them as integers
 
C

ciccio

Francogrex said:
Hi, I have a problem with this very simple program:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
double n=16;
double t=2.78;
double x;
x=(t/sqrt(n));
int i=0;
double u[9];
while(i<8){
u[0]=1;
i=i+1;
u=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
cout <<"Iteration " <<i<<" is: "<<u<<"\n";}

system("PAUSE");
return 0;

}

OUTPUT IS:
Iteration 1 is: 0.674297
Iteration 2 is: 0.454677
Iteration 3 is: 0.306588
Iteration 4 is: 0.206731
Iteration 5 is: 0.139398
Iteration 6 is: 0.093996
Iteration 7 is: 0.0633812
Iteration 8 is: 0.0427378
Press any key to continue . .

But the output should read:
0.337148733
0.170503902
0.095808624
0.056528074
0.034305063
0.021204166
0.013276636
0.008392877

the problem is that C++ is not doing this calculation 1/(2*i)
correctly. Is there a way to force him to do this division other than
using the brackets? Thanks.


ok i figured it out: if it's written 1.0/(2.0*i) it works. strange
that you have to specify the points after the values, so by default c+
+ considers them as integers


Yep,

And if you really want to get rid of the brackets, you type

0.5/i

The line you have
u=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
Should be
u = u[i-1]*(1.0-0.5/i)/(1.0+x*x);

If you work with floats or doubles, always define your constants as
floats or doubles, even if they can be represented as an integer.

The problem with yours was that 1/(2*i) = 0 (integer devisions)

Regards
 
F

Francogrex

1 and 2 are int literals, and i is defined as an int, so the expression
1/(2*i) performs integer division.  The easiest way to force floating
point division is to make one of your literals a floating point number.
That is: 1/(2.*i)

Hi thanks all. I just figured it out right after I posted. Sometimes
it's worthwhile that I try and be patient before I post.
 
S

stan

Francogrex said:
Hi, I have a problem with this very simple program:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
double n=16;
double t=2.78;
double x;
x=(t/sqrt(n));
int i=0;
double u[9];
while(i<8){
u[0]=1;
i=i+1;
u=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
cout <<"Iteration " <<i<<" is: "<<u<<"\n";}

system("PAUSE");
return 0;

}

OUTPUT IS:
Iteration 1 is: 0.674297
Iteration 2 is: 0.454677
Iteration 3 is: 0.306588
Iteration 4 is: 0.206731
Iteration 5 is: 0.139398
Iteration 6 is: 0.093996
Iteration 7 is: 0.0633812
Iteration 8 is: 0.0427378
Press any key to continue . .

But the output should read:
0.337148733
0.170503902
0.095808624
0.056528074
0.034305063
0.021204166
0.013276636
0.008392877

the problem is that C++ is not doing this calculation 1/(2*i)
correctly. Is there a way to force him to do this division other than
using the brackets? Thanks.


ok i figured it out: if it's written 1.0/(2.0*i) it works. strange
that you have to specify the points after the values, so by default c+
+ considers them as integers


You do know that you can/should also move u[0]=1; outside the loop?
Further, you can precalculate the denminator (1+(x*x)) since x isn't
modified in the loop. It's probably more typical to see this type of
thing written as a for loop vice a while.

for (int i=0; i<9; ++i) {
u = ....
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top