2016-09-30 1 views
1

Ich versuche, die Masse des Schwarzen Lochs im Zentrum dieser Galaxie, habe ich die Masse in Sonnenmassen, aber brauche es in kg. Aber wenn ich versuche zu konvertieren (1Msolar = 1.989 * 10^30kg) idl gibt mir nur 0,0000. Ich habe keine Ahnung, was ich falsch mache, und ich versuchte, Idl zu sagen, sowohl 1.989 * 10^30 und 1989000000000000000000000000000 zu drucken und die Ausgaben sind 0,00000 bzw. -1. Kann jemand bitte erklären, warum das passiert?Idl macht große Zahlen = 0,0

+0

kenne IDL nicht, aber hier ein paar Hinweise: 1. Es sieht aus wie 'Datentypen' Überlauf was' Dateityp' benutzt du zum Speichern der Werte? (Typ: Floating/Fixed/Beliebig, Anzahl der Bits pro Mantisse/Exponent oder Integer/Dezimal) 2. Es kann auch etwas mit Ihrem Code nicht stimmen (was Sie nicht angegeben haben) 3. Sie könnten irgendeine Barriere von irgendeiner Funktion treffen benutzen. – Spektre

Antwort

3

Dies ist ein Typkonvertierungsfehler/Überlaufproblem. Wenn Sie große Zahlen verwenden, müssen Sie sie entweder explizit als long oder long64 (d. H. 64-Bit lange ganze Zahl) für ganze Zahlen definieren. Für reelle Zahlen Sie diese float oder double und tun können, ist der einfachste Weg, die folgenden:

msun = 1.989d30 

, die zu 1.989 x 10 als doppelter Genauigkeit Gleitkommazahl entspricht. Wenn Sie mit einfacher Genauigkeit wollen, dann tun Sie nur die folgenden:

msun = 1.989e30 

Um einen 32- oder 64-Bit-long integer zu machen, benutzen Sie einfach:

msun = 1989L * 10L^(27) 

oder für 64-Bit-

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

Ja, diese Antwort sieht völlig korrekt aus. Nur eine Anmerkung - * alle * Computersprachen, die auf C/C++ - Datentypen basieren, haben möglicherweise dieses Problem, einschließlich Matlab. Ein Unterschied besteht darin, dass viele Sprachen standardmäßig auf "doppelt" für alle Zahlen eingestellt sind, um dieses Problem zu vermeiden. Das ist gut für einfache Berechnungen, aber kann verschwenderisch und langsam sein, wenn Sie riesige Arrays von Zahlen haben, wobei jedes Doppel 8 Bytes belegt. Kurz gesagt, "kenne deine Daten" und verwende den passenden Datentyp. –

+0

Vielen Dank! Das hat mich wirklich verwirrt. Ich wusste nicht einmal, dass das eine Sache war. – LexieStark

1

Ich stimme @ honeste_vivere's Antwort über Überlauf und Datentypen zu, aber ich würde hinzufügen, dass ich oft Einheiten ändern, um dies zu vermeiden. Ich habe häufig Dichten, die in der Reihenfolge 1e19/m^3 liegen, also dichte ich in Einheiten von 1e19/m^3 um und bearbeite dann Zahlen mit der Ordnung 1. Dies verhindert mathematische Fehler während der Anpassung der kleinsten Quadrate und anderer Operationen, die etwas bewirken könnten wie zum Quadrieren meiner Daten.