pow () renvoie un résultat erroné dans des conditions spécifiques (et une solution inattendue) – Pourquoi tout cela

J’ai créé un programme court pour la mise en œuvre de Sieve of Eratosthenes. Dans le programme, j’ai utilisé int startingPoint qui contenait la valeur du nombre premier actuel, dont les multiplications étaient marquées de non-premier, à partir de son carré. J’ai utilisé la fonction pow () pour calculer le carré du sharepoint départ de la boucle de courant. Ce faisant, je suis tombé sur un phénomène étrange. Quand startingPoint était égal à 5 , puis après int i = pow(startingPoint,2) la valeur de i était 24 au lieu de 25. Ce phénomène ne s’est produit que si startingPoint était égal à 5. Ensuite, j’ai exécuté quelques tests qui ont abouti à à l’extrait de code suivant:

 #include  #include  int main() { int p=5; int num1 = pow(5,2); int num2 = pow(p,2); float num3 = pow(p,2); int num4 = floor(pow(p,2)); std::cout.precision(10); std::cout<<num1<<std::endl; //25 std::cout<<num2<<std::endl; //24 std::cout<<std::fixed<<num3<<std::endl; //25.0000000000 std::cout<<num4<<std::endl; //25 } 

Comme on peut le constater, si j’appelle pow avec les littéraux int , le résultat sera le carré actuel du nombre. Cependant, si j’appelle cela en utilisant int p=5 , alors ce que pow renvoie est en réalité inférieur de 1 à celui attendu. Si je passe le résultat dans une variable float , il reçoit également le résultat correct.

Maintenant, je sais que pow calcule les puissances par approximation. Par conséquent, des erreurs telles que celle-ci lors de la conversion en entier peuvent se produire. Je pourrais juste laisser ça être comme ça. Mais ce qui m’a VRAIMENT fait réfléchir et c’est ce qui se passe avec num4 . pow(p,2) converti en int renvoie 24. Mais floor(pow(p,2)) converti en int renvoie 25. Ainsi, la fonction de floor , qui, selon la norme arrondit un nombre inférieur, rend en quelque sorte la valeur renvoyée exprimée en un valeur entière supérieure.

Ma question en bref: comment cela se passe-t-il? (J’utilisais gcc 5.3.0 à MinGW)

Edit: Comme je l’ai déjà dit dans la question, je peux accepter la raison pour laquelle la valeur de retour de pow est convertie en un entier inférieur, mais ce que je ne peux vraiment pas comprendre (et je n’ai pas vu cela non plus être présenté ailleurs) c’est comment le floor corrige cela. Comment le floor peut floor transformer la valeur de retour de pow en une valeur entière plus élevée? Maintenant, c’est la vraie question.