Help: datatypes...

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

    #1

    Help: datatypes...

    I am writing a program where I have a subroutine which adds up a number,
    basically something like this;



    int myNumber;

    void add(int i){
    myNumber=myNumb er+i;
    }



    So everytime "add" is called myNumber increases.

    My problem is that myNumber is "reset" or is definet as "infinity", even
    though the number is not too large for the datatype used.
    I have tried with a couple of different datatypes.
    First I defined all my numbers as "double" since I don't only add integers.
    But when myNumber is about 6000 it is suddenly set to #INF the next time it
    increases.
    I have also tried to define the numbers as pure integers ("long"), but now
    the number is reset to 0 a little after it passes 600,000.

    Both the 'double' and the 'long' datatypes should be able to handle larger
    numbers than this. I am using Microsoft Developer Studio 97, on a Pentium 4
    PC.

    Can somebody tell me what my problem is and what I should do to be able to
    add up more numbers?

    Thanks...


  • Ian Collins

    #2
    Re: Help: datatypes...

    Dala Dahlgren wrote:
    I am writing a program where I have a subroutine which adds up a number,
    basically something like this;
    >
    >
    >
    int myNumber;
    >
    void add(int i){
    myNumber=myNumb er+i;
    }
    >
    >
    >
    So everytime "add" is called myNumber increases.
    >
    My problem is that myNumber is "reset" or is definet as "infinity", even
    though the number is not too large for the datatype used.
    I have tried with a couple of different datatypes.
    First I defined all my numbers as "double" since I don't only add integers.
    But when myNumber is about 6000 it is suddenly set to #INF the next time it
    increases.
    I have also tried to define the numbers as pure integers ("long"), but now
    the number is reset to 0 a little after it passes 600,000.
    >
    Both the 'double' and the 'long' datatypes should be able to handle larger
    numbers than this. I am using Microsoft Developer Studio 97, on a Pentium 4
    PC.
    >
    Can somebody tell me what my problem is and what I should do to be able to
    add up more numbers?
    >
    Only if you post a small compilable example that demonstrates your
    problem. Otherwise all people can do is guess. Building the example
    code may show you the cause.

    --
    Ian Collins.

    Comment

    • Salt_Peter

      #3
      Re: Help: datatypes...


      Dala Dahlgren wrote:
      I am writing a program where I have a subroutine which adds up a number,
      basically something like this;
      >
      >
      >
      int myNumber;
      >
      void add(int i){
      myNumber=myNumb er+i;
      }
      >
      >
      >
      So everytime "add" is called myNumber increases.
      >
      My problem is that myNumber is "reset" or is definet as "infinity", even
      though the number is not too large for the datatype used.
      I'm not getting the same behaviour. Can you maybe show how you are
      calling the function. We can only guess at what value is passed to the
      function. Are you sure you aren't invoking a factorial?
      Also, is myNumber initialized before use. See below.
      I have tried with a couple of different datatypes.
      First I defined all my numbers as "double" since I don't only add integers.
      But when myNumber is about 6000 it is suddenly set to #INF the next time it
      increases.
      I have also tried to define the numbers as pure integers ("long"), but now
      the number is reset to 0 a little after it passes 600,000.
      >
      Both the 'double' and the 'long' datatypes should be able to handle larger
      numbers than this. I am using Microsoft Developer Studio 97, on a Pentium 4
      PC.
      >
      Can somebody tell me what my problem is and what I should do to be able to
      add up more numbers?
      >
      Thanks...
      /*main.cpp*/
      #include <iostream>
      #include <limits>

      int myNumber(0);

      void add(int i)
      {
      myNumber += i;
      }

      int main()
      {
      // study numeric limits
      std::cout << "max integer = " << std::numeric_li mits< int >::max()
      << std::endl;
      std::cout << "max long = " << std::numeric_li mits< long >::max() <<
      std::endl;
      std::cout << "max double = " << std::numeric_li mits< double >::max()
      << std::endl;

      for(int i = 0; i < std::numeric_li mits< int >::max(); ++i)
      {
      add(1); // this will take a while
      }

      std::cout << "myNumber = " << myNumber << std::endl;
      return 0;
      }

      /*
      max integer = 2147483647
      max long = 922337203685477 5807
      max double = 1.79769e+308
      myNumber = 2147483647 // <- result concurs with an integer's limits
      */

      Comment

      • BobR

        #4
        Re: Help: datatypes...


        Salt_Peter wrote in message ...
        >
        >/*main.cpp*/
        >#include <iostream>
        >#include <limits>
        >
        >int myNumber(0);
        >void add(int i){ myNumber += i;}
        >
        >int main(){ // study numeric limits
        std::cout << "max integer = " << std::numeric_li mits< int >::max()
        ><< std::endl;
        std::cout << "max long = " << std::numeric_li mits< long >::max() <<
        >std::endl;
        std::cout << "max double = " << std::numeric_li mits< double >::max()
        ><< std::endl;
        >
        for(int i = 0; i < std::numeric_li mits< int >::max(); ++i){
        add(1); // this will take a while
        }
        >
        std::cout << "myNumber = " << myNumber << std::endl;
        return 0;
        >}
        >
        >/*
        >max integer = 2147483647
        >max long = 922337203685477 5807
        >max double = 1.79769e+308
        >myNumber = 2147483647 // <- result concurs with an integer's limits
        >*/
        >
        <amusement>

        Ever try to 'print' that double max() on windows, in 'fixed' format?
        [ this is on win98, MinGW(GCC 3.3.1 ]

        // int main(){
        std::string DblMax("");
        {
        std::ostringstr eam out;
        out.precision( 400 );
        out.setf( std::ios_base:: fixed );
        // cout<<"out.prec ision()="<<out. precision()<<st d::endl; // =190
        // note output: out.precision() =190

        // out<<std::numer ic_limits<doubl e>::max(); // GNU/Linux OK

        // - biggest I could get to 'print' -
        double tmp( std::numeric_li mits<double>::m ax() / 1.0e+276);
        // max() / 1.0e+275==boom

        out<<(tmp);
        DblMax=out.str( );
        }
        std::cout <<"DblMax=out.s tr() = "<<DblMax<<std: :endl;
        // } // main()
        /* -- output --
        DblMax=out.str( ) =
        179769313486231 570000000000000 000.00000000000 000000
        */

        On GNU/Linux, it prints the whole freakin' max() number.

        </amusement>

        Different compiler? Try it. Or, am I just missing something?

        Obviously ms-window$ was not involved to get us to the moon! <G>
        --
        Bob R
        POVrookie


        Comment

        • Salt_Peter

          #5
          Re: Help: datatypes...


          BobR wrote:
          Salt_Peter wrote in message ...

          /*main.cpp*/
          #include <iostream>
          #include <limits>

          int myNumber(0);
          void add(int i){ myNumber += i;}

          int main(){ // study numeric limits
          std::cout << "max integer = " << std::numeric_li mits< int >::max()
          << std::endl;
          std::cout << "max long = " << std::numeric_li mits< long >::max() <<
          std::endl;
          std::cout << "max double = " << std::numeric_li mits< double >::max()
          << std::endl;

          for(int i = 0; i < std::numeric_li mits< int >::max(); ++i){
          add(1); // this will take a while
          }

          std::cout << "myNumber = " << myNumber << std::endl;
          return 0;
          }

          /*
          max integer = 2147483647
          max long = 922337203685477 5807
          max double = 1.79769e+308
          myNumber = 2147483647 // <- result concurs with an integer's limits
          */
          >
          <amusement>
          >
          Ever try to 'print' that double max() on windows, in 'fixed' format?
          [ this is on win98, MinGW(GCC 3.3.1 ]
          >
          // int main(){
          std::string DblMax("");
          {
          std::ostringstr eam out;
          out.precision( 400 );
          out.setf( std::ios_base:: fixed );
          // cout<<"out.prec ision()="<<out. precision()<<st d::endl; // =190
          // note output: out.precision() =190
          >
          // out<<std::numer ic_limits<doubl e>::max(); // GNU/Linux OK
          >
          // - biggest I could get to 'print' -
          double tmp( std::numeric_li mits<double>::m ax() / 1.0e+276);
          // max() / 1.0e+275==boom
          >
          out<<(tmp);
          DblMax=out.str( );
          }
          std::cout <<"DblMax=out.s tr() = "<<DblMax<<std: :endl;
          // } // main()
          /* -- output --
          DblMax=out.str( ) =
          179769313486231 570000000000000 000.00000000000 000000
          */
          >
          On GNU/Linux, it prints the whole freakin' max() number.
          >
          </amusement>
          >
          Different compiler? Try it. Or, am I just missing something?
          >
          Obviously ms-window$ was not involved to get us to the moon! <G>
          --
          Bob R
          POVrookie
          lol
          Sorry, no windows here. linux FC5, gcc 4.1.1 x86_64, FX dual-core.
          Which explains the output above.
          And yes, it prints the whole thing. And i do mean the *whole* thing.
          If you don't mind, i'll spare the newsgroup.

          Comment

          • Steve Pope

            #6
            Re: Help: datatypes...

            Dala Dahlgren <dala@broadpark .nowrote:
            >First I defined all my numbers as "double" since I don't only add integers.
            >But when myNumber is about 6000 it is suddenly set to #INF the next time it
            >increases.
            >I have also tried to define the numbers as pure integers ("long"), but now
            >the number is reset to 0 a little after it passes 600,000.
            >
            >Both the 'double' and the 'long' datatypes should be able to handle larger
            >numbers than this.
            Have you tried "long long"? I've seen systems where "long"
            is no longer than "int", but "long long" is twice as long.
            I think this is for historical reasons.

            Steve

            Comment

            Working...