Ce code est erroné parce que dans math.h, sqrt est défini comme double sqrt(double v);
et parce que le calcul flottant de points ne sont pas nécessairement exactes.
Cette ligne long double dbl=(long)sqrt(n);
fait beaucoup de chose:
- convertit n à une double valeur (implicite)
- calcule la racine carrée de la valeur double en une double
- convertit le résultat d'un long int (pourquoi?)
- convertit le long int retour à long double (encore une fois pourquoi?)
sE cond un int in=sqrt(n);
fait presque la même (pour le début et petites valeurs):
- convertit n à un double (implicite)
- calcule la racine carrée de la valeur double en une double
- convertir le résultat un int
Ensuite, vous test:
- convertit la valeur
in
à une longue double (puisque l'autre partie est)
- compare les 2 valeurs doubles
Donc, dans les deux parties que vous faites exactement les mêmes opérations de sorte que le résultat ne peut pas être ce que vous voulez.
Comme d'autres ont dit, vous devez:
- calculer la (double) racine carrée de n converti en double
- autour d'elle à un int (rond et pas tronquer pour éviter les problèmes de précision stupide)
- comparer la place de cette int à votre n initial:
code:
#include<stdio.h>
#include<math.h>
int main(){
long int n;
while(scanf("%ld",&n)==1&& n!=0)
{
double dbl=sqrt((double) n);
int in=(int) (dbl + 0.5);
if(in * in == n)
printf("yes\n\n");
else
printf("no\n\n");
}
return 0;
}
Si vous voulez vérifier si un nombre est un carré parfait, vous devriez vérifier si 'in * in == n' ou' in == sqrt (n) '. Votre test est redondant car 'dbl' et' in' sont des représentations entières de la racine. –
est-il résolu ???? – coderredoc
Quelle est l'erreur que vous obtenez? erreur de représentation ou WA? – coderredoc