Search code examples
c++iofloating-point

Write a float with full precision in C++


In C++, can I write and read back a float (or double) in text format without losing precision?

Consider the following:

float f = ...;
{
    std::ofstream fout("file.txt");
    // Set some flags on fout
    fout << f;
 }
 float f_read;
 {
     std::ifstream fin("file.txt");
     fin >> f;
  }
  if (f != f_read) {
      std::cout << "precision lost" << std::endl;
  }

I understand why precision is lost sometimes. However, if I print the value with enough digits, I should be able to read back the exact same value.

Is there a given set of flags that is guaranteed to never lose precision? Would this behaviour be portable across platforms?


Solution

  • If you don't need to support platforms that lack C99 support (MSVC), your best bet is actually to use the %a format-specifier with printf, which always generates an exact (hexadecimal) representation of the number while using a bounded number of digits. If you use this method, then no rounding occurs during the conversion to a string or back, so the rounding mode has no effect on the result.