L'élargissement de la précision avec le moulage entraîne quelle précision ?
-
21-12-2019 - |
Question
Je sais que l'élargissement des conversions est sûr dans la mesure où ils entraînent aucune perte de données, mais y a-t-il un réel gain de précision ou s'agit-il d'une représentation plus longue avec le même nombre de chiffres significatifs ?
Par exemple,
#include <iostream>
#include <iomanip>
int main()
{
float i = 0.012530f;
std::cout << std::setw(20) << std::setprecision(7) << i << std::endl;
double ii = (double)i;
std::cout << std::setw(20) << std::setprecision(15) << ii << std::endl;
double j = 0.012530;
std::cout << std::setw(20) << std::setprecision(15) << j << std::endl;
}
Produit la sortie
0.01253
0.012529999949039
0.01253
L'examen des variables dans le débogueur montre que j
est arrondi car la virgule flottante ne peut pas représenter exactement le nombre d'origine, mais il s'agit toujours d'une approximation plus exacte du nombre d'origine que ii
.
i = 0.012530000
ii = 0.012529999949038029
j = 0.012529999999999999
Pourquoi le casting est-il moins précis que l’affectation directe ?Puis-je compter uniquement sur 8 chiffres d'exactitude si j'élargis la précision d'un flotteur ?
La solution
Il semble que la réponse à votre question soit évidente.Parce que double
détient plus de précision que float
, vous obtenez une valeur plus précise si vous l'attribuez directement à un double
et perdez en précision si vous passez par un float
.
Quand tu fais float i = 0.012530f;
tu obtiens un float
c'est aussi proche de 0,01253 qu'un float
peut obtenir.À 7 chiffres, cela ressemble à 0.012530
.
Quand tu fais double j = 0.012530;
, vous obtenez un double
c'est aussi proche de 0,01253 qu'un double
peut obtenir.
Si vous lancez le float
à un double
, vous obtenez un double
c'est aussi proche de 0,01253 qu'un float
peut obtenir.
Vous ne pouvez pas vraiment comparer les nombres produits avec différentes précisions pour voir lequel est le plus proche.Par exemple, disons que le nombre correct est 0,5 et que vous disposez de deux approximations, « 0,5001 » et « 0,49 ».Clairement, le premier est meilleur.Mais si vous affichez le premier avec 5 chiffres décimaux « 0,5001 » et le second avec un seul chiffre décimal « 0,5 », le second semble de plus près.Votre première sortie a ce genre de précision fausse et apparente en raison de l'affichage avec peu de chiffres et d'un arrondi chanceux.