delorie.com/archives/browse.cgi | search |
X-Authentication-Warning: | delorie.com: mailnull set sender to djgpp-bounces using -f |
From: | "Mike Wahler" <mkwahler AT ix DOT netcom DOT com> |
Newsgroups: | comp.lang.c++,comp.os.msdos.djgpp |
Subject: | Re: setw & notation |
Date: | Sat, 27 Apr 2002 00:15:01 -0700 |
Organization: | MindSpring Enterprises |
Lines: | 100 |
Message-ID: | <aadi8u$v21$1@slb3.atl.mindspring.net> |
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> <3CC59DBB DOT 1000201 AT hotmail DOT com> <aa5dsg$80s87$1 AT ID-79865 DOT news DOT dfncis DOT de> |
NNTP-Posting-Host: | 3f.32.64.c5 |
X-Server-Date: | 27 Apr 2002 06:59:42 GMT |
X-Priority: | 3 |
X-MSMail-Priority: | Normal |
X-Newsreader: | Microsoft Outlook Express 5.00.2615.200 |
X-MimeOLE: | Produced By Microsoft MimeOLE V5.00.2615.200 |
To: | djgpp AT delorie DOT com |
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp |
Reply-To: | djgpp AT delorie DOT com |
Alex Vinokur <alexvn AT bigfoot DOT com> wrote in message news:aa5dsg$80s87$1 AT ID-79865 DOT news DOT dfncis DOT de... > > "Alan Didey" <a_didey AT hotmail DOT com> 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 <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: > > [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 > ............ std::streamsize wid(20 + 18); ... for (double d=100000000000000.0; d>=1e-18; d/=10.0) { ... cout << setw(wid--) << d << '\n'; -Mike
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |