Autor Beitrag
GR-Thunderstorm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 18.06.12 07:47 
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?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 18.06.12 08:12 
Es gibt dafür (anders als in manchen anderen Sprachen) keinen direkten Datentyp, aber einige Bibliotheken wie diese:
[url]www.entwickler-ecke....02&view=df[/URL]
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 18.06.12 08:32 
user profile iconGR-Thunderstorm hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 18.06.12 09:00 
Moderiert von user profile iconNarses: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 18.06.12 09:08 
user profile iconGR-Thunderstorm hat folgendes geschrieben Zum zitierten Posting springen:
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.


Zuletzt bearbeitet von Delphi-Laie am Mo 18.06.12 09:26, insgesamt 6-mal bearbeitet
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mo 18.06.12 09:11 
Bignum2 versteht 'nur' Ganzzahlarithmetik. Wenn Du große Fließkommazahlen brauchst, kann ich Dir MPArith empfehlen.
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 18.06.12 09:17 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconGR-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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 18.06.12 09:24 
user profile iconGR-Thunderstorm hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mo 18.06.12 09:34 
user profile iconGR-Thunderstorm hat folgendes geschrieben Zum zitierten Posting springen:

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:
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 18.06.12 09:50 
user profile iconGammatester hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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?

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. ;-)

_________________
We are, we were and will not be.
GR-Thunderstorm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 206



BeitragVerfasst: Mo 18.06.12 17:35 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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! :)