/ / C ++ convertissant une chaîne en float / double sans perte de données - c ++, chaîne, virgule flottante

Conversion de chaîne C ++ en float / double sans perte de données - c ++, chaîne, virgule flottante

Je cherche à convertir une chaîne en un float sans perte de données, par exemple si j'utilise istringstream ou :: atof (x.c_str ()), je suppose que les données sont arrondies.

Normalement, ce n’est pas un problème pour moi mais j’utilise des données qui doivent être identiques à celles qui ont été lues. Voici un exemple de nombre et de conversion.

-8.000001 -> -8
-0.6257381 -> -0.625738
12.0 -> 12 (drops the .0)

Si quelqu'un pouvait m'aider, je serais très reconnaissant.

Merci Matt

Réponses:

4 pour la réponse № 1

Votre question comporte trois problèmes potentiels:

  1. La quantité de précision affichée. Pour contrôler la précision utilisée, incluez #include <iomanip> et utilise std::cout << std::setprecision(17); définir le nombre de chiffres à utiliser.

  2. Mise en forme. Si vous voulez “12.0” pour “12.0”, sachez que “.0” n’est pas stocké dans un fichier. float ou double. le double contient juste la valeur 12; il ne contient pastoute information sur la précision d'origine ou un intervalle d'erreur. Il est exactement 12 et rien d'autre. Si vous souhaitez qu'il soit formaté d'une manière particulière, vous devez utiliser les indicateurs de format pour le flux d'E / S ou écrire votre propre code pour effectuer le formatage.

  3. Précision. Le commun float et double les types ne peuvent pas représenter exactement 8.000001 ou 0.6257381. Ils utilisent binaire pour représenter les valeurs à virgule flottante. De petites erreurs se produisent lorsque les nombres décimaux sont convertis en binaires. Si vous avez des utilisations très simples de la virgule flottante et travaillez avec beaucoup moins de chiffres que les limites de float et double, alors vous pourrez peut-être ignorer cela et formater simplement les nombres avec votre nombre limité de chiffres. Si vous dépassez les cas simples, vous devrez effectuer une analyse d'erreur, ce qui peut être assez compliqué.


1 pour la réponse № 2

Vous allez avoir besoin d'un type de données différent.

Un type décimal à virgule flottante vous permettra destockez le numéro exactement comme vous le souhaitez. Dans un tel type, les nombres sont stockés sous forme d'une paire (mantisse, exposant), tout comme la notation scientifique et un peu comme la virgule flottante binaire IEEE.

Vos exemples seraient stockés comme

(-8000001, -6)
(-6257381, -7)
(120, -1)

Par exemple, la norme ISO 11073 pour les communications de dispositifs médicaux utilise un tel format.

L'inconvénient est que l'arithmétique sera assez lente, car tout le matériel arithmétique à virgule flottante est conçu pour fonctionner avec un nombre utilisant un exposant avec base-2.


0 pour la réponse № 3

En règle générale, un float est seulement précis à 6 chiffres significatifs. Donc, si votre chaîne a plus de chiffres, vous atteindrez la limite de précision.

UNE double vous donnera, sans surprise, environ le double de cette précision; soit 12 chiffres significatifs.

Voir Nombre de chiffres significatifs pour un type à virgule flottante pour d'autres remarques.