Я ищу библиотечную функцию для преобразования чисел с плавающей запятой в строки и обратно в С++. Свойства, которые я хочу, это 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 гарантирована для каких-либо конкретных свойств, которые я требую, и подозреваю, что она ломается для многих чисел.
Есть ли библиотека С++, которая имеет такое преобразование? Или такая функция преобразования уже зарыта где-то в стандартных библиотеках /boost.
Причиной желания этих функций является сохранение значений с плавающей запятой в CSV файлах, а затем их правильное чтение. Кроме того, я хотел бы, чтобы CSV файлы содержали простые числа, насколько это возможно, чтобы они могли потребляться людьми.
Я знаю, что функции чтения/показа Haskell уже имеют свойства, за которыми я следую, а также библиотеки BSD C. Стандартными ссылками для двойных преобразований string ↔ являются две статьи из PLDI 1990:
- Как точно читать числа с плавающей запятой, Will Klinger
- Как правильно печатать числа с плавающей запятой, Guy Steele et al.
Любая библиотека/функция С++, основанная на них, будет подходящей.
EDIT: я полностью отдаю себе отчет в том, что числа с плавающей запятой являются неточными представлениями десятичных чисел и что 1.34 == 1.3400000000000001. Однако, поскольку упомянутые выше работы указывают, что никаких оправданий для выбора отображения "1.3400000000000001"
EDIT2: В этой статье объясняется, что именно я ищу: http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/