How to compute 1/(2*i)?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Francogrex

    How to compute 1/(2*i)?

    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[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.
  • Alan Johnson

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

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

    --
    Alan Johnson

    Comment

    • Francogrex

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

      On Apr 6, 11:34 am, Francogrex <fra...@grex.or gwrote:
      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[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

      Comment

      • ciccio

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

        Francogrex wrote:
        On Apr 6, 11:34 am, Francogrex <fra...@grex.or gwrote:
        >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[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

        Comment

        • brian tyler

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

          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



          Brian

          Comment

          • Francogrex

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

            On Apr 6, 11:53 am, Alan Johnson <aw...@yahoo.co mwrote:
            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.

            Comment

            • stan

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

              Francogrex wrote:
              On Apr 6, 11:34 am, Francogrex <fra...@grex.or gwrote:
              >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[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] = ....
              }

              Comment

              Working...