Velocity Reviews > How to detect a double's significant digits

# How to detect a double's significant digits

Charles Krug
Guest
Posts: n/a

 05-05-2005
On 5 May 2005 10:37:00 -0700, mrstephengross <(E-Mail Removed)> wrote:
> Hi all... How can I find out the number of significant digits (to the
> right of the decimal place, that is) in a double? At least, I *think*
> that's what I'm asking for. For instance:
>
> 0.103 --> 3
> 0.0103 --> 4
> 0.00103 --> 5
> 0.000103 --> 6
> 0.0000103 --> 7
>
> --Steve ((E-Mail Removed))
>

I would say that each of these examples has three signficant figures.
Each of them can be expressed as:

1.03e+n

For any integer n.

The fact that you've only shown the cases where n \in {-1, -2, -3, -4,
-5 . . } doesn't change the generality of the answer.

Grant Edwards
Guest
Posts: n/a

 05-05-2005
On 2005-05-05, mrstephengross <(E-Mail Removed)> wrote:
>>But, assuming you have your numbers as strings, I would suggest

> looking
> at str.split() and len().
>
> Well, the numbers are in fact stored as numbers,

Then your question is in fact meaningless. The related
question that can be answered is "where is the least
significant '1' bit in the IEEE representation". If that's

> so string processing won't work.

>>I'd give you an example, but this sounds kinda like a homework
>> assignment.

>
> The task may sound like it comes from class, but I can assure
> you that I am indeed a professional developer. I'm doing some
> rather intricate text processing / rendering stuff these days,
> and C++ is unfortunately none too handy for that sort of
> thing. Unfortunately, I have to use it for the task.

--
Grant Edwards grante Yow! Hmmm... A hash-singer
at and a cross-eyed guy were
visi.com SLEEPING on a deserted
island, when...

mrstephengross
Guest
Posts: n/a

 05-05-2005
>This doesn't look like Python to me. Are you sure you're on the right
newsgroup?

Er, ok, I'm an idiot. This was all supposed to be on comp.lang.c++, but
obviously I posted on the wrong one. Sorry for all the hassle. In
python, this stuff is a heck of a lot easier.

--Steve

phil
Guest
Posts: n/a

 05-05-2005
*******s, works here.

That looks like Java!!! Aaaihh!

mrstephengross wrote:

> Ok, that won't work. First of all, str() is not a function. If I want
> to convert the float into a string, the conversion function will have
> to use some kind of numeric precision, which will screw things up.
> Consider this:
>
> float f = 1.004;
> ostringstream s;
> s << f;
> cout << s.str();
>
> The above code may produce "1.004", or "1.0040", or "1.00400",
> depending on the stream's precision setting. I need a way to detect the
> number of digits to the right of decimal point *prior* to doing any
> kind of string conversion.
>
> --Steve
>
>

Peter Otten
Guest
Posts: n/a

 05-05-2005
mrstephengross wrote:

> This was all supposed to be on comp.lang.c++, but

http://mail.python.org/pipermail/pyt...ch/043703.html

http://www.netlib.org/fp/

"""
file g_fmt.c
by David Gay
for ANSI C or C++ source for function g_fmt(char *, double):
, with help from dtoa, g_fmt(buf, x) sets buf to the shortest
, decimal string that correctly rounds to x and returns buf.
"""

Peter

Fredrik Lundh
Guest
Posts: n/a

 05-05-2005
"mrstephengross" wrote:

> >But, assuming you have your numbers as strings, I would suggest

> looking
> at str.split() and len().
>
> Well, the numbers are in fact stored as numbers, so string processing
> won't work.

if they're not strings, your question is meaningless. as others have
pointed out, the exact internal representation for 0.103 is more like
0.102999999999999994337862574411701643839478492736 81640625
which has a lot more than 3 digits...

> >I'd give you an example, but this sounds kinda like a homework

> assignment.
>
> The task may sound like it comes from class, but I can assure you that
> I am indeed a professional developer.

well professional or not, you clearly need to refresh your floating point
skills. I suggest reading the following documents before proceeding:

http://docs.python.org/tut/node16.html
http://www.lahey.com/float.htm

</F>

Jeremy Bowers
Guest
Posts: n/a

 05-05-2005
On Thu, 05 May 2005 18:42:17 +0000, Charles Krug wrote:

> On 5 May 2005 10:37:00 -0700, mrstephengross <(E-Mail Removed)>
> wrote:
>> Hi all... How can I find out the number of significant digits (to the
>> right of the decimal place, that is) in a double? At least, I *think*
>> that's what I'm asking for. For instance:
>>
>> 0.103 --> 3
>> 0.0103 --> 4
>> 0.00103 --> 5
>> 0.000103 --> 6
>> 0.0000103 --> 7
>>
>> --Steve ((E-Mail Removed))
>>
>>

> I would say that each of these examples has three signficant figures. Each
> of them can be expressed as:
>
> 1.03e+n
>
> For any integer n.

You beat me to it.

Step one for mrstephengross is to *rigorously* define what he means by
"significant digits", then go from there. Since I think he mentioned
something about predicting how much space it will take to print out, my
suggestion is to run through whatever printing routines there are and get
a string out, the measure the string, as anything else will likely be
wrong. If that's not possible with the formatting library, you've already
lost; you'll have to completely correctly re-implement the formatting
library, and not only is that a major PITA, you almost never get it
bug-for-bug right...

Erik Max Francis
Guest
Posts: n/a

 05-05-2005
Jeremy Bowers wrote:

> Step one for mrstephengross is to *rigorously* define what he means by
> "significant digits", then go from there. Since I think he mentioned
> something about predicting how much space it will take to print out, my
> suggestion is to run through whatever printing routines there are and get
> a string out, the measure the string, as anything else will likely be
> wrong. If that's not possible with the formatting library, you've already
> lost; you'll have to completely correctly re-implement the formatting
> library, and not only is that a major PITA, you almost never get it
> bug-for-bug right...

Especially since all of his examples have the same number of significant
digits (3), as the term is usually meant. Zeroes to the right are
significant, not zeroes to the left.

--
Erik Max Francis && http://www.velocityreviews.com/forums/(E-Mail Removed) && http://www.alcyone.com/max/
San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
What is it that shapes a species?
-- Louis Wu

Grant Edwards
Guest
Posts: n/a

 05-06-2005
On 2005-05-05, Jeremy Bowers <(E-Mail Removed)> wrote:

> Since I think he mentioned something about predicting how much
> space it will take to print out, my suggestion is to run
> through whatever printing routines there are and get a string
> out,

A step which will require him to tell the printing routine how
many digits he wants printed.

--
Grant Edwards grante Yow! FUN is never having
at to say you're SUSHI!!
visi.com

Grant Edwards
Guest
Posts: n/a

 05-06-2005
On 2005-05-05, Erik Max Francis <(E-Mail Removed)> wrote:

> Especially since all of his examples have the same number of
> significant digits (3), as the term is usually meant. Zeroes
> to the right are significant, not zeroes to the left.

And only the person who performed the measurement knows how
many of the zeros to the right are significant.

--
Grant Edwards grante Yow! They don't hire