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
Antwort
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)
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. –
Vielen Dank! Das hat mich wirklich verwirrt. Ich wusste nicht einmal, dass das eine Sache war. – LexieStark
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.
- 1. Tuples Lesbarkeit: [0,0] vs (0,0)
- 2. Typen für große Zahlen
- 3. Große Zahlen behalten
- 4. C: Drucken große Zahlen
- 5. Warum HashSet unterscheidet 0,0 und -0,0
- 6. Große lua Zahlen werden falsch
- 7. Große ganze Zahlen in C#
- 8. Python Menschen lesbare große Zahlen
- 9. Javascript Summieren große ganze Zahlen
- 10. Große Zahlen in Pascal (Delphi)
- 11. Javascript: große Hex-Zahlen zu manipulieren
- 12. Problem konvertiert IDL
- 13. Große ganze Zahlen, Quadratwurzel, Java und C: Was macht diese Zeile?
- 14. Python Doctest schlägt auf 0,0! = -0,0 - was gibt?
- 15. Perl: script schnell macht große Datei verwenden
- 16. Files.readAllLines - was macht eine "große" Datei aus?
- 17. Generiere große zufällige Folge von eindeutigen Zahlen
- 18. Wie speichern Sie extrem große Zahlen?
- 19. Wie man große Zahlen schneller multipliziert?
- 20. Der beste Python-Sortieralgorithmus für große Zahlen
- 21. Wirklich große Zahlen und Objective-C
- 22. Modulo für große Zahlen, die quadriert werden
- 23. Große Zahlen negativ werden in Haskell
- 24. Go: Wie teilt man große Zahlen?
- 25. Binomialtest in Python für sehr große Zahlen
- 26. Kröte schneidet/rundet große Oracle-Zahlen ab?
- 27. Berechnung Birthday-Wahrscheinlichkeit für große Zahlen
- 28. JSON.parse analysiert/konvertiert große Zahlen falsch
- 29. beliebig große ganze Zahlen in C#
- 30. Wie multipliziert man Terabyte-große Zahlen?
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