# How to compute 1/(2*i)?

Discussion in 'C++' started by Francogrex, Apr 6, 2008.

1. ### FrancogrexGuest

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 . .

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.

Francogrex, Apr 6, 2008

2. ### FrancogrexGuest

On Apr 6, 11:34 am, Francogrex <> wrote:
> 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

Francogrex, Apr 6, 2008

3. ### ciccioGuest

Francogrex wrote:
> On Apr 6, 11:34 am, Francogrex <> wrote:
>> 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

ciccio, Apr 6, 2008
4. ### brian tylerGuest

brian tyler, Apr 6, 2008
5. ### FrancogrexGuest

On Apr 6, 11:53 am, Alan Johnson <> wrote:
> > 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.

>
> 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.

Francogrex, Apr 6, 2008
6. ### stanGuest

Francogrex wrote:
> On Apr 6, 11:34 am, Francogrex <> wrote:
>> 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 = ....
}

stan, Apr 7, 2008