6

J'écris un morceau de code dans lequel je dois convertir des valeurs doubles en valeurs flottantes. J'utilise boost :: numeric_cast pour faire cette conversion qui m'avertit de tout débordement/sous-débit. Cependant, je suis également intéressé de savoir si cette conversion a entraîné une perte de précision ou non.Détection de la perte de précision lors de la conversion du double en flottant

Par exemple

double source = 1988.1012; 
    float dest = numeric_cast<float>(source); 

Produit dest qui a une valeur 1988,1

Est-il possible disponible où je peux détecter ce type de perte de précision/arrondi

+7

Il y aura * toujours * "perte de précision" dans ce cas. –

Répondre

11

Vous pouvez rejetterait le flotteur à un double et de comparer ce double à l'original - cela devrait vous donner une indication juste quant à savoir s'il y avait une perte de précision.

+4

Mieux que juste. Il vous dira précisément si des informations ont été perdues. –

9
float dest = numeric_cast<float>(source); 
double residual = source - numeric_cast<double>(dest); 

Par conséquent, residual contient la "perte" que vous cherchez.

1

Regardez ces articles pour les flotteurs single precision et double precision. Tout d'abord, les flotteurs ont 8 bits pour l'exposant contre 11 pour un double. Donc tout ce qui est plus grand que 10^127 ou plus petit que 10^-126 de magnitude va être le débordement comme vous l'avez mentionné. Pour le flottant, vous avez 23 bits pour les chiffres réels du nombre, contre 52 bits pour le double. Alors évidemment, vous avez beaucoup plus de chiffres de précision pour le double que le flotteur.

Disons que vous avez un nombre comme: 1.1123. Ce nombre ne peut pas réellement être codé comme 1.1123 parce que les chiffres dans un nombre à virgule flottante sont utilisés pour réellement ajouter en tant que fractions. Par exemple, si vos bits dans la mantisse étaient 11001, la valeur serait formée de 1 (implicite) + 1 * 1/2 + 1 * 1/4 + 0 * 1/8 + 0 * 1/16 + 1 * 1/32 + 0 * (64 + 128 + ...). Donc, la valeur exacte ne peut pas être codée à moins que vous ne puissiez additionner ces fractions de telle sorte que c'est le nombre exact. C'est rare. Par conséquent, il y aura presque toujours une perte de précision.

+1

Puis-je suggérer de pointer vers le http://docs.sun.com/source/806-3568/ncg_goldberg.html souvent mentionné à la place? (Je n'ai pas assez de rep pour le faire moi-même) –

1

Vous allez avoir un certain niveau de perte de précision, selon la réponse de Dave. Si, toutefois, vous souhaitez vous concentrer sur la quantification et sur l'élévation d'une exception quand elle dépasse un certain nombre, vous devrez ouvrir le nombre à virgule flottante lui-même et analyser l'exposant de la mantisse, puis faire une analyse pour déterminer si vous J'ai dépassé votre tolérance.

Mais, la bonne nouvelle, c'est généralement le flottant standard IEEE à virgule flottante. :-)