L'exécution d'une expérience rapide liées à la double Multiplication Cassé dans .NET? et la lecture de quelques articles sur le C# mise en forme de chaîne, j'ai pensé que cela:
{
double i = 10 * 0.69;
Console.WriteLine(i);
Console.WriteLine(String.Format(" {0:F20}", i));
Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i));
Console.WriteLine(String.Format("= {0:F20}", 6.9));
}
Serait le C# équivalent de ce code C:
{
double i = 10 * 0.69;
printf ( "%f\n", i );
printf ( " %.20f\n", i );
printf ( "+ %.20f\n", 6.9 - i );
printf ( "= %.20f\n", 6.9 );
}
Cependant, le C# produit de la sortie:
6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000
en dépit de je en montrant égale à la valeur 6.89999999999999946709 (plutôt que de 6.9) dans le débogueur.
par rapport à C, ce qui montre la précision demandée par le format:
6.900000
6.89999999999999946709
+ 0.00000000000000088818
= 6.90000000000000035527
Ce qui se passe?
( Microsoft .NET Framework Version 3.51 SP1 / Visual Studio C# 2008 Express Edition )
J'ai une formation en calcul numérique et de l'expérience de mise en œuvre de l'arithmétique d'intervalle - une technique pour estimer les erreurs dues à la limite de la précision, compliqué numérique de systèmes sur différentes plates-formes. Pour obtenir la prime, ne pas essayer de l'expliquer sur le stockage de précision - dans ce cas, c'est une différence de un ULP de 64 bits en double.
Pour obtenir la prime, je veux savoir comment (ou si) .Net permet de formater un double de la demande de précision visible dans le code C.