Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > C function for returning number of digits?

Reply
Thread Tools

C function for returning number of digits?

 
 
David Resnick
Guest
Posts: n/a
 
      11-29-2005

Jordan Abel wrote:
> On 2005-11-29, Ingo Menger <(E-Mail Removed)> wrote:
> >
> > Richard Bos schrieb:
> >
> >> Keith Thompson <(E-Mail Removed)> wrote:
> >>
> >> > "Luke Wu" <(E-Mail Removed)> writes:
> >> > > Ohh my.... didn't think it would be a two liner.......thank you
> >> > > #include<math.h>
> >> > >
> >> > > int numdigits(int n)
> >> > > return log10(n) + 1;
> >> >
> >> > I don't think a floating-point solution is best here. A loop using
> >> > integer arithmetic is likely to be faster and more accurate. For that
> >> > matter, a binary search on a lookup table holding powers of 10 is
> >> > likely to be even quicker.
> >>
> >> *g* Never knock the simple solution. You're quite right, of course

> >
> > How about:
> > int length;
> > char digits[100]; /* should be big enough even for 128 bit longs */
> > sprintf(digits, "%d", n);
> > length = strlen(digits) - (n<0 ? 1 : 0);

>
> For c99:
>
> length = snprintf(0,0,"%d",n)-1;


Why the -1?

