2016-02-26 3 views
0

Chaque fois que je saisis un nombre dans ce programme, le programme renvoie une valeur inférieure de 1 au résultat réel ... Quel est le problème ici?La fonction de puissance renvoie 1 résultat de moins

#include<stdio.h> 
#include<math.h> 
int main(void) 
{ 
    int a,b,c,n; 

    scanf("%d",&n); 

    c=pow((5),(n)); 

    printf("%d",c); 

} 

enter image description here

+0

int int int int – user3528438

+3

Vous voulez dire que lorsque vous entrez "2", le résultat est "24"? – Ctx

+0

@ user3528438 est-ce un 'int? –

Répondre

0

pow() prend double arguments et retourne un double.

Si vous stockez la valeur de retour dans un int et que vous l'imprimez, vous risquez de ne pas obtenir le résultat souhaité.

+1

Étant donné qu'un 'double' devrait avoir environ 53 bits de précision, et que' int' n'a généralement que 32 bits, la raison n'est pas la conversion elle-même, mais plutôt l'inexactitude dans l'algorithme 'pow()'. – EOF

2

pow() renvoie double, la conversion implicite de double en int est "arrondi vers zéro". Cela dépend du comportement de la fonction pow().

Si c'est parfait alors pas de problème, la conversion est exacte.

Dans le cas contraire:

1) le résultat est légèrement plus grande, la conversion arrondit vers le bas à la valeur attendue. 2) Si le résultat est légèrement plus petit, la conversion s'arrêtera, ce qui est ce que vous voyez.

solution :

Modifier la conversion en "tour entier le plus proche" en utilisant rounding functions

c=lround(pow((5),(n))); 

Dans ce cas, tant que pow() a une erreur inférieure à + -0,5 vous obtiendra le résultat attendu.

0

Si vous avez besoin de résultats précis pour les grands nombres, vous devez utiliser une bibliothèque mathématique de précision arbitraire telle que GMP. C'est simple:

#include <stdio.h> 
#include <math.h> 
#include <gmp.h> 

int main(void) { 
    int n; 
    mpz_t c; 

    scanf("%d",&n); 
    mpz_ui_pow_ui(c, 5, n); 
    gmp_printf("%Zd\n", c); 

    return 0; 
}