2012-11-23 1 views
0

J'essaie de convertir une valeur double en une exponentielle, mais je reçois une erreur d'arrondi.C double à exponentielle ronde erreur

int main (unsigned int argc, char **argv) 
{ 
    float a=293.17; 
    float b=293.10; 
    double ULfreq = 2089.555000; 
    double upfreq = 0.0; 
    long int t = 0; 
    long int u = 0; 

    upfreq = ULfreq * 1000000.0; 

    printf(" %f, upfreq:%22.16E\n", upfreq, upfreq); 

    return 0; 
} 

Quand je lance ce code sur un ordinateur 32 bits je reçois le résultat suivant:

2089555000.000000, upfreq:2.0895549999999998E+09 

Courir sur un processeur 64 bits donne la bonne réponse.

Est-il possible de faire fonctionner cette conversion sur un serveur 32 bits et comment?

+0

Merci de ne pas avoir fait le code copier & pasteable ... – glglgl

+1

@glglgl J'ai fait une modification sur son post, il devrait être visible pour vous maintenant ou très bientôt. – Jite

+0

super, merci beaucoup! – glglgl

Répondre

4

Ce n'est pas une erreur d'arrondi, mais une représentation de points flottants. La plupart des fractions courtes telles que 1.1 sont des séries infinies dans la base 2 (comme 1/3 = 0.3333 ... dans la base 10). Ainsi, il faut l'écrêter quelque part. Lorsque converti en décimal, 2.08955499999 est ce que vous obtenez.

Dans le premier cas, vous demandez à la fonction printf de l'arrondir à la précision par défaut de% f, soit 6 décimales après le séparateur décimal. Dans le second cas vous demandez 22 chiffres de précision et obtenez cela ...

+0

'base 10' attendre, est-ce deux ou dix ;-) – slebetman