Question

#include <stdio.h>
#include <wchar.h> 
int main()
{
    double f = 1717.1800000000001;
    wprintf(L"double      %.20G\n", f);
    return 0;
}

résultats (et attendus ci-dessous) :

double      1717.1800000000000637
double      1717.1800000000001

C'est sur Ubuntu 11.10 x64 (mais aussi lors de la compilation en 32 bits).

Le problème que j'essaie de résoudre est que sous Windows, le numéro est affiché exactement comme dans le code, et je dois effectuer un formatage de bas niveau (swprintf) pour qu'il fonctionne comme sous Windows, pour des problèmes de portabilité.

Était-ce utile?

La solution

1717.1800000000001 n'est pas exactement représentable en double, vous n'obtenez donc qu'une valeur proche de celle-ci dans f.La valeur stockée dans f est exactement 1717,180000000000063664629124104976654052734375.

Le problème est maintenant que Windows ne génère que 17 chiffres significatifs, bien que 20 aient été demandés (ce qui est un bug connu, autant que je sache, il se trouve quelque part dans leur base de données de bogues).

Si vous ne pouvez pas limiter la longueur du champ à une valeur raisonnable (comme "%.17G"), vous avez besoin d'un wrapper pour imiter ce bug.

Autres conseils

wprintf la fonction est implémentée par la bibliothèque C standard, pas par gcc.

Nombre 1717.1800000000001 a 13 chiffres après la virgule flottante.Cependant, il n'a pas de représentation exacte au format binaire à virgule flottante 64 bits.

Format "%.20G" nécessite la sortie de 20 chiffres significatifs, ce qui correspond au nombre de chiffres dans 1717.1800000000000637.Ce résultat correspond donc à ce qui était attendu.Soit la bibliothèque C standard de Windows traite le format différemment, soit elle effectue un arrondi incorrect.

D'un autre côté, vous pouvez exiger un nombre spécifique de chiffres après la virgule flottante en utilisant "%f" format, par ex. "%.13f" arrondit la sortie à exactement 13 chiffres après la virgule flottante et l'imprime 1717.1800000000001 comme prévu.

Eh bien, votre sortie attendue est conflit avec votre chaîne de format."% .20g" signifie que vous voulez 20 chiffres significatifs, et c'est ce que vous obtenez.Si vous voulez 17 chiffres significatifs, lorsque votre production attendue, utilisez «% .17g».

double f = 1717.1800000000001;

Cette ligne de code ne peut pas être exécutée avec précision.La constante a 17 chiffres décimaux de précision, un double a 15,9.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top