Precisão C ++: String to Double

Estou tendo um problema com a precisão de um duplo depois de executar algumas operações em uma seqüência de caracteres convertida em duplo.

#include <iostream>   
#include <sstream>
#include <math.h>

using namespace std;

// conversion function
void convert(const char * a, const int i, double &out)
{

   double val;

   istringstream in(a);
   in >> val;

   cout << "char a -- " << a << endl;
   cout << "val ----- " << val << endl;

   val *= i;

   cout << "modified val --- " << val << endl;
   cout << "FMOD ----- " << fmod(val, 1) << endl;

   out = val;

   return 0;

}

Este não é o caso de todos os números inseridos como uma sequência, portanto, o erro não é constante. Afeta apenas alguns números (34,38 parece ser constante).

No minuto, ele retorna isso quando passo em a = 34,38 e i = 100:

char a -- 34.38
Val ----- 34.38
modified val --- 3438
FMOD ----- 4.54747e-13

Isso funcionará se eu alterar o Val para um float, pois há menor precisão, mas preciso de um dobro.

Isso também é reproduzido quando eu uso atof, sscanf e strtod em vez de sstream.

Em C ++, qual é a melhor maneira de converter corretamente uma seqüência de caracteres em um duplo e realmente retornar um valor preciso?

Obrigado.

questionAnswers(2)

yourAnswerToTheQuestion