Wie mehr Dezimalstellen berechnen?

Anfängerfragen zum Programmieren mit PureBasic.
Andy76
Beiträge: 11
Registriert: 07.02.2007 15:26

Wie mehr Dezimalstellen berechnen?

Beitrag 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
PB 4.02
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
LukasBanana
Beiträge: 150
Registriert: 14.03.2007 19:13
Kontaktdaten:

Beitrag 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! :)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
LukasBanana
Beiträge: 150
Registriert: 14.03.2007 19:13
Kontaktdaten:

Beitrag 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!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
LukasBanana
Beiträge: 150
Registriert: 14.03.2007 19:13
Kontaktdaten:

Beitrag 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!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
LukasBanana
Beiträge: 150
Registriert: 14.03.2007 19:13
Kontaktdaten:

Beitrag 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!
Antworten