Mit großen Zahlen rechnen z.B Fakultät aus 5000
-
Alpha_Coder schrieb:
Gibt es dafür Mathematische Bibliotheken, und wenn ja welche?
Klar. Guckst du hier.
-
Das ist genau das, was ich gesucht habe.
Dankeschön.

Mfg
Alpha_Coder
-
Ich habe vor wenigen Wochen erst einen C++-Wrapper geschrieben, der mit Brüchen und Fließkommazahlen parallel rechnet, er verwendet GMP und MPFR. Wenn du also auch Wert auf Einfachheit und nicht 100% Konfigurierbarkeit und Performance, sondern nur etwa 80% brauchst, kannst du ja nochmal nachfragen.
-
Mal ganz doof.
Was ist ein Wrapper? :p
Und ja ich würde gern etwas mehr darüber wissen.Mfg
Alpha_Coder
-
Alpha_Coder schrieb:
Mal ganz doof.
Was ist ein Wrapper? :p
Und ja ich würde gern etwas mehr darüber wissen.Klar. Guckst du hier.
-
Ein Wrapper ist so was, was man in C++-Weise verwenden kann, was aber nur C-Sachen benutzt
.Der Unterschied sieht etwa so aus:
Ohne Wrapper:
mpfr_t number; mpfr_init2(number, 1024); //number ist 1024 bits genau mpfr_fac_ui(number, 5000, MPFR_RNDN); //number bekommt die Fakultät von 5000 gesetzt, das Ergebnis wird zum nächstmöglichen Ergebnis gerundet. mp_exp_t exp; //Exponent der Zahl char *str = mpfr_get_str(NULL, 10, 0, number, &exp, MPFR_RNDN); //der String, aber noch ohne Komma und Exponent-Verschiebung //hier musst du noch mühsam den String so ändern, dass der Exponent berücksichtigt wird std::cout << str << "\n"; mpfr_free_str(str); //der String wurde dynamisch alloziert, da wir NULL angegeben haben, also müssen wir ihn mit der entsprechenden Deallokationsfunktion wieder löschen mpfr_clear(number); //den bei number allozierten Speicherplatz wieder freigebenMit Wrappper:
Number num; num = fac(Number(5000)); //fac(5000) würde möglicherweise int fac(int) aufrufen std::cout << num.GetString() << "\n";Hier wird in meinem Fall mit Brüchen gerechnet (höhere Genauigkeit und schneller), während bei pow() oder sqrt() nur Fließkommaoperationen angewendet werden können, das geschieht aber alles automatisch.
Mein Wrapper umfasst jedoch etwa 2000 Zeilen, daher kann ich ihn nicht direkt hier posten
. Wenn du ihn willst, schicke ich ihn dir jedoch per E-Mail.ACHTUNG: Ich habe diese Klasse eher auf Bedienbarkeit und an meine Bedürfnisse angepasst, als an Korrektheit. Daher wird z.B. operator==() manchmal einen kleinen Unterschied zulassen, um Rundungsfehler auszugleichen oder GetString() die Zahl "3.141599999999999999999999999999953789" zu "3.1416" runden.
-
Ja, dass wäre sehr nett, wenn du das machen könntest.

Mfg
Alpha_Coder
-
wxSkip schrieb:
Mit Wrappper:
std::cout << num.GetString() << "\n";Ganz ideal ist dein Wrapper noch nicht.
Trotz allem hätte ich Interesse daran (z.Bsp. als Grundlage für besseren Wrapper). Kannst du ihn nicht irgendwo allgemeinzugänglich unter einer freien Lizenz veröffentlichen?
-
Interessent schrieb:
wxSkip schrieb:
Mit Wrappper:
std::cout << num.GetString() << "\n";Ganz ideal ist dein Wrapper noch nicht.
Trotz allem hätte ich Interesse daran (z.Bsp. als Grundlage für besseren Wrapper). Kannst du ihn nicht irgendwo allgemeinzugänglich unter einer freien Lizenz veröffentlichen?
Hm... kennst du eine freie Filesharing-Börse außer lmgtfy.com?

-
wxSkip schrieb:
kennst du eine freie Filesharing-Börse aus[...] lmgtfy.com?
Klar. Guckst du hier.
Weil du gerade das C Interface vorgeführt hast; sind dir andere Wrapper wie MPFR C++ bekannt?
-

Ja, mir war das C++-Interface bekannt, von MPFR gibt es aber AFAIK keines, außerdem wollte ich nicht doppelt wrappen und beim Wrappen nicht auch noch C und C++ wild durcheinander mischen.
Ich versuchs mal auf einer dieser Börsen, brauche aber noch kurz
-
wxSkip schrieb:
von MPFR gibt es aber AFAIK keines
Doch gibt es (hab ich doch lmgtfy-frei verlinkt
).Seit gestern gibt es das sogar "GNU-ized" auf sourceforge.net, das probier ich gleich mal aus.
-
Ups
.Na egal, hier kommt's jetzt jedenfalls:
http://rapidshare.com/files/442880505/Double_Functions.cpp
http://rapidshare.com/files/442880506/Double_Functions.hpp
http://rapidshare.com/files/442880507/Einweisung.txt
http://rapidshare.com/files/442880508/ExactNumber.cpp
http://rapidshare.com/files/442880509/ExactNumber.hpp
http://rapidshare.com/files/442880510/FloatingNumber.cpp
http://rapidshare.com/files/442880511/FloatingNumber.hpp
http://rapidshare.com/files/442880512/Number.hpp
http://rapidshare.com/files/442880513/Numeric.cpp
http://rapidshare.com/files/442880514/Numeric.hpp(Bitte zuerst die Einweisung.txt lesen)
-
wxSkip schrieb:
Ups
.Na egal, hier kommt's jetzt jedenfalls:
http://rapidshare.com/files/442880505/Double_Functions.cpp
http://rapidshare.com/files/442880506/Double_Functions.hpp
http://rapidshare.com/files/442880507/Einweisung.txt
http://rapidshare.com/files/442880508/ExactNumber.cpp
http://rapidshare.com/files/442880509/ExactNumber.hpp
http://rapidshare.com/files/442880510/FloatingNumber.cpp
http://rapidshare.com/files/442880511/FloatingNumber.hpp
http://rapidshare.com/files/442880512/Number.hpp
http://rapidshare.com/files/442880513/Numeric.cpp
http://rapidshare.com/files/442880514/Numeric.hpp(Bitte zuerst die Einweisung.txt lesen)
Denk beim nächsten Mal an so Dinge wie ZIP und co. :-p
-

Ja, ja, muss wohl die Aufregung sein
-
So, hier die zip-Datei:
-
Übrigens: Im Floating- und Exact- Modus kann man die Präzision von Floating-Operationen per floating::SetDefaultPrecision() setzen und per floating::GetDefaultPrecision[Raw]() auslesen. (Raw gibt einen int-Typ zurück, ohne Raw gibt die Funktion einen Number-Typ zurück). Will man die Präzision portabel setzen (also so, dass bei double kein Fehler angezeigt wird, sondern einfach nichts passiert), muss man zusätzlich "Numeric.hpp" inkludieren.