Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > fixed-point output

Reply
Thread Tools

fixed-point output

 
 
Abe Simpson
Guest
Posts: n/a
 
      08-23-2003
Hello all,

The application I am working on must never output numbers in a
floating-point format, that is, something like

2e-002

is a big no-no. At the same time, it must output numbers in a compact way,
that is, it should only output significant digits, and only output a decimal
point if there are digits following it.

There seems to be no printf modifer to accomodate me.

%f is fixed-point but not compact:

printf("%f", 222) produces 222.000000 and I only need 222

%g is compact but not fixed-point:

printf("%g", 0.00001) produces 1e-005 and I want 0.000001

Any way I can do this with printf alone without writing my own 0-trimming
code?

TIA.

Abe


 
Reply With Quote
 
 
 
 
Abe Simpson
Guest
Posts: n/a
 
      08-23-2003
Thanks for a fast reply. I can write 0-trimming code, no problem, I was just
hoping for a cleaner solution based solely on printf's capabilities.

--

abe


"ark" <(E-Mail Removed)> wrote in message
newsUC1b.78142$(E-Mail Removed) t...
>
> "Abe Simpson" <(E-Mail Removed)> wrote in message
> news:TFC1b.29456$(E-Mail Removed)...
> > Hello all,
> >
> > The application I am working on must never output numbers in a
> > floating-point format, that is, something like
> >
> > 2e-002
> >
> > is a big no-no. At the same time, it must output numbers in a compact

way,
> > that is, it should only output significant digits, and only output a

> decimal
> > point if there are digits following it.
> >
> > There seems to be no printf modifer to accomodate me.
> >
> > %f is fixed-point but not compact:
> >
> > printf("%f", 222) produces 222.000000 and I only need 222
> >
> > %g is compact but not fixed-point:
> >
> > printf("%g", 0.00001) produces 1e-005 and I want 0.000001
> >
> > Any way I can do this with printf alone without writing my own

0-trimming
> > code?
> >
> > TIA.
> >
> > Abe
> >

>
> Try sprintf your number with a proper %f format to a small buffer and then
> char *p = strchr(buffer, '.'). p-buffer tells you how many digits before

the
> decimal point there are and add however many more positions you are

allowed.
> Write '\0' there and output the string.
> arkk at macroexpressions.com
>
>



 
Reply With Quote
 
 
 
 
Kevin Goodsell
Guest
Posts: n/a
 
      08-23-2003
Abe Simpson wrote:

> Hello all,
>
> The application I am working on must never output numbers in a
> floating-point format, that is, something like
>
> 2e-002
>
> is a big no-no. At the same time, it must output numbers in a compact way,
> that is, it should only output significant digits, and only output a decimal
> point if there are digits following it.
>
> There seems to be no printf modifer to accomodate me.


My advice would be to not use printf at all. Since you posted to a C++
group, I will assume you are using C++ and recommend type-safe iostream
classes instead.

>
> %f is fixed-point but not compact:
>
> printf("%f", 222) produces 222.000000 and I only need 222


Actually, this produces undefined behavior because you pass an int where
the format string indicates it will be a double. I really doubt you got
this to produce 222.000000. This is a nice example of why most people
should not use printf, scanf, or any function that defeats type-checking
(if it can be avoided).

>
> %g is compact but not fixed-point:
>
> printf("%g", 0.00001) produces 1e-005 and I want 0.000001
>
> Any way I can do this with printf alone without writing my own 0-trimming
> code?


I don't see a way to do it with printf alone.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.

 
Reply With Quote
 
Eric Sosman
Guest
Posts: n/a
 
      08-25-2003
Abe Simpson wrote:
>
> Hello all,
>
> The application I am working on must never output numbers in a
> floating-point format, that is, something like
>
> 2e-002
>
> is a big no-no. At the same time, it must output numbers in a compact way,
> that is, it should only output significant digits, and only output a decimal
> point if there are digits following it.
>
> There seems to be no printf modifer to accomodate me.
>
> %f is fixed-point but not compact:
>
> printf("%f", 222) produces 222.000000 and I only need 222


Nit-pick: printf("%f", 222) produces undefined behavior,
because `222' is not a `double' quantity as required by "%f".

> %g is compact but not fixed-point:
>
> printf("%g", 0.00001) produces 1e-005 and I want 0.000001
>
> Any way I can do this with printf alone without writing my own 0-trimming
> code?


You need to decide how many digits to the right of the
decimal point you want. This will depend on the size of the
number (the log10() function may come in handy here) and on
your notion of how many digits are "significant." Armed with
this information you can then choose an appropriate precision
for the conversion, which you'll probably write as

printf ("%.*f", precision, value);

As an aside, note that printing values with very large or
very small magnitudes is not especially "compact."

-1e37 = -10000000000000000000000000000000000000
1e-37 = 0.0000000000000000000000000000000000001

.... and you don't even want to *think* about 1e308 ...

--
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
Kevin Goodsell
Guest
Posts: n/a
 
      08-25-2003
Eric Sosman wrote:
>
>
> Nit-pick: printf("%f", 222) produces undefined behavior,
> because `222' is not a `double' quantity as required by "%f".
>


I find it strange that you consider this nit-picking. This is pretty
serious case of undefined behavior, likely leading to a program crash,
and maybe even compromising security.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.

 
Reply With Quote
 
Eric Sosman
Guest
Posts: n/a
 
      08-25-2003
Kevin Goodsell wrote:
>
> Eric Sosman wrote:
> >
> >
> > Nit-pick: printf("%f", 222) produces undefined behavior,
> > because `222' is not a `double' quantity as required by "%f".
> >

>
> I find it strange that you consider this nit-picking. This is pretty
> serious case of undefined behavior, likely leading to a program crash,
> and maybe even compromising security.


In actual quoted code I'd have considered it more serious.
But it seemed to me that the O.P. had just typed the code in
without serious consideration -- for example, note the lack of
a newline character, and of a semicolon -- and was concentrating
on the issue of how to control the format of a converted `double'.
So I noted the problem in passing, but didn't spend many electrons
on it. You're entirely right, though: a mismatch like this can
be a serious matter. At least once a fortnight I'm grateful when
gcc prevents me from making just such an error ...

--
(E-Mail Removed)
 
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
Strange problem - page output contains output from another request Paul ASP .Net 1 04-10-2007 03:41 PM
parse output screen ok but cant get desired output new file! chuck amadi Python 1 06-23-2004 02:16 PM
Sony Precision Cinema Progressive Output vs Component 480p Output Otto Pylot DVD Video 1 04-18-2004 09:49 PM
Is Fuji S3000 3.2m/pixel output, or 6 m/pixel interpolated output? Peter H Digital Photography 43 12-04-2003 02:35 PM
Output / Debug window output bug? John Bentley ASP .Net 0 09-10-2003 07:38 AM



Advertisments