[#3] The snprintf function returns the number of characters
that would have been written had n been sufficiently large,
not counting the terminating null character, or a negative
value if an encoding error occurred. Thus, the null-
terminated output has been completely written if and only if
the returned value is nonnegative and less than n.

Return count doesn't include the terminating null. Sanity check on
this
with gcc:

temp(1186)$ cat foo.c
#include <stdio.h>

int main(void)
{
int foo = 10;
size_t len = snprintf(NULL, 0, "%d", foo);
printf("%d has len %lu\n", foo, (unsigned long) len);

return 0;
}
temp(1187)$ gcc -Wall -pedantic foo.c -o foo
temp(118$ foo
10 has len 2

-David

 
Reply With Quote
 
 
 
 
Walter Roberson
Guest
Posts: n/a
 
      11-29-2005
In article <(E-Mail Removed). com>,
Ingo Menger <(E-Mail Removed)> wrote:

>Niklas Norrthon schrieb:


>> And how do you fix this when the next version of your compiler ships
>> (which use 333 bit longs)?


>I don't. I write the length of the char array as constant expression
>involving sizeof (long) in the first place. For example
> char digits[32 + 4 * sizeof (long)]
>That should do it.


pow(2,332)-1 is 100 digits. Your expression 32 + 4 * sizeof (long)
will not work unless sizeof(long) is at least 17 and CHAR_BIT is
at least 20.

You should be allocating about
CHAR_BITS * sizeof long / (log(10)/log(2))
digits... though remember to allow for rounding and the sign.

Getting sufficient precision on (log(10)/log(2)) at compile
time could be tricky, so possibly the easiest would be to round
that down and overeastimate the number of digits, resulting in

CHAR_BIT * sizeof long / 3
--
"It is important to remember that when it comes to law, computers
never make copies, only human beings make copies. Computers are given
commands, not permission. Only people can be given permission."
-- Brad Templeton
 
Reply With Quote
 
 
 
 
Malcolm
Guest
Posts: n/a
 
      11-29-2005

"Jordan Abel" <(E-Mail Removed)> wrote
> At least
> the sprintf solution returns something that some people _might_ consider
> sensible [ number of digits in a number] even in the naivest
> implementation [counting
> the minus as a digit]
>

That is something which is hard to answer. Should a negative number assert
fail? Exhibit undefined behaviour? Return a negative number of digits?


 
Reply With Quote
 
Keith Thompson
Guest
Posts: n/a
 
      11-29-2005
"Malcolm" <(E-Mail Removed)> writes:
> "Jordan Abel" <(E-Mail Removed)> wrote
>> At least
>> the sprintf solution returns something that some people _might_ consider
>> sensible [ number of digits in a number] even in the naivest
>> implementation [counting
>> the minus as a digit]
>>

> That is something which is hard to answer. Should a negative number assert
> fail? Exhibit undefined behaviour? Return a negative number of digits?


It's easy to answer: just pick one and make it part of the problem
definition.

If the problem definition doesn't cover negative numbers, then either
it's an inadequate definition or you can just assume undefined
behavior.

--
Keith Thompson (The_Other_Keith) http://www.velocityreviews.com/forums/(E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
 
Reply With Quote
 
Skarmander
Guest
Posts: n/a
 
      11-29-2005
Malcolm wrote:
> "Jordan Abel" <(E-Mail Removed)> wrote
>> At least
>> the sprintf solution returns something that some people _might_ consider
>> sensible [ number of digits in a number] even in the naivest
>> implementation [counting
>> the minus as a digit]
>>

> That is something which is hard to answer. Should a negative number assert
> fail? Exhibit undefined behaviour? Return a negative number of digits?
>

Eh, no. The original function was declared as taking an int. Hence, it is
capable of processing negative numbers unless explicitly documented to do
otherwise. Hence, it should return the number of digits in the number. The
number of digits in a negative number is equal to the number of digits in
its absolute value. Confused people may have wanted to ask for the number of
characters instead, in which case the sign counts as a "digit", and the
function is poorly named.

What is hard to answer is why people keep insisting on guessing the intended
behavior of a function by its name instead of using a specification.

S.
 
Reply With Quote
 
Walter Roberson
Guest
Posts: n/a
 
      11-29-2005
In article <438cce10$0$11064$(E-Mail Removed)4all.nl>,
Skarmander <(E-Mail Removed)> wrote:
>Eh, no. The original function was declared as taking an int. Hence, it is
>capable of processing negative numbers unless explicitly documented to do
>otherwise. Hence, it should return the number of digits in the number. The
>number of digits in a negative number is equal to the number of digits in
>its absolute value. Confused people may have wanted to ask for the number of
>characters instead, in which case the sign counts as a "digit", and the
>function is poorly named.


>What is hard to answer is why people keep insisting on guessing the intended
>behavior of a function by its name instead of using a specification.


If you are going to use that kind of semantic logic, then I would
point out that the number of digits in 01234 is not the same as the
number of digits in 1234.

"digits" are not an inherent property of a number: they are a property
of the representation of the number under some given representation
schema. Whether the indication of negative values is to count
as a "digit" or not depends upon the representation schema.

For example, one could chose a representation schema involving octal
digits and with the property that a negative value is indicated by
a leading "9". How many "digits" are there in 9141 in such a
schema ? How many digits in the hex number B27F ?
--
If you lie to the compiler, it will get its revenge. -- Henry Spencer
 
Reply With Quote
 
Skarmander
Guest
Posts: n/a
 
      11-29-2005
Walter Roberson wrote:
> In article <438cce10$0$11064$(E-Mail Removed)4all.nl>,
> Skarmander <(E-Mail Removed)> wrote:
>> Eh, no. The original function was declared as taking an int. Hence, it is
>> capable of processing negative numbers unless explicitly documented to do
>> otherwise. Hence, it should return the number of digits in the number. The
>> number of digits in a negative number is equal to the number of digits in
>> its absolute value. Confused people may have wanted to ask for the number of
>> characters instead, in which case the sign counts as a "digit", and the
>> function is poorly named.

>
>> What is hard to answer is why people keep insisting on guessing the intended
>> behavior of a function by its name instead of using a specification.

>
> If you are going to use that kind of semantic logic, then I would
> point out that the number of digits in 01234 is not the same as the
> number of digits in 1234.
>
> "digits" are not an inherent property of a number: they are a property
> of the representation of the number under some given representation
> schema. Whether the indication of negative values is to count
> as a "digit" or not depends upon the representation schema.
>

Oh yes, very well. The number of digits in the smallest decimal
representation of a number. Don't worry, I wouldn't have forgotten that had
I written the specification of the function. (Well, probably the "smallest"
part, because it's obvious that if leading zeros are allowed, anything goes.)

> For example, one could chose a representation schema involving octal
> digits and with the property that a negative value is indicated by
> a leading "9". How many "digits" are there in 9141 in such a
> schema ? How many digits in the hex number B27F ?


Three and four, respectively.

I won't deny that a certain amount of fudging and unclarity is always
involved, unless you want to break everything down to, say, the Peano
axioms. Some things are more reasonable than others when left unspecified,
however.

S.
 
Reply With Quote
 
Michael Mair
Guest
Posts: n/a
 
      11-30-2005
Richard Heathfield wrote:
> [attempting to supersede previous (broken) code]
>
> Luke Wu said:
>
>
>>Is there a C function that returns the number of digits in an input
>>int/long?
>>
>>example:
>>
>>numdigits(123) returns 3
>>numdigits(1232132) returns 7

>
>
> int numdigits(int n)
> {
> int count = 0;
> do
> {
> ++count;
> n /= 10;
> }
> while(n != 0);
> return count;
> }
>
> This function ignores signs.


Yep. Quite funny for round-down integer division as allowed by
C89...

Cheers
Michael

> Note that the logarithm method is a little tighter in source terms, but
> involves a call to log(), which can be expensive, computationally speaking.
>



--
E-Mail: Mine is an /at/ gmx /dot/ de address.
 
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
Declaring static function returning pointer to extern function pembed2012 C Programming 1 02-27-2012 08:21 PM
function returning function pointer (recursive type) Mark Piffer C Programming 9 05-15-2009 07:54 AM
returning none when it should be returning a list? randomtalk@gmail.com Python 11 05-02-2006 10:26 AM
Function returning a function pointer? Protoman C++ 14 12-11-2005 07:11 PM
OT: Number Nine, Number Nine, Number Nine FrisbeeŽ MCSE 37 09-26-2005 04:06 PM



Advertisments