Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Extended mit zu geringer Genauigkeit!
GR-Thunderstorm - Mo 18.06.12 07:47
Titel: Extended mit zu geringer Genauigkeit!
Ich nutze noch Delphi 7 und sitze an einem Programm, mit dem ich Messwerte simulieren möchte. Dabei treten Zahlen bis hoch zu 10^2000 auf. Mein Problem: Ich benötige jede einzige Stelle und nicht nur die ersten 20! Noch besser wären zusätzlich noch mindestens 10 Nachkommastellen.
Was für Möglichkeiten bleiben mir da?
Was denkt ihr von der Idee, ein Array aus mehreren Zahlen zu verwenden?
Delphi-Laie - Mo 18.06.12 08:32
GR-Thunderstorm hat folgendes geschrieben : |
Ich nutze noch Delphi 7 und sitze an einem Programm, mit dem ich Messwerte simulieren möchte. Dabei treten Zahlen bis hoch zu 10^2000 auf. Mein Problem: Ich benötige jede einzige Stelle und nicht nur die ersten 20! |
Was immer da simuliert wird, Meßwerte können es jedenfalls nicht sein. Die Welt, in der wir leben, umfaßt nämlich nicht einmal ansatzweise 2000 Größenordnungen. Sogar von der Elementarlänge bis zur Ausdehung des Universums, vom Zeitelement bis zur vermuteten Lebensdauer des Universums sind es höchstens ein paar Dutzend.
GR-Thunderstorm - Mo 18.06.12 09:00
Moderiert von
Narses: Komplett-Zitat des letzten Beitrags entfernt.
Die Messwerte werden hinterher durch einen Wert dividiert, der "nur" um die größenordnung von 10^1980 (oder ähnlich) darüber liegt.
Und Bspw. 10^2000 / (10^2000 + 10^1984) ist nunmal nicht 1,000000000000000000000000000000000000000000000000000000000000000..000 sondern irgendetwas knapp darunter!
Danke an jaenicke für den Tipp, das schaue ich mir auf alle Fälle mal an. :)
Delphi-Laie - Mo 18.06.12 09:08
GR-Thunderstorm hat folgendes geschrieben : |
Und Bspw. 10^2000 / (10^2000 + 10^1984) ist nunmal nicht 1,000000000000000000000000000000000000000000000000000000000000000..000 sondern irgendetwas knapp darunter! |
Auweia, da schlägt die Mathematik aber Purzelbäume: 10^2000/10^1984=10^(2000-1984)=10^16 (einfaches Potenzrechnen, gibt es sogar bis hinab zu "niederen" Schulformen). Dafür benötigt man keine Langzahlarithmetik. Edit: OK, das war MEIN Fehler, MEIN Lesen Deines Beitrages schlug Purzelbäume. Etwa an/ab der 16. Stelle nach dem Komma werden die Ziffern von 0 abzuweichen beginnen, aus eben diesem Grunde. Warum Meßwerte solch unrealistischen Berechnungen unterworfen werden, ist allerdings nach wie vor rätselhaft.
Langzahlunits gibt es übrigens einige, aber ich favorisiere auch die von Benny Baumann. Seine Unit ist allerdings nur für Langzahlen geeignet, es gibt nur eine Division, die einen Nachkommaanteil ausgibt, und den auch nicht gerade sonderlich lang.
GR-Thunderstorm - Mo 18.06.12 09:17
Delphi-Laie hat folgendes geschrieben : |
GR-Thunderstorm hat folgendes geschrieben: | Und Bspw. 10^2000 / (10^2000 + 10^1984) ist nunmal nicht 1,000000000000000000000000000000000000000000000000000000000000000..000 sondern irgendetwas knapp darunter! |
Auweia, da schlägt die Mathematik aber Purzelbäume: 10^2000/10^1984=10^(2000-1984)=10^16 (einfaches Potenzrechnen, gibt es sogar bis hinab zu "niederen" Schulformen). Dafür benötigt man keine Langzahlarithmetik.
Langzahlunits gibt es übrigens einige, aber ich favorisieren auch die von Benny Baumann. |
Ja im Kopf kann ich das auch rechnen. Um so schlimmer, dass Delphi das nicht mit Boardmitteln kann! Aber das war auch nur ein Beispiel!
Wenn du etwas realistischere Zahlen haben möchtest (auch nur Beispiele!):
Pi*10^1900 / (Pi*10^1900 + exp(6895)/(1*10^1010))
Viel Spaß beim Rechnen. ;)
PS: Programme schreibt man, damit solche Dinge automatisiert ablaufen und ggf. auch noch gleich in Graphen oder ähnliches geplottet werden können, wie es bei mir der Fall ist (bzw. sein soll). Würde ich die Rechenarbeit auf dem Papier machen (für etwa ~10^20 verschiedene Zahlenpaare) säße ich für den Rest meines Lebens daran.
Delphi-Laie - Mo 18.06.12 09:24
GR-Thunderstorm hat folgendes geschrieben : |
PS: Programme schreibt man, damit solche Dinge automatisiert ablaufen und ggf. auch noch gleich in Graphen oder ähnliches geplottet werden können, wie es bei mir der Fall ist (bzw. sein soll). Würde ich die Rechenarbeit auf dem Papier machen (für etwa ~10^20 verschiedene Zahlenpaare) säße ich für den Rest meines Lebens daran. |
Hier muß ich schon wieder einhaken: 10^20 (!!) Zahlenpaare zu berechnen, reicht - grobe Gefühlsschätzung - auch der "Rest des Lebens" eines Computers nimmer aus, so fleißig und schnell Dein kleiner Rechenfreund auch sein mag!
Rechnen (lassen) kannst Du natürlich, was Deinem Computer und Dir beliebt, Du mußt Dich da in keiner Weise rechtfertigen, nur was da berechnet werden soll, kann so, wie Du es hier darstellst, nicht stimmen.
Gammatester - Mo 18.06.12 09:34
GR-Thunderstorm hat folgendes geschrieben : |
Wenn du etwas realistischere Zahlen haben möchtest (auch nur Beispiele!):
Pi*10^1900 / (Pi*10^1900 + exp(6895)/(1*10^1010))
Viel Spaß beim Rechnen. ;)
|
Wo ist das Problem. Mit dem zitierten Opensource MPArith-Beispielprogramm:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| MPArith>t_rcalc.exe Test of MPArith V1.20.24 (31/32 bit) [mp_rcalc] (c) W.Ehrhardt 2008-2012 Karatsuba cutoffs: mul/sqr = 16/32 Toom-3, BZ cutoffs: mul/sqr = 32/64, div = 32 Type "?<enter>" to get some info about commands, "\q" or "quit" to end. Current bit precision = 240 (max:120000), decimal precision = 72.2
[D]:=> Pi*10^1900 / (Pi*10^1900 + exp(6895)/(1*10^1010)) Result = 1.08817100524558486667773617784084533304173281530687647522758E-84 [D]:=> . Time = 1.581 ms |
oder mit mehr als 1200-Dezimalstellen Rechengenauigkeit
Quelltext
1: 2: 3: 4: 5:
| New bit precision = 4000, decimal precision = 1204.1 [D]:=> Pi*10^1900 / (Pi*10^1900 + exp(6895)/(1*10^1010)) Result = 1.08817100524558486667773617784084533304173281530687647522758E-84 [D]:=> . Time = 77.347 ms |
GR-Thunderstorm - Mo 18.06.12 09:50
Gammatester hat folgendes geschrieben : |
Wo ist das Problem. |
Das ich mich rechtfertigen muss, weshalb ich ein wenig genauer rechnen möchte. ;)
Edit: Deinen Link habe ich vorher vollkommen übersehen, vielen Dank dafür! :)
Tranx - Mo 18.06.12 16:45
Wenn Du schon so genau rechnen willst, dann aber bitte auch PI mit 1980 Stellen.
Also - abseits von theoretischen Überlegungen - der Sinn erschließt sich mir immer noch nicht. PI mit 10^1910 zu multiplizieren .. Da muss ich dem Vortexter Recht geben. Selbst das Universum mit seinen Clustern und Superclustern hat sicher nicht mal 1 10^-1000-stel der Atome. Klar ist das Ergebnis:
10^2000/(10^2000 + 10^1980) kleiner als 1. Und um wieviel? Nun: um 10^-20 kleiner. Ich gebe zu, die Differenz ist sehr ungenau. ;)
Aber mit pi auf 30 Stellen zu rechnen, und dann Exponentialfunktionen ebenfalls auf 30 Stellen, das führt letztlich doch zu einem genau so großen Fehler, als wenn man gleich überschlagsmäßig rechnen würde.
Aber ich gebe Dir Recht. Du musst Dich nicht rechtfertigen. Aber ich darf doch mal den Sinn in Frage stellen, oder?
Gausi - Mo 18.06.12 17:17
Wenn ich das richtig sehe, geht es hier nicht um 2000-Stellen-Genauigkeit, sondern um 30 oder vielleicht auch 50. Die Zahlen sind nur generell *etwas* größer. Die normalen Datentypen liefern diese hohe Genauigkeit nicht, Alternativen wurden ja bereits genannt, wobei ich die Integer-Units hier rauslassen würde.
Wollte ich nur mal einwerfen, damit die Diskussion bzgl. "Diese Genauigkeit braucht kein Mensch" nicht allzusehr ausufert. ;-)
GR-Thunderstorm - Mo 18.06.12 17:35
Tranx hat folgendes geschrieben : |
Wenn Du schon so genau rechnen willst, dann aber bitte auch PI mit 1980 Stellen.
Also - abseits von theoretischen Überlegungen - der Sinn erschließt sich mir immer noch nicht. PI mit 10^1910 zu multiplizieren .. Da muss ich dem Vortexter Recht geben. Selbst das Universum mit seinen Clustern und Superclustern hat sicher nicht mal 1 10^-1000-stel der Atome. Klar ist das Ergebnis:
10^2000/(10^2000 + 10^1980) kleiner als 1. Und um wieviel? Nun: um 10^-20 kleiner. Ich gebe zu, die Differenz ist sehr ungenau. ;)
Aber mit pi auf 30 Stellen zu rechnen, und dann Exponentialfunktionen ebenfalls auf 30 Stellen, das führt letztlich doch zu einem genau so großen Fehler, als wenn man gleich überschlagsmäßig rechnen würde.
Aber ich gebe Dir Recht. Du musst Dich nicht rechtfertigen. Aber ich darf doch mal den Sinn in Frage stellen, oder? |
Das mit der Zahl Pi war auch nur ein Beispiel und vollkommen aus der Luft gegriffen.
Fakt ist jedenfalls: Ich brauche mehr Genauigkeit.
Dem ersten Blick nach sollte die MPArith-Library super geeignet sein dafür. Danke für den Hinweis! :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!