2017-08-16 5 views
0
#include <stdio.h> 

int main() { 
float k; 
    scanf("%f", &k); 
    printf("%f", k); 
} 

Dans ce programme simple, lorsque j'entre un numéro contenant au maximum 8 chiffres, il s'affiche correctement. Mais si je dépasse 8 chiffres, c'est-à-dire pour l'entrée 123456789, la sortie est 123456792.Pourquoi scanf prend-il une mauvaise entrée pour les grands nombres flottants?

Pourquoi cela se produit-il? Eh bien, le fait amusant est que si j'entre un nombre entre 123456789 et 123456796 alors il montre toujours 123456792.

S'agit-il d'un élément lié à la précision décimale des nombres flottants?

+1

https://stackoverflow.com/questions/12560291/set-back-default-precision-c –

+4

@HariomSingh Comment cette question liée est-elle liée? Ce n'est même pas dans la même langue. – Toby

+0

@Toby question a été à l'origine balisé avec [tag: C++], supprimé car ni le code ni le texte ne fait référence à C++. –

Répondre

5

Les types à virgule flottante ont une précision limitée. Pour un float sur votre machine, qui semble être 32 bits, il a 24 bits de précision (23 explicitement stockés, 1 implicite). Cela signifie que les entiers supérieurs à ~ 16000000, qui nécessitent plus de 24 bits pour stocker, ne peuvent pas être représentés exactement avec ce type de données.

Par exemple, la valeur de 123.456.789 vous avez utilisé a une représentation binaire:

111 0101 1011 1100 1101 0001 0101 

Cette valeur reprend 27 bits qui est plus que ce qui est disponible. Il est donc arrondi à la valeur la plus proche qui peut être stocké avec 23 bits, ce qui est 123456792. en binaire:

111 0101 1011 1100 1101 0001 1000 

Pour cette valeur, les 3 bits inférieurs à la valeur 0 ne sont pas explicitement stockées.

+0

Off par 1: Le ~ 16000000 est à peu près correct, mais le 'float' typique a 24 bits de précision. 23 sont directement codés et 1 implicite. Cette première conversion inexacte d'un entier en 'float' est avec 16,777,217 (0x1000001), un entier de 25 bits. – chux

+1

@chux Bonne prise. Mis à jour pour refléter. – dbush