Bonjour ,
Pouvez-vous me dire pourquoi il y a une perte d'info lorsque je convertis un STRING en DOUBLE ?
1.8266818Code:
1
2 cout<< CDP1_B3[5][1] << endl ; cout<< atof(CDP1_B3[5][1].c_str())<< endl ;
1.82668
Merci.
Version imprimable
Bonjour ,
Pouvez-vous me dire pourquoi il y a une perte d'info lorsque je convertis un STRING en DOUBLE ?
1.8266818Code:
1
2 cout<< CDP1_B3[5][1] << endl ; cout<< atof(CDP1_B3[5][1].c_str())<< endl ;
1.82668
Merci.
Salut,
Parce que la mémoire d'un ordinateur est limitée et qu'il est impossible de représenter tous les nombres à virgule possibles, soit une infinité, avec un double.
https://en.wikipedia.org/wiki/Floati...n_and_rounding
La méthode utilisée n'est peut-être pas optimisée. Une idée pour conserver de la précision ?
Bonjour,
ici c'est surtout parce que les valeurs dans les flux utilisent 6 chiffres. Le double a 16 chiffres de précision.
Mais attention comme le dit Bousk un nombre flottant n'est quasiment jamais égal à une représentation décimale.
Exemple :
0.2 * 5 - 1 n'est pas nul!
Essaie les lignes pour : auto s = "1.826818"s;
std::cout << std::setprecision(15) << std::atof(st.c_str()) << std::endl;
std::cout << std::setprecision(20) << std::atof(st.c_str()) << std::endl;
La seule solution pour conserver de la précision c'est de ne pas utiliser des doubles mais des entiers et une virgule fixe.
Avec le atof sa ne va pas marcher.....par ce que le double a une précision de 6 chiffre après la virgule...donc c'est a toi de faire ton propre type qui va rependre a tes exigence
Avez-vous des doc me permettant de me former à cet exercice ?
Merci.
Pour la problématique du stockage, tu as déjà eu un lien.
Les double supportent 15 chiffres significatifs, cela est largement suffisant la plupart du temps.
Quel est exactement ton besoin ?
Pour une précision décimale 'illimité', il faut chercher une implémentation du type Decimal
Pour une plus grande précision, il y a éventuellement les long double.
Je n'ai pas trouvé de syntaxe pour le stockage de données en C++ dans le lien hypertexte.
Je dispose de variable en string. Pour effectuer des calculs avec ces variables, une conversion en type double ou long double s'impose. La fonction strtold semble faire le travail.
Code:
1
2
3
4
5
6
7 std::string st{ "1.123456" }; double v = std::strtod( st.c_str() , nullptr ) // fonctionne, tu auras les 15 chiffres significatifs // std::istringstream stst( st ); // fonctionne, tu auras les 15 chiffres significatifs stst >> v; // std::sscanf( st.c_str() , "%lf" , &v ); // fonctionne, tu auras les 15 chiffres significatifs
effectivement , avec strtold, j'obtiens satisfaction. Pour l'affichage j'ai ajouté cette syntaxe
Merci pour vos participations.Code:std::cout << std::setprecision(std::numeric_limits<long double>::digits10 + 1);
Pour sauver un double dans une chaine, la solution qu'il m'arrive d'utiliser est de copier les 8 octets du double (64 bits) dans un long long (64 bits) et de sauver le long long. Pour la relecture c'est l'inverse, l'avantage de la méthode c'est d'avoir le même double (avant et après). Typiquement cela me sert à reproduire un problème...