将浮点数插入和提取到某些标准流类是否会保留其值?

Ant*_*yko 3 c++ floating-point

当我调试时,我有时想要打印函数返回的浮点数,并将其用作另一个函数的输入值.我想知道什么是指导浮点数格式化的默认参数.

以下代码中f1和f2是否始终相同?

#include <sstream>
#include <cassert>
int main(int argc, const char *argv[])
{
  std::stringstream ss;

  float f1 = .1f;
  ss << f1;

  float f2;
  ss >> f2;

  assert(f1 == f2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以将一堆浮点数写入std :: cout或std :: ofsteam并读取它们以获得完全相同的数字,或者我应该明确设置小数点后的数字量(就像这里建议的那样?

困扰我的是,尽管.1不能表示为二进制分数,但仍然可以通过标准流正确格式化.

Jam*_*nze 6

不必要.默认情况下,ostream输出6位精度.为了能够"往返"一个浮点数,你需要一个精度std::numeric_limits<float>::max_digits10(对于最常见的表示,它是9).如果流用于持久性,并且您只是持久浮动,则只需在写入任何内容之前设置精度,例如:

ss.precision( std::numeric_limits<float>::max_digits10 );
Run Code Online (Sandbox Code Playgroud)

(如果你需要同时处理floatdouble,并且不希望在额外的数字float,你需要每次输出的浮点值设定的精度.)