ftp.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2002/04/23/14:00:25

X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-bounces using -f
From: Alan Didey <a_didey AT hotmail DOT com>
Newsgroups: comp.lang.c++,comp.os.msdos.djgpp
Subject: Re: setw & notation
Date: Tue, 23 Apr 2002 18:45:31 +0100
Organization: Oxford University, England
Lines: 141
Message-ID: <3CC59DBB.1000201@hotmail.com>
References: <aa37pj$79p7q$1 AT ID-79865 DOT news DOT dfncis DOT de> <3CC55D84 DOT 5FA93D1 AT earthlink DOT net> <aa3nkb$7luo2$1 AT ID-79865 DOT news DOT dfncis DOT de>
NNTP-Posting-Host: dhc38.chch.ox.ac.uk
Mime-Version: 1.0
X-Trace: news.ox.ac.uk 1019583929 12853 163.1.237.38 (23 Apr 2002 17:45:29 GMT)
X-Complaints-To: newsmaster AT ox DOT ac DOT uk
NNTP-Posting-Date: Tue, 23 Apr 2002 17:45:29 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.2.1) Gecko/20010901
X-Accept-Language: en-us
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Alex Vinokur wrote:

> "Martin Ambuhl" <mambuhl AT earthlink DOT net> wrote in message news:3CC55D84 DOT 5FA93D1 AT earthlink DOT net...
> | Alex Vinokur wrote:
> |
> | >           5e-05  || MY COMMENT : Why not 0.00005 ?
> | >           6e-06  || MY COMMENT : Why not 0.000006 ?
> |
> | If you want fixed point, say so. Change
> |         cout << setw(show_size_i) << value_i << endl;
> | to
> |         cout << fixed << setw(show_size_i) << value_i << endl;
> |
> [snip]
> 
> I don't want fixed point.
> I want the output to be as following :
>             0.1
>            0.02
>           0.003
>          0.0004
>         0.00005
>        0.000006

You certainly do want fixed format.  That's what the fixed manipulator 
(or the ios_base::fixed flag) gives you.

This program prints numbers without their fractional part (though 
rounded not truncated), or if they are smaller than one, prints only the 
first non-zero decimal place.  You have to calculate the precision 
required to do this yourself.  Note the use of epsilon() - this is 
important.

#include <iostream>
#include <limits>
#include <iomanip>
#include <cmath>
using namespace std;

int main()
{
     // remember the original format of the stream
     ios_base::fmtflags flags = cout.flags();
     streamsize prec = cout.precision();

     // we never want scientific notation
     cout.setf(ios_base::fixed, ios_base::floatfield);

     // my implementation won't ever print more than 18 decimal places
     for (double d=100000000000000.0; d>=1e-18; d/=10.0) {
	if(d < 1)
	    cout.precision(
		// enough precision for one decimal place
		static_cast<streamsize>(
		    -log10(d) + 1 - numeric_limits<double>::epsilon()
		    )
		);
	else // don't print fractional part of numbers greater than 1
	    cout.precision(0);
	cout << d << '\n';
     }

     // force the output on to the screen
     cout.flush();

     // restore the stream to its former glory
     cout.precision(prec);
     cout.setf(ios_base::fmtflags(0), ios_base::floatfield);
}

Its output:

100000000000000
10000000000000
1000000000000
100000000000
10000000000
1000000000
100000000
10000000
1000000
100000
10000
1000
100
10
1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.0000001
0.00000001
0.000000001
0.0000000001
0.00000000001
0.000000000001
0.0000000000001
0.00000000000001
0.000000000000001
0.0000000000000001
0.00000000000000001
0.000000000000000001

Change the starting number to 348903497856.0 and get:

348903497856
34890349786
3489034979
348903498
34890350
3489035
348903
34890
3489
349
35
3
0.3
0.03
0.003
0.0003
0.00003
0.000003
0.0000003
0.00000003
0.000000003
0.0000000003
0.00000000003
0.000000000003
0.0000000000003
0.00000000000003
0.000000000000003
0.0000000000000003
0.00000000000000003
0.000000000000000003

Hope this helps.

- Raw text -


  webmaster     delorie software   privacy  
  Copyright 2019   by DJ Delorie     Updated Jul 2019