| www.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 |