Precyzyjna konwersja ciągów zmiennoprzecinkowych <->

Szukam funkcji biblioteki do konwersji liczb zmiennoprzecinkowych na ciągi znaków iz powrotem w C ++. Właściwości, których chcę, to str2num (num2str (x)) == x oraz num2str (str2num (x)) == x (o ile to możliwe). Ogólna właściwość polega na tym, że num2str powinien reprezentować najprostszą wymierną liczbę, która po zaokrągleniu do najbliższej reprezentatywnej zmiennej liczby wskaźnikowej daje z powrotem pierwotną liczbę.

Do tej pory próbowałem boost :: lexical_cast:

double d = 1.34;
string_t s = boost::lexical_cast<string_t>(d);
printf("%s\n", s.c_str());
// outputs 1.3400000000000001

I próbowałem std :: ostringstream, który wydaje się działać dla większości wartości, jeśli robię stream.precision (16). Jednak z dokładnością 15 lub 17 albo obcina albo daje brzydkie dane wyjściowe dla rzeczy takich jak 1.34. Nie sądzę, aby precyzja 16 miała jakieś szczególne właściwości, których potrzebuję, i podejrzewam, że rozkłada się na wiele liczb.

Czy istnieje biblioteka C ++ z taką konwersją? Lub jest taka funkcja konwersji już zakopana gdzieś w standardowych bibliotekach / boost.

Powodem, dla którego te funkcje są potrzebne, jest zapisywanie wartości zmiennoprzecinkowych w plikach CSV, a następnie ich prawidłowe odczytywanie. Ponadto chciałbym, aby pliki CSV zawierały proste liczby tak dalece, jak to możliwe, aby mogły być wykorzystywane przez ludzi.

Wiem, że funkcje odczytu / pokazu Haskell mają już właściwości, za którymi się podążam, podobnie jak biblioteki BSD C. Standardowe odniesienia dla ciągów <-> podwójnych konwersji to para dokumentów z PLDI 1990:

Jak dokładnie odczytywać liczby zmiennoprzecinkowe, Will KlingerJak dokładnie drukować liczby zmiennoprzecinkowe, Guy Steele i in

Odpowiednia byłaby dowolna biblioteka / funkcja C ++.

EDYCJA: Jestem w pełni świadomy, że liczby zmiennoprzecinkowe są niedokładnymi reprezentacjami liczb dziesiętnych i że 1.34 == 1.3400000000000001. Jednak, jak wskazują wspomniane powyżej artykuły, nie ma usprawiedliwienia dla wyświetlania jako „1.3400000000000001”

EDIT2: Ten artykuł wyjaśnia dokładnie, czego szukam:http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/

questionAnswers(5)

yourAnswerToTheQuestion