Solving Error in C++ Digit Algorithm Program

  • Context: C/C++ 
  • Thread starter Thread starter chaoseverlasting
  • Start date Start date
  • Tags Tags
    Algorithm C++
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
10 replies · 5K views
chaoseverlasting
Messages
1,051
Reaction score
3
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;
count<<log(i);
return 0;
}


The log function gives me a weird result each time. I don't know why though. I am using dev c++ compiler...
 
Physics news on Phys.org
This isn't homework. I am trying to write a program which needs this bit. I can't seem to figure this out. So is it log(e) or log (10) ?
 
If that's 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?
 
Personally I'd use sprintf & count the characters in the buffer...
 
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:
int ndigits = 0;
for (same_int_type_as_i rem = i; rem != 0; rem /= 10) {
   ++ndigits;
}
 
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.
 
Borek said:
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.

D H said:
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:
int ndigits = 0;
for (same_int_type_as_i rem = i; rem != 0; rem /= 10) {
   ++ndigits;
}

Thank you. :cool: That helps :cool:.