Точное преобразование строки с плавающей точкой <->

Я ищу библиотечную функцию для преобразования чисел с плавающей запятой в строки и обратно, в C ++. Мне нужны следующие свойства: str2num (num2str (x)) == x и num2str (str2num (x)) == x (насколько это возможно). Общее свойство заключается в том, что num2str должен представлять простейшее рациональное число, которое при округлении до ближайшего представимого числа с плавающим указателем возвращает вам исходное число.

До сих пор я пробовал 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

И я попробовал std :: ostringstream, который, кажется, работает для большинства значений, если я делаю stream.precision (16). Тем не менее, с точностью 15 или 17 он либо усекает, либо выдает ужасный результат для таких вещей, как 1,34. Я не думаю, что точность 16 гарантированно будет иметь какие-то особые свойства, которые мне требуются, и подозреваю, что она ломается для многих чисел.

Есть ли библиотека C ++, которая имеет такое преобразование? Или такая функция преобразования уже похоронена где-то в стандартных библиотеках / boost.

Причина, по которой эти функции требуются, заключается в том, чтобы сохранять значения с плавающей запятой в файлах CSV и затем правильно их читать. Кроме того, я бы хотел, чтобы файлы CSV содержали, насколько это возможно, простые числа, чтобы их могли использовать люди.

Я знаю, что функции чтения / показа на Haskell уже имеют свойства, которые мне нужны, как и библиотеки BSD C. Стандартные ссылки для строковых <-> двойных преобразований - это пара статей из PLDI 1990:

Как правильно читать числа с плавающей запятой, Уилл КлингерКак правильно печатать числа с плавающей запятой, Гай Стил и др.

Подойдет любая библиотека / функция C ++, основанная на них.

РЕДАКТИРОВАТЬ: Я полностью осознаю, что числа с плавающей запятой являются неточными представлениями десятичных чисел, и что 1.34 == 1.3400000000000001. Тем не менее, как указано в приведенных выше документах, это не оправдывает выбор отображения «1.3400000000000001»

РЕДАКТИРОВАТЬ 2: Эта статья объясняет, что именно я ищу:http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/

Ответы на вопрос(5)

Ваш ответ на вопрос