Conversão de string <-> de ponto flutuante precisa

Eu estou procurando uma função de biblioteca para converter números de ponto flutuante para seqüências de caracteres e novamente, em C ++. As propriedades que eu quero são str2num (num2str (x)) == xe que num2str (str2num (x)) == x (na medida do possível). A propriedade geral é que num2str deve representar o número racional mais simples que quando arredondado para o número de ponteiro flutuante representável mais próximo retorna o número original.

Até agora eu tentei 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

E eu tentei std :: ostringstream, que parece funcionar para a maioria dos valores se eu fizer stream.precision (16). No entanto, na precisão 15 ou 17, ele trunca ou gera uma saída feia para itens como 1.34. Eu não acho que a precisão 16 seja garantida para ter alguma propriedade particular que eu exija, e suspeito que ela falhe por muitos números.

Existe uma biblioteca C ++ que tenha essa conversão? Ou essa função de conversão já está enterrada em algum lugar nas bibliotecas / reforços padrão.

O motivo para querer essas funções é salvar valores de ponto flutuante em arquivos CSV e, em seguida, lê-los corretamente. Além disso, gostaria que os arquivos CSV contivessem números simples o máximo possível para que pudessem ser consumidos por humanos.

Eu sei que as funções de leitura / exibição do Haskell já têm as propriedades que eu estou procurando, assim como as bibliotecas BSD C. As referências padrão para conversões de string <-> double são um par de artigos do PLDI 1990:

Como ler números de ponto flutuante com precisão, Will KlingerComo imprimir números de ponto flutuante com precisão, Guy Steele e cols.

Qualquer biblioteca / função C ++ baseada neles seria adequada.

EDIT: Estou plenamente ciente de que números de ponto flutuante são representações inexatas de números decimais e que 1,34 == 1,3400000000000001. No entanto, como os documentos mencionados acima apontam, isso não é desculpa para escolher exibir como "1.3400000000000001"

EDIT2: Este documento explica exatamente o que estou procurando:http://drj11.wordpress.com/2007/07/03/python-poor-printing-of-floating-point/

questionAnswers(5)

yourAnswerToTheQuestion