Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C++ Digit algorithm

  1. Jun 10, 2008 #1
    I wrote a program to find the number of digits of an integer, but I always get the wrong result. Could someone point out the error? Here's the source code:

    #include <iostream>
    #include <cmath>

    using namespace std;

    int main()
    {
    int i=53443;
    cout<<log(i);
    return 0;
    }


    The log function gives me a weird result each time. I dont know why though. Im using dev c++ compiler...
     
  2. jcsd
  3. Jun 10, 2008 #2

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    The log function computes the natural logarithm.
     
  4. Jun 10, 2008 #3

    Borek

    User Avatar

    Staff: Mentor

    man log10
     
  5. Jun 10, 2008 #4

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    Is this homework? I don't want to go much further with help if it is.
     
  6. Jun 10, 2008 #5
    This isnt homework. Im trying to write a program which needs this bit. I cant seem to figure this out. So is it log(e) or log (10) ?
     
  7. Jun 10, 2008 #6
    If thats it (the natural log- base 10 difference), I can figure the rest out. Is there perhaps some property of integers and the way this function works (the taylor series of log(1+x) maybe?) that's causing this?
     
  8. Jun 10, 2008 #7

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    RTFM, or as Borek said, man log10 (and man log won't hurt). If you are not on a UNIX machine, there is always the internet. What does log() compute?

    BTW, neither log() nor log10() is really what you want. Will this approach work on negative integers or on 64 bit (long long) integers?
     
  9. Jun 11, 2008 #8
    Personally I'd use sprintf & count the characters in the buffer....
     
  10. Jun 11, 2008 #9

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    Since this is not homework, I will give my solution. Keep dividing by ten (the integer, not the double) until the result becomes zero. This works for all sizes of integers, negative integers, is much faster and more accurate than using log10(), and is much, much faster than sprintf.
    Code (Text):

    int ndigits = 0;
    for (same_int_type_as_i rem = i; rem != 0; rem /= 10) {
       ++ndigits;
    }
     
     
  11. Jun 11, 2008 #10

    Borek

    User Avatar

    Staff: Mentor

    When I went to bed yesterday I thought of strlen(itoa(abs(i))) but I am not addicted to the web enough to post such things immediately :wink: This is similar to sprintf, just much easier to code.
     
  12. Jun 11, 2008 #11
    Thank you. :cool: That helps :cool:.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: C++ Digit algorithm
  1. Separate digits in C++ (Replies: 7)

  2. Separate digits in C++ (Replies: 22)

  3. Digit Check in C++ (Replies: 9)

Loading...