2016-09-30 2 views
1

J'essaie de la masse du trou noir au centre de cette galaxie, j'ai la masse dans les masses solaires, mais j'en ai besoin en kg. Cependant quand j'essaye de convertir (1Msolar = 1.989 * 10^30kg) l'idl me donne juste 0.0000. Je n'ai aucune idée de ce que je fais mal et j'ai juste essayé de dire à idl d'imprimer à la fois 1.989 * 10^30 et 1989000000000000000000000000000 et les sorties sont 0.00000 et -1 respectivement. Quelqu'un peut-il s'il vous plaît expliquer pourquoi cela se passe?idl faire de grands nombres = 0.0

+0

ne sait pas IDL mais voici quelques conseils: 1. il ressemble à débordement type de données quel type de données utilisez-vous pour stocker les valeurs? (type: flottant/fixe/arbitraire, nombre de bits par mantisse/exposant ou nombre entier/décimal) 2. il peut y avoir aussi quelque chose de mal avec votre code (que vous n'avez pas fourni) 3. vous pourriez atteindre une barrière de n'importe quelle fonction utilisent. – Spektre

Répondre

3

Il s'agit d'un problème de type erreur de conversion/dépassement de capacité. Lorsque vous utilisez des nombres volumineux, vous devez les définir explicitement comme long ou long64 (c'est-à-dire, nombre entier 64 bits) pour les nombres entiers. Pour les nombres réels, vous pouvez utiliser float ou double et pour ce faire, le plus simple est la suivante:

msun = 1.989d30 

qui équivaut à 1,989 x 10 comme nombre à virgule flottante double précision. Si vous voulez une précision unique, puis le faire ce qui suit:

msun = 1.989e30 

Pour faire un entier long 32- ou 64 bits, il suffit d'utiliser:

msun = 1989L * 10L^(27) 

ou 64 bits

msun = 1989LL * 10LL^(27) 
+0

Oui, cette réponse semble complètement correcte. Juste une note - * tous * langages informatiques qui sont basés sur les types de données C/C++ auront potentiellement ce problème, y compris Matlab. Une différence est que beaucoup de langues par défaut à "doubler" pour tous les numéros, pour éviter ce problème. C'est bien pour faire des calculs simples, mais cela peut être inutile et lent si vous avez d'énormes tableaux de nombres, où chaque double prend 8 octets. En bref, "connaissez vos données" et utilisez le type de données approprié. –

+0

Merci! Cela me déroutait vraiment, je ne savais même pas que c'était une chose. – LexieStark

1

Je suis d'accord avec la réponse de @ honeste_vivere sur les types de débordement et de données, mais j'ajouterais que je change souvent d'unités pour éviter cela. J'ai souvent des densités qui sont d'ordre 1e19/m^3, donc je lance la densité en unités de 1e19/m^3 et ensuite je traite les nombres qui sont d'ordre 1. Ceci empêche les erreurs de maths lors des ajustements des moindres carrés et d'autres opérations comme élever mes données.