Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > How to compute 1/(2*i)?

Reply
Thread Tools

How to compute 1/(2*i)?

 
 
Francogrex
Guest
Posts: n/a
 
      04-06-2008
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<{
u[0]=1;
i=i+1;
u[i]=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
cout <<"Iteration " <<i<<" is: "<<u[i]<<"\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.
 
Reply With Quote
 
 
 
 
Francogrex
Guest
Posts: n/a
 
      04-06-2008
On Apr 6, 11:34*am, Francogrex <(E-Mail Removed)> 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<{
> u[0]=1;
> i=i+1;
> u[i]=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
> cout <<"Iteration " <<i<<" is: "<<u[i]<<"\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
 
Reply With Quote
 
 
 
 
ciccio
Guest
Posts: n/a
 
      04-06-2008
Francogrex wrote:
> On Apr 6, 11:34 am, Francogrex <(E-Mail Removed)> 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<{
>> u[0]=1;
>> i=i+1;
>> u[i]=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
>> cout <<"Iteration " <<i<<" is: "<<u[i]<<"\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[i]=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
Should be
u[i] = 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
 
Reply With Quote
 
brian tyler
Guest
Posts: n/a
 
      04-06-2008
> 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


It would be stranger if it didn't. These pages might help you
understand exactly what is going on
http://c.comsci.us/etymology/literals.html
http://en.wikipedia.org/wiki/Divisio...on_of_integers

Brian

 
Reply With Quote
 
Francogrex
Guest
Posts: n/a
 
      04-06-2008
On Apr 6, 11:53*am, Alan Johnson <(E-Mail Removed)> 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.
 
Reply With Quote
 
stan
Guest
Posts: n/a
 
      04-07-2008
Francogrex wrote:
> On Apr 6, 11:34*am, Francogrex <(E-Mail Removed)> 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<{
>> u[0]=1;
>> i=i+1;
>> u[i]=u[i-1]*((1-(1/(2*i)))/(1+(x*x)));
>> cout <<"Iteration " <<i<<" is: "<<u[i]<<"\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[i] = ....
}
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
FAQ 4.43 How do I compute the difference of two arrays? How do I compute the intersection of two arrays? PerlFAQ Server Perl Misc 0 02-02-2011 05:00 AM
System.Web.HttpException: Cannot compute Count for a data source t =?Utf-8?B?UGF0cmljay5PLklnZQ==?= ASP .Net 4 11-05-2004 02:00 AM
Problem using COMPUTE with SPROC on ASP Application =?Utf-8?B?c2tpcmtieQ==?= ASP .Net 1 11-01-2004 12:55 PM
How to compute 2^N in VHDL? Fabio G. VHDL 3 05-31-2004 06:55 PM



Advertisments