Seite 1 von 3

Wie mehr Dezimalstellen berechnen?

Verfasst: 12.03.2007 14:13
von Andy76
Hi

wie kann man auf 30 Deziamlstellen ganeu rechnen,
bzw. das auch in einem Stringgaget Ausgeben?

Ich erhalte immer nur max 10 Stellen,
möchte das aber auf 30 Stellen genau ausgeben.

Beispiel:

Code: Alles auswählen

a.d  = 1 / 3
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 40, "Rechner")
    CreateGadgetList(WindowID(0))
    TextGadget(1, 10, 14, 30, 20, "1/3  =") 
    StringGadget(2, 50, 10, 140, 20, StrD(a))
    Debug a
Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
Gruß
Andy

Verfasst: 12.03.2007 14:53
von Kaeru Gaman
eine so große genauigkeit liegt überhaupt nicht vor.

Code: Alles auswählen

a.d  = 1 / 3
Debug StrD(a,30)
wenn du auf 30 nachkommastellen genau berechnen willst, brauchst du eine eigene mathe-Lib,
weil die fließkomma-einheit deiner CPU diese genauigkeit gar nicht leistet.

zu dem thema lies dir mal den wiki-artikel über fließkomma-zahlen rein:
http://de.wikipedia.org/wiki/Flie%C3%9Fkomma-Zahlen

Verfasst: 14.03.2007 20:53
von LukasBanana
Hi, bin grad neu in dem Forum, hab aber vielleicht trotzdem ne Lösung!

Versuch doch einfach mit 'long long' Werten also 'variable.q' (Quad) zu rechnen und dann beim Ausgeben das Komma verschieben.

Vielleicht klappts! :)

Verfasst: 14.03.2007 21:00
von ts-soft
LukasBanana hat geschrieben:Hi, bin grad neu in dem Forum, hab aber vielleicht trotzdem ne Lösung!

Versuch doch einfach mit 'long long' Werten also 'variable.q' (Quad) zu rechnen und dann beim Ausgeben das Komma verschieben.

Vielleicht klappts! :)
Das wird wohl nichts bringen, Quad gehen von -9223372036854775808 bis
+9223372036854775807, haben also max. 19 stellen. Davon 30
Nachkommastellen abknabbern halte ich mal für unmöglich :wink:

Verfasst: 14.03.2007 21:18
von LukasBanana
"immer hin mehr als 10 Stellen!" :roll:

Ne bessere Lösung hab ich aber auch nicht :|

Aber da kommte man mit PureBasic bei VariablenGrößen eben an seine Grenzen!

Verfasst: 14.03.2007 21:18
von Kaeru Gaman
@Lukas

für viele andere anwendungen, auch innerhalb von games, ist das von dir
beschriebene Fixkomma-Verfahren durchaus gut und bestens geeignet.
ich propagiere es auch regelmäßig, weil es eben einfach genau rechnet,
im gegensatz zu gleitkomma zahlen, die fast nie wirklich genau sind.

...aber für eine anwendung mit 30 nachkommastellen
(und dann ja bestimmt auch noch 20 vorkomma-stellen minimum)
braucht man definitiv zusätzliche mathe routinen, die zahlen ganz anders speichern.

> Aber da kommte man mit PureBasic bei VariablenGrößen eben an seine Grenzen!

nicht nur mit PB!

kaum eine 32bit programmiersprache hat nativ größere variablen als 64bit...

Verfasst: 14.03.2007 21:23
von ts-soft
>> Aber da kommte man mit PureBasic bei VariablenGrößen eben an seine Grenzen!
Das hat nicht viel mit PureBasic zu tun. Quad sind 64-Bit. Die größte
Variablengrösse die mir bekannt ist, hat 80-Bit, also kaum mehr. Mehr kann
die CPU eben nicht direkt verarbeiten.

Er kann sich aber den Source der PBOSL_Bignum Lib laden und verwenden.
Rechnet zwar sehr sehr langsam, dafür mit fast beliebiger Zahlengrösse.

Verfasst: 14.03.2007 21:26
von LukasBanana
Das ist wohl war!

Jedoch hat es schon mein Onkel in C++ geschaft eine Funktion, Klasse oder was auch immer zu programmieren mit der man Variablen mit mehr als 2000 Stellen verwenden kann!

Fragt mich nicht wie. Aber ich habe es auch schon auf Linux gesehn wie man die Zahl PI mit mehr als 2000 Stellen darstellen kann.

Aber im großen und ganzen habt ihr natürlich Recht. Ohne spezielle Funktionen, Strukturen oder Klassen ist es in viellen Programmiersprachen schwer solch große Variablentypen zu verwänden!

Verfasst: 14.03.2007 21:30
von Kaeru Gaman
genau davon sprachen wir doch.

>> braucht man definitiv zusätzliche mathe routinen
...
> Er kann sich aber den Source der PBOSL_Bignum Lib laden und verwenden.

eigene routinen zu schreiben die mit größeren variablen rechnen ist nicht unbedingt das problem...
dummerweise wird das unter umständen ziemlich langsam,
weil man nicht alle abschnitte der großen variablen in die register packen kann und dauernd auf den speicher zugreifen muss...

hm.. nun, wenigstens das aktuell kalkulierte DWord kann man in drei registern halten,
aber zwischen den DWords muss man dann auf den speicher zugreifen...
außerdem dauert es, alle bits einzeln durchzurödeln...

addition und subtraktion kann ich mir ja denken.. wie proggt man eigentlich ne bitweise multiplikation?

Verfasst: 14.03.2007 21:36
von LukasBanana
Wie kann man denn so ne mathe routine in PureBasic selber schreiben wenn man 'nur' die max. Variablen Typen hat?
Von Klassen und solchen Sachen wie in C++ hab ich in PureBasic nähmlich noch nichts gehört!

Aber wie und wer hat es eigendlich geschaft die mciSendString Funktion aus C in PureBasic zu übertragen??? :roll:

Aber klar: langsam sind die Variablen allemal!