web-dev-qa-db-fra.com

Pow () fonctionne-t-il pour le type de données int en C?

J'écrivais simplement un programme pour calculer la puissance d'un entier. Mais la sortie n'était pas comme prévu. Cela a fonctionné pour tous les nombres entiers à l'exception de puissance de 5.

Mon code est:

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

int main(void)
{
  int a,b;
  printf("Enter the number.");
  scanf("\n%d",&a);
  b=pow(a,2);
  printf("\n%d",b);
}

La sortie est quelque chose comme ceci:

"Enter the number. 2
 4
"Enter the number. 5
 24
"Enter the number. 4
 16
"Enter the number. 10
 99

Ne pouvons-nous pas utiliser la fonction pow() pour le type de données int ??

13
basanta

La précision en virgule flottante fait son travail ici. Le fonctionnement réel de pow utilise log

pow(a, 2) ==> exp(log(a) * 2)

Regarder math.h bibliothèque qui dit:

<math.h>

/ * Une précision excessive lors de l'utilisation d'une mantisse 64 bits pour les opérations mathématiques FPU peut entraîner des résultats inattendus avec certaines des fonctions mathématiques MSVCRT. Par exemple, à moins que la valeur de retour de la fonction ne soit stockée (tronquée à une mantisse de 53 bits), les appels à pow avec à la fois x et y comme valeurs intégrales produisent parfois un résultat non intégral. ... * /

Ajoutez simplement 0.5 à la valeur de retour de pow, puis convertissez-la en int.

b = (int)(pow(a,2) + 0.5);  

Donc, la réponse à votre question

Pow () fonctionne-t-il pour le type de données int en C?

Pas toujours. Pour l'exponentiation d'entiers, vous pouvez implémenter votre propre fonction (cela ne fonctionnera que pour les entiers + ve):

int int_pow(int base, int exp)
{
    int result = 1;
    while (exp)
    {
        if (exp & 1)
           result *= base;
        exp /= 2;
        base *= base;
    }
    return result;
}
15
haccks

La fonction de bibliothèque C double pow (double x, double y)

Il faut du double type

3
ANjaNA

il n'y a pas de poudre à base d'int. Ce dont vous souffrez, c'est d'une troncature à virgule flottante.

un pow basé sur int est trop contraint (la plage des entrées déborderait rapidement un int). Dans de nombreux cas, la puissance basée sur l'int, comme dans votre cas où ses puissances de 2 peuvent être faites efficacement d'autres façons.

3
Keith Nicholas

printf("%a", pow(10, 2)) et voyez ce que vous obtenez; Je suppose que vous verrez que vous n'avez pas tout à fait obtenez 100. Appelez lround si vous voulez arrondir au lieu de tronquer.

2
Carl Norum