https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81122

--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Ben Woodard from comment #4)
> Without this Is there a way to read and write floats and doubles accurately
> without the rounding that converting to/from base 10 ends up introducing?
> How are you supposed to use istreams like
> 
> printf(“%a”,dbl);

std::cout << std::hexfloat << dbl;

> scanf(“%f, &dbl);

You can't read a hexadecimal float back in using an istream.

C++17 provides std::to_chars and std::from_chars for lossless conversion of
numbers to/from strings, but GCC only supports it for integers so far, not
floats.

> Note that scanf does handle doubles in whatever form they come in.

As do strtof, strtod and strtold.

> Further note that according to stackexchange this works on llvm and other
> libstdc++ implementations.

N.B. There are no other libstdc++ implementations, libstdc++ is the name of
GCC's C++ standard library implementation, not the generic name.

Some cases work with LLVM's libc++, but their support also gives the wrong
result for valid cases that don't involve hex floats:

#include <sstream>
#include <cassert>

int main()
{
  double d;
  char c;
  std::istringstream in("1.00f");
  in >> d >> c;
  assert( d == 1.0 && c == 'f' );
}

This fails with libc++.

> Therefore if the standard is unclear in this area
> maybe it is a topic to be clarified.

See comment 1.

Reply via email to