Autor |
Beitrag |
5M17H
      
Beiträge: 164
XP, Vista32, bald auch Vista64
PHP(3/5), Delphi(2), Java(1), C(3), C#(1)
|
Verfasst: Di 21.10.08 11:00
Hey all.
Rechnen mit Strings ist mit + und - ja ur easy.
Ich habe irgendwann versucht ein Programm zu schreiben was PI annährt, aber der DOUBLE-wert ist auf 16 stellen nach dem komma abgebrochen.
Nun habe ich überlegt wie ich ungenauigkeiten verhindern kann, und bin zu dem Schluss gekommen, das zumindest + und - wunderbar als String behandelt werden können, so ist es möglich Zahlen in N-Stellenbereich zu addiren oder Subtrahieren.
Nur wie sieht es aus mit * und /.... Weil:
15023 / 239 ~ 62,86
Als String würde ich immer 3er blocks nehmen, nur würde dann
"023" / "239" = 0,096
und
"15" / "0,239" = 62,761
0,096 + 62,761 ~62,86
ergeben auch 62,86 aber da muss ich auch wieder mit Variablen arbeiten...
Gibt es irgendeine Möglichkeit quasi nur mit Int werden einen String durch einen String zu teilen?
Ich dachte bevor ich wieder irgendwas kaputtes ausdenke schmeiße ich diese These mal ins Forum mal sehen wer hier konstruktive Kritik ansagt.
Währe mal an eurer Meinung interessiert ob mein kleines vorhaben (die 4 Rechengrundarten nur mit Strings und Ints durchzuführen) aufgeht...
|
|
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 21.10.08 11:10
Dann gibs ja noch Extended.Ich meine mit 20 Stellen hinter'm Komma!
|
|
5M17H 
      
Beiträge: 164
XP, Vista32, bald auch Vista64
PHP(3/5), Delphi(2), Java(1), C(3), C#(1)
|
Verfasst: Di 21.10.08 11:53
Naja es geht jetzt ja um meine These mit String-rechnerei...
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 21.10.08 12:14
Sowas hab ich mir auch schon überlegt. 20 Stellen nach dem Komma... Naja, aber irgendwo her muss das ja kommen, dass so viel mehr Stellen bekannt sind.
Wie hast du das mit dem Pi gemacht? Ich hatte das mal so, natürlich aber mit Standardtypen:
Quelltext 1:
| 100000000000000000*(1/2)*2*sin(180/100000000000000000) |
Und natürlich mit deg als Winkelformat. Du kannst diese Rechnung natürlich nicht für Forschungszwecke gebrauchen, weil du ja sonst DEG wieder in RAD umrechnen müsstest, und dann wird ja mit dem vorhandenen, "ungenauen" Pi gearbeitet.
Zu deinem Problem: Rechne doch einfach schriftlich, so wie man das in der Schule gelernt hat. 
|
|
5M17H 
      
Beiträge: 164
XP, Vista32, bald auch Vista64
PHP(3/5), Delphi(2), Java(1), C(3), C#(1)
|
Verfasst: Di 21.10.08 12:32
Abgesehen davon das ich ca. 0 Verstanden habe...
Wikipedia -> Kreiszahl PI -> formel suchen...
Und dann mit Double arbeiten, ist aber wegen compiler-ungenauigkeit bei 16 tellen nach dem komma abgeriegelt.
Das ding ist mit dem String könnte ich die Stellen nach dem komma wiederum al ganze Zahl verwenden und somit unendlich stellen als Zahlenwert haben.
Egal wieviele Stellen vor oder nach dem Komma, solange die Festplatte ausreicht, is alles Chillig.
Man könnte es sogar so umwandeln dass man pro Byte 256Zahlen speichern könnte...
Aber erstmal müsste ich die Grundrechenarten damit rechnen können...
Ich weiß aber nicht ob ich dafür genug Kopf habe, um alles so hinzubiegen das möglichst keine komma-zahlen beim rechnen entstehen...
|
|
Allesquarks
      
Beiträge: 510
Win XP Prof
Delphi 7 E
|
Verfasst: Di 21.10.08 13:39
Das ist keine Compilerungenauigkeit sondern eine Prozessorungenauigkeit. Ich würde dir auch vorschlagen, dass du einfach wie in der Schule in der dritten Klasse Zahlen addierst. Gerade mit Multiplikation und Division geht das selbst bei Kommazahlen praktisch analog zu ganzen Zahlen. Nur beim addieren und subtrahieren musst du bei Kommazahlen die strings dann üblicherweise "ausrichten".
Es gibt hierzu eine Menge Threads im Forum die teilweise bignum heißen unter langzahlarithmetik sollte man auch was finden und große Zahlen erst recht.
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 21.10.08 14:28
Ich würde auch empfehlen statt strings ein
Delphi-Quelltext
zu nehmen, oder gleich mit der basis 256 zu rechnen (Speichersparender).
Zuletzt bearbeitet von Boldar am Di 21.10.08 16:32, insgesamt 1-mal bearbeitet
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Di 21.10.08 16:28
Boldar hat folgendes geschrieben : | ... oder gleich mit der basis 156 zu rechnen (Speichersparender). |
Meinst wohl 256?
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 21.10.08 16:32
ja...
habs oben korrigiert.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 21.10.08 16:55
Theoretisch wär doch auch möglich, mit BigNum und auf Basis des wissenschaftlichen Formats zu rechnen:
Delphi-Quelltext
Wenn du für x und n jeweils ein BigNum einsetzt, kannst du beliebig genau rechnen. Im Gegensatz zur Normdarstellung allerdings rechnest du mit einer ganze Zahl für x, die Kommaverschiebung ist in n gespeichert.
Zuletzt bearbeitet von Yogu am Di 21.10.08 19:18, insgesamt 1-mal bearbeitet
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Di 21.10.08 18:45
Die Methode als solches ist eig. schon ziemlich speicherschonend. 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 22.10.08 00:30
Jap. bedarf aber etwas Book Keeping. Hierzu einfach mal die Implementierungen von BigNum_Lib und Bignum2 vergleicht.
In BigNum2 ist dieses Book Keeping bisher nicht implementiert, dazu fehlt mir bisher die Zeit ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|