X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-bounces using -f From: Alan Didey Newsgroups: comp.lang.c++,comp.os.msdos.djgpp Subject: Re: setw & notation Date: 24 Apr 2002 12:19:46 +0100 Organization: Oxford University, England Lines: 113 Sender: alex AT dhc38 DOT chch DOT ox DOT ac DOT uk Message-ID: References: <3CC55D84 DOT 5FA93D1 AT earthlink DOT net> <3CC59DBB DOT 1000201 AT hotmail DOT com> NNTP-Posting-Host: dhc38.chch.ox.ac.uk Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: news.ox.ac.uk 1019647185 7466 163.1.237.38 (24 Apr 2002 11:19:45 GMT) X-Complaints-To: newsmaster AT ox DOT ac DOT uk NNTP-Posting-Date: Wed, 24 Apr 2002 11:19:45 +0000 (UTC) User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com "Alex Vinokur" writes: > "Alan Didey" wrote in message news:3CC59DBB DOT 1000201 AT hotmail DOT com... > > [snip] > > | > | 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 > | #include > | #include > | #include > | 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( > | -log10(d) + 1 - numeric_limits::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: > > [snip] > > | > | 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 > | > | > [snip] > > Thanks. It is almost OK. > The only thing I want to change is to see output as following : > 0.1 > 0.01 > 0.001 > 0.0001 > 0.00001 > ............ Did you really mean: 0.1 0.01 0.001 0.0001 0.00001 or did you mean: 0.1 0.01 0.001 0.0001 0.00001 (monospaced typeface needed to tell the difference) If you meant the latter, then just put a setw(7) manipulator on the stream before outputting the number. If you really meant the former, then you can calculate how many spaces you want from the figure you pass to the precision, and output a temporary std::string(the_right_number_of_spaces, ' '). I had kind of hoped you might figure this last bit out for yourself from the information in some of the replies from other people.