开发者

std::cout << Predicting the automatic field width in displayed for an arbitrary double

I'm displaying a large number of doubles on the console, and I would like to know in advance how many decimal places std::cout will decide to display for a given double. This is basically so I can make it look pretty in the console. e.g. (pseudo-code)

feild_width = find_maximum_display_precision_that_cout_will_use( whole_set_of_doubles );
...
// Every cout statement:
std::cout << std::setw( feild_width ) << double_from_the_set << std::endl;

I figure cout "guesses"? a good precision to display based on the double. For example, it seems to display

std:开发者_如何学编程:cout << sqrt(2) << std::endl;

as 1.41421, but also

std::cout << (sqrt(0.5)*sqrt(0.5) + sqrt(1.5)*sqrt(1.5)) << std::endl;

as 2 (rather than 2.000000000000?????? or 1.99999999?????). Well, maybe this calculates to exactly 2.0, but I don't think that sqrt(2) will calculate to exactly 1.41421, so std::cout has to make some decision about how many decimal places to display at some point, right?

Anyway possible to predict this to formulate a find_maximum_display_precision...() function?


What you need is the fixed iomanip.

http://www.cplusplus.com/reference/iostream/manipulators/fixed/

double d = 10/3;

std::cout << std::setprecision(5) << std::fixed << d << std::endl;


Sometimes C++ I/O bites. Making pretty output is one of those sometimes. The C printf family is easier to control, more understandable, more terse, and isn't plagued with those truly awful ios:: global variables. If you need to use C++ output for other reasons, you can always sprintf/snprintf to a string buffer and then print that using the << to stream operator. IMHO, If you don't need to use C++ output, don't. It is ugly and verbose.


In your question you are mixing precision and width, which are two different things. Other answers concentrate on precision, but the given precision is the maximum, not a minimum of displayed digits. It does not pad trailing zeros, if not ios::fixed or ios::scientific is set.

Here is a solution to determine the number of characters used for output, including sign and powers of 10:

#include <string>
#include <sstream>
#include <vector>

size_t max_width(const std::vector<double>& v)
{
  size_t max = 0;

  for (size_t i = 0; i < v.size(); ++i)
  {
    std::ostringstream out;
    // optional: set precision, width, etc. to the same as in std::cout
    out << v[i];
    size_t length = out.str().size();
    if (length > max) max = length;
  }
  return max;
}


std::cout::precision(); use it to determine precision example :

# include <iostream>
# include <iomanip>

int main (void) 
{

   double x = 3.1415927

   std::cout << "Pi is " << std::setprecision(4) << x << std::endl;
   return 1;
}

This would display:

Pi is 3.142

This link also includes explanation for std::cout::precision(); http://www.cplusplus.com/reference/iostream/ios_base/precision/

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