Question

long long int A = 3289168178315264;
long long int B = 1470960727228416;
double D = sqrt(5);

long long int out = A + B*D;

printf("%lld",out);

Ceci donne le résultat: -2147483648

Je ne suis pas capable de comprendre pourquoi (ce devrait être un résultat positif). Quelqu'un peut-il aider?

Était-ce utile?

La solution

Je pense que le compilateur doit arrondir le résultat de "A + B * D". en premier, parce que vous stockez le résultat dans un champ int. Donc, fondamentalement, vous rencontrez un conflit de types de données.

A et B sont toujours des nombres valides pour un long long int, qui a une longueur de 8 octets. Vous pouvez même les multiplier par 1 000 tout en conservant des valeurs valables long long int. Dans d’autres langues, il est également appelé int64.

Un double, cependant, correspond également à 64 bits, mais une partie de ceux-ci est utilisée comme exposant. Lorsque vous multipliez un double avec un int64, le résultat serait un autre double. Ajouter un autre int64 à celui-ci garde toujours un double. Ensuite, vous affectez à nouveau le résultat à un int64 sans utiliser de méthode d’arrondi spécifique. Cela ne m'étonnerait pas que le compilateur utilise une fonction d'arrondi à 4 bits pour cela. Je suis même étonné que le compilateur ne vomisse pas et ne se casse pas avec cette déclaration!

Quoi qu'il en soit, lorsque vous utilisez de grands nombres comme ceux-ci, vous devez faire très attention lorsque vous mélangez différents types.

Autres conseils

peut-être devez-vous spécifier ces constantes sous la forme " long long " littéraux? par exemple. 3289168178315264LL

Quel compilateur / système d'exploitation utilisez-vous? J'ai exécuté votre code à l'aide de Visual C ++ 2008 Express Edition sous Windows XP et IT WORKS - answer: 6578336356630528 (il s'agit d'un nombre de 53 bits, il se loge donc parfaitement dans un double).

J'ai également essayé deux variantes pour voir si l'ordre des opérations importait:

long long int = A; out + = B * D;

long long int = B * D; out + = A;

Ces deux fonctionnent aussi bien!

Curieux.

Votre réponse (à vérifier) ??calcule avec succès, mais entraîne un débordement dans le bit de signe, ce qui rend la réponse négative. Solution: ne signez pas toutes vos variables.

Pourquoi:

Les numéros sont stockés sous forme de séries de bits dans la mémoire de votre ordinateur. Le premier bit d'une telle série, lorsqu'il est défini, signifie que votre nombre est négatif. Donc, le calcul fonctionne, mais déborde dans le bit de signe.

Recommandation:

Si vous travaillez avec des nombres aussi gros, je vous recommande de vous procurer une bibliothèque arithmétique multi-précision. Cela vous fera économiser beaucoup de temps et d’ennuis.

Le paramètre à sqrt doit être double .

#include <math.h>
double sqrt( double num );

Et nous devrions aussi expliquer le résultat de B * D trop longtemps.

    long long int A = 3289168178315264;
    long long int B = 1470960727228416;
    double D = sqrt(5.0);
    printf("%f\n",D);
    long long int out = A + (long long) (B * D);
    printf("%lld",out);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top