2011-10-12 4 views
0

Possible en double:
Floating point comparisonEst-il sortie droit de C programe

J'ai fémi Code et la sortie sort pour être inattendu me

main() 

{ 

    float f1 = 1.0; 

    double f2 = 1.0; 

    if(f1==f2) 

printf("Equal"); 

else 

    printf("unequal"); 

    } 

Je m'attends à ce que la sortie soit "inégale" mais la sortie est égale .why so? Comme le flotteur et le double ont une précision différente, la sortie doit être inégale.

+3

Ici nous allons à nouveau ... S'il vous plaît lire le document suivant avant d'essayer toute autre programmation à virgule flottante: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

S'il vous plaît le lier à la question en double –

+0

@PaulR Ce que j'ai demandé est un peu différent !! –

Répondre

8

La précision est importante uniquement lorsque le nombre ne peut pas être représenté exactement. Puisque les flotteurs et les doubles (étant des valeurs simples et doubles de précision IEEE 754) peuvent représenter exactement 1.0, la précision n'entre pas en ligne de compte.

1.01.0 est fondamentalement un bit de signe nul, tous les bits d'exposant sauf le plus élevé défini sur 1 et aucun ensemble de bits de mantisse. En simple précision, c'est binaire:

0-01111111-00000000000000000000000 

et, pour double précision:

0-01111111111-0000000000000000000000000000000000000000000000000000 

Tous les chiffres sont exactement représentable dans IEEE 754 - par exemple, le 1.1 vous mentionnez dans un commentaire est stocké comme 1.100000023841858 en simple précision. Jetez un oeil à this answer pour un exemple de décodage d'une valeur à virgule flottante.

Harald Schmidt's online single-precision converter est un excellent site pour jouer avec si vous voulez comprendre les formats. Je l'aimais tellement, j'ai fait une version de bureau au cas où il a disparu (et était capable de faire double précision aussi bien).

+0

Pourquoi venir pour la valeur 1.1? –

+0

@Amit, c'est parce que '1.1' n'est pas exactement représentable. Cela revient à être "1.100000023841858" en simple précision. – paxdiablo

2

Ce n'est pas le type, c'est la valeur qu'il compare, et dans ce cas particulier aucune erreur d'approximation ne se produit, donc elles sont égales. Float a un format IEEE754 simple précision et double a le format double précision, et dans les deux le format les valeurs approximatives sont identiques, et aucune erreur ne se produit. Vous pouvez prendre une valeur fractionnaire qui ne peut pas être stockée par float mais par double, et le tester avec votre morceau de code. De telles comparaisons ne devraient pas être faites en code réel, car les débordements et les erreurs d'approximation briseraient l'exécution de manière inattendue (par exemple, la comparaison de flottants dans une boucle).

1

Essayez de faire la même chose avec par exemple .3. Des problèmes apparaissent lorsque les nombres sont périodiques dans la représentation de base 2. Dans tous les cas comparer double et/ou float n'est pas correct, mais je suppose que de votre question vous êtes déjà au courant.