web-dev-qa-db-fra.com

Comment régler la précision d'un float

Est ce que quelqu'un peut m'expliquer comment choisir la précision d'un float avec une fonction C?

Exemples:

theFatFunction(0.666666666, 3) renvoie 0.667

theFatFunction(0.111111111, 3) renvoie 0.111

13
Zat42

Vous ne pouvez pas faire cela, car la précision est déterminée par le type de données (c'est-à-dire float ou double ou long double). Si vous souhaitez l'arrondir à des fins d'impression, vous pouvez utiliser les spécificateurs de format appropriés dans printf(), c'est-à-dire printf("%0.3f\n", 0.666666666).

13
Dan Fego

Tu ne peux pas. La précision dépend entièrement du type de données. Vous avez float et double et le tour est joué.

2
Joe

Les flotteurs ont une précision statique et fixe. Tu ne peux pas le changer. Ce que vous pouvez parfois faire, est autour du nombre.

Voir cette page , et envisagez de vous mettre à l'échelle par des puissances de 10. Notez que tous les nombres ne sont pas exactement représentables sous forme de flottants non plus.

2
unwind

La plupart des systèmes sont conformes à la norme de virgule flottante IEEE-754, qui définit plusieurs types de virgule flottante.

Sur ces systèmes, float correspond généralement au type à précision simple IEEE-754 binary32: il a une précision de 24 bits. double est le type binary64 à double précision; il a 53 bits de précision. La précision en nombre de bits est définie par la norme IEEE-754 et ne peut pas être modifiée.

Lorsque vous imprimez des valeurs de types à virgule flottante à l'aide de fonctions de la famille fprintf (par exemple, printf), la précision correspond au nombre maximal de chiffres significatifs et est définie par défaut à 6 chiffres. Vous pouvez modifier la précision par défaut avec un . suivi d'un nombre décimal dans la spécification de conversion. Par exemple:

printf("%.10f\n", 4.0 * atan(1.0));  // prints 3.1415926536

tandis que

printf("%f\n", 4.0 * atan(1.0));     // prints 3.141593
1
ouah

La précision est déterminée par le type de données (c'est-à-dire float ou double ou long double).

Si vous voulez l'arrondir à des fins d'impression, vous pouvez utiliser les spécificateurs de format appropriés dans printf (), c'est-à-dire 

printf("%0.3f\n", 0.666666666)  //will print 0.667 in c

Maintenant, si vous voulez l'arrondir à des fins de calcul, vous devez d'abord multiplier le flottant par 10 ^ nombre de chiffres, puis transtyper en int, puis effectuer le calcul, puis à nouveau transtyper pour flotter et diviser par la même puissance de 10

float f=0.66666; 
f *= 1000;  // 666.660
int i = (int)f; // 666
i = 2*i;  //  1332
f = i;   //  1332
f /= 1000;  // 1.332
printf("%f",f);  //1.332000
0
abe312