Re: Formatting floating point values in ostream objects
* tron.thomas@verizon.net:
This C program:
#include <stdio.h>
#include <math.h>
int main()
{
float value;
for(value = -1.0f; 1.1f > value; value += 0.1f){
printf("%.1f\n", value);
}
return 0;
}
Produces this output:
-1.0
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
Not necessarily, because you have no guarantee that the next value will
be >= 1.1. You're dealing with floating point arithmetic. So, instead
of updating the floating point value, compute it, and instead of type
float, use type double (use type float only when there's good reason).
Expressed in C++:
#include <cstdio>
int main()
{
for( int i = -10; i <= +10; ++i )
{
std::printf( "%.1f\n", i/10.0 );
}
}
Trying to write an equivalent C++ program using ostream has proven
tricky. Here is a solution I came up with:
#include <iostream>
#include <cmath>
int main()
{
static const float TOLERANCE = 0.0001f;
Don't use all uppercase identifiers except for macros.
using std::cout;
cout << std::showpoint;
I hate iostreams so I had to look up "showpoint".
for(float value = -1.0f; 1.1f > value; value += 0.1f){
cout.precision(1);
float integral = ::floor(value);
if(TOLERANCE > ::fabsf(value - integral)){
value = integral;
cout.precision(2);
}
This does a bit more, or a different thing, than the C program.
cout << value << '\n';
}
return 0;
}
It seems like a lot more work to accomplish the same thing.
Well, it's not the same thing: you let the C++ program do more.
I wonder
if there is a better approach
What is the best way to produce this kind of output using an ostream
object?
No "best" way (unless you list your criteria), however, much simpler:
#include <iostream>
#include <iomanip>
int main()
{
using namespace std;
for( int i = -10; i <= +10; ++i )
{
cout << fixed << setprecision( 1 ) << i/10.0 << endl;
}
}
Cheers, & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?