| delorie.com/archives/browse.cgi | search |
| 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.
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |