2010-11-18 6 views
0

J'utilise Visual C++ 6.0 sur Windows XP. Mon code est le suivant:C++: Problème avec une équation simple?

# include "stdio.h" 
void main() { 
int m,n; 
double sum=0; 
n=65536; 
sum=1.0/(n*n); 
printf("%.20lf",sum); 
return; 
} 

La sortie de mon code est:

1.#INF0000000000000000 

Pourquoi puis-je obtenir la réponse MAL? Comment puis-je calculer correctement 1/(65536*65536)? Je m'attends à obtenir 0.00000000023283064365386962890625.

Merci pour votre aide!

+0

Utilisez le code – Kimtho6

+0

Double n'est pas assez précis pour cette équation. Vous avez besoin de quelque chose de plus précis, comme un long long double. –

Répondre

5

Il existe un dépassement d'entier. Votre peut simplement jeter int doubler avant multiplier:

sum=1.0/(((double)n)*n); 
+0

Merci pour votre aide. – Favorites

+0

Veuillez vérifier ma réponse comme solution correcte. –

0

Il semble que la multiplication des deux déversoirs variables int, parce que 65536 * 65536 ne rentre pas dans 32 bits. Essayez d'utiliser long long ou double pour m et n.

+0

'long long' dopesn't existe sur VC6, IIRC –

0

Vous n'êtes pas sûr des étoiles doubles ** mais vous devez utiliser le type long ou long long pour contenir des entiers de cette taille.

+0

Je crois que les étoiles (' ** ') faisaient partie de la mise en forme de la question originale, les enlevés. –

+0

désolé c'était ma faute, il s'est produit pendant le formatage de l'OP. – stacker

1

n * n est trop grand pour qu'un entier soit maintenu. faites le double.

1

En supposant que vous avez des entiers 32 bits n * n entraîne un dépassement de capacité (4294311936). Entier va de

–2,147,483,648 to +2,147,483,647 

Vous pouvez essayer de déclarer n comme double n = 65536;

+0

Les Nitpickers vous diront qu'il devrait être 'double n = 65536.0;' (le '.0' spécifie qu'il s'agit d'un littéral' 'double'' et non d'un littéral' int'). –

1

lieu de jeter, vous pouvez simplement faire ceci:

double result = 1.0/n/n; 

HTH

0

Remplacer somme = 1.0/(n * n); par somme = 1,0/(double) n/(double) n; la raison est un débordement d'entier (32 bits), suivi d'un cast manquant (secondaire).