Empfehlung einer Sprache die große Zahlen einfach handeln kann

mogbo

Banned
Hallo und frohes Neues :) ,
das Thema ist eigentlich relativ simpel, mir geht es bei C ziemlich auf die Nerven, wenn ich beim Handeln von Zahlen (bzw. tätigen von Berechnungen) schon die Ergebnisse kennen muss, um Overflows zu vermeiden und 50 % des Codes eigentlich nichts mit meiner eigentlichen Interesse zutun hat.

Kann mir jemand eine Sprache empfehlen, welche im Thema Mathe der Performance von C nicht weit hinterher hinkt, jedoch ohne großen Aufwand sehr lange Zahlen handeln kann (2^128 wäre gut, 2^256 sogar besser).
 
Für wissenschaftliches Rechnen - also auch große Zahlen - ist Julia im Moment wohl die beste und neben Python + Numpy auch verbreitetste Wahl. Allerdings ist Julia schon recht tief im funktionalen Spektrum und konzeptionell deutlich anders als C. Die Website ist hier: https://julialang.org/
 
Keine Ahnung wie die Performance bei den Berechnungen selbst ist, aber Python kann von Haus aus mit großen Zahlen umgehen:
Code:
$ python
Python 3.8.1 (default, Dec 21 2019, 20:57:38)
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> pow(2,9283493)
28936749769047122731523277529823810374666963525851672510890228756441962702529908912060939705969404124478686514983548990594186691563131843376909399350964455090912366996941472232297928519371991496999058612180693863351186943545100851070308812625536587622603742533707992442343660441996292118326757326843701393455203355461897777461733318642958432570412191393244027135095337129315235386219493478163340373903804183629453996047437143210499652960272782252418865457789588485077784540256413502400942501486018162715151287071378533364449181792965962705707928793570433403792312755244318924089721613446832984121567630485462577632322931146865182113318009093470083387068464861498529724123251511449464145173899843299375505676694342960819735194519250026050218666497949394489544836169756505531856566936452449696167077708511378616312146499189338386568004675376715631005486131603556470555231028104993496914576392077707477064795861966563231339784571512671895896787994682190256451457836037277259345602085548513353441113098304351543689237676738984566231895314357739639730526416759018036541393891159713864086639064357553263556420752986435692247546952085176375488484746766872206531832413084191349852619756694836000697362002564663248254317584892602415872646462109353943479153899661633348540012773806562771264284620912607488094984149686444069826522263183116983347078482488389246145358682517986454966965080452734182206823867504224240202790414775659637831485660874117294606486557381428654004477590157114110938567441039523977042002776875904321121542240542593678569291908869653972351559235716368844147918685284720893955044545784741013042097206199674430952455382523674433734972633550996812063531200086562549193087917242042554242157795059235138865741470240960988907252755012036513568714912181565930959110455029128887566862988779567267118787257576665264388508710434533458277325897523774566522607299983504811616894023131600681231830352817991004044743519078004136902104051280217160024725505824377831285878009026010315041124198265040515620084641547596875971227353778433467896279023980892648139732685350454253650021563263377939796323125112994032197118588294541710171335808795434510143881166280264619991699180475035584176703004234827092348665866288284010110464162449096636355302635858239745582048880251996925044149883032799145474277536169090369637836947505806854727018794618903627143681068073300260913922276534772484695938351227568509634399845658061944305505791235977251494569402739095243424548202482199851744865964121648840524601044940452250346511357008263589384383226757122554309791560124495888494302061969917241426667168940890037982813686565489736137157230492742132194889569604601816842392047545602529641959556825685842776021892480282059176377092442155282938389206652569326894434822347980735061584155249483388876267616757383753105408

Alternativ gibt es auch noch mit pypy eine deutlich fixere Implementierung von Python.
 
Nur der Vollständigkeit halber -- man muss sich auch in C keinen "abbrechen" :) Je nach Usecase:
  • C-Compiler für 64bit Plattformen bieten in der Regel einen 128bit integer Type (z.b. __int128). Das ist allerdings leider nicht Standard.
  • Wenn man mehr braucht (oder portable bleiben will) gibt es Libraries, die einem die hässlichen Details abnehmen, am bekanntesten ist da sicher die GMP: https://gmplib.org/manual/

(Außerdem kann es auch mal Spaß machen, von Hand mit großen Zahlen zu hantieren: https://github.com/Zirias/hugeint/ -- da ist ein Beispielprogrämmchen drin, das in plain C die Fakultät von 2500 auf nem halbwegs modernen PC noch innerhalb einer Sekunde ausrechnet -- bei 10000 muss man dann doch n bisschen warten *gg*)
 
Zuletzt bearbeitet:
C-Compiler für 64bit Plattformen bieten in der Regel einen 128bit integer Type (z.b. __int128). Das ist allerdings leider nicht Standard.
Mir hat neulich ein Overflow die Arbeit eines ganzen Wochenendes gekillt, da ich nicht bedacht hatte, dass meine Art der Primzahlberechnung ab 2^64 + 1 auf 128bit overflows erzeugt (Primzahl² - 1) % 24 = 0 sofern Primzahl != {2, 3}. Performance war in dem Fall egal, da viel Zeit zur Verfügung stand, dass jedoch alles ab 2^64 nur Müll ist war doof^^

julialang klingt schonmal super und python werd ich mir auchmal anschauen. Werd weiterhin noch C für Berechnungen nutzen, aber nur wenn das Tool auch mehr als 1mal laufen soll (was nur selten der Fall ist)
 
Pythons Geschwindigkeit ist sehr schwer einzuschätzen, ohne das jeweilige Programm zu kennen. Denn Python-Code selbst ist grottenlahm, um es diplomatisch auszudrücken. Aber nahezu die ganze Standardbibliothek und die großen mathematischen Module sowieso sind in schnellen, nativen Code erzeugenden Sprachen wie C oder im Fall von Numpy Fortran geschrieben. Daher ist der Python-Code oft nur ein glorifizierter Kontrollfluss und das Programm entsprechend schnell. Daraus erklärt sich auch der scheinbare Widerspruch, dass Python in vielen Sprachbenchmarks (die oft schwachsinnig sind) schlecht abschneidet, aber im Bereich High Performance Computing, wo jede CPU-Cycle zählt, sehr weit verbreitet ist.
 
Also ich hatte mal einen Terrain-Generator programmiert, auf Basis von Perlin Noise. Die Laufzeit bei Python betrug pro Karte irgendwas bei über einer Minute. Die C++ Variante war in <10 Sekunden fertig. Mittels pypy waren es dann "nur noch" 20 Sekunden. Das hatte aber auch keine Berechnungen mit BigNum Bereich.

Ich hatte auch mal einen Mandelbrot Generator programmiert, nur nicht in Python. Selbst bei einer Genauigkeit von 64bit war GMP um ein vielfaches langsamer als natives 64bit, was mich jetzt aber auch nicht wahnsinnig überrascht hat. Jedoch kann man dann mittels GMP relativ einfach auf höhere Genauigkeiten umstellen, was dann natürlich immer langsamer wird.

Darum meine Aussage, dass ich die Performance-Unterschiede in dem Bereich jetzt nicht kenne. Aber pypy kann ohne NumPy und Co. hier durchaus tierisch was reißen, auch wenn man nicht an C-Performance ran kommt.
 
1. Zuerst mal die Frage Ganzzahl- oder Fließkommarechnung?

2. Programme wie 'maxima' oder 'mathematica' rechnen im Prinzip mit beliebig vielen Stellen.

3. F90 kann lt. hier <https://scivision.github.io/fortran2018-examples/sourcefile/huge_precision.f90.html> und hier <https://gcc.gnu.org/onlinedocs/gfortran/KIND-Type-Parameters.html> 128-bit REAL und INTEGER

4. Ich denke mal, daß es in den NumericalRecipes oder ähnlichen Publikationen Routinen gibt die mit längeren INTEGER rechnen; das Problem ist ja alt (INTEGER*8 auf 32-bit Maschine; DEC F77 konnte das aber vor fast 40 Jahren auch schon direkt). Man könnte das ggf. auch mit einer "Stack" Rechenmaschine machen (1. Wert auf Rechenstack, 2. Wert auf Rechenstack, Funktion aufrufen
 
1. Zuerst mal die Frage Ganzzahl- oder Fließkommarechnung?
Ja

2. Programme wie 'maxima' oder 'mathematica' rechnen im Prinzip mit beliebig vielen Stellen.
Ich brauche Tools die aus der Shell raus funktionieren, eine Programmiersprache ist mir hier am liebsten

Man könnte das ggf. auch mit einer "Stack" Rechenmaschine machen (1. Wert auf Rechenstack, 2. Wert auf Rechenstack, Funktion aufrufen
Hier bin ich etwas überfordert
 
1. Zuerst mal die Frage Ganzzahl- oder Fließkommarechnung?

Ein Software-Ingenieur (Programmierer) und seine Frau:
Sie: „Schatz, wir haben kein Brot mehr, könntest du bitte zum Supermarkt gehen und 1 holen? Und wenn sie Eier haben, bring 6 Stück mit.“
Er: „Klar Schatz, mach ich!“
Nach kurzer Zeit kommt er wieder zurück und hat 6 Brote dabei.
Sie: „Warum nur hast du 6 Brote gekauft?!?“
Er: „Sie hatten Eier.“​
 
Darum meine Aussage, dass ich die Performance-Unterschiede in dem Bereich jetzt nicht kenne. Aber pypy kann ohne NumPy und Co. hier durchaus tierisch was reißen, auch wenn man nicht an C-Performance ran kommt.
Ich verzichte gerne auf etwas Performance, wenn die Mathematik dahinter für mich einfacher wird, sprich ich mir weniger Gedanken aufgrund von Rundungsfehlern von Nachkommastellen und Vorgedanken zu Overflows machen muss.
 
Ein Software-Ingenieur (Programmierer) und seine Frau:
Sie: „Schatz, wir haben kein Brot mehr, könntest du bitte zum Supermarkt gehen und 1 holen? Und wenn sie Eier haben, bring 6 Stück mit.“
Er: „Klar Schatz, mach ich!“
Nach kurzer Zeit kommt er wieder zurück und hat 6 Brote dabei.
Sie: „Warum nur hast du 6 Brote gekauft?!?“
Er: „Sie hatten Eier.“
Kommt die Pointe noch?^^
 
Und noch einer, wo wir dabei sind

Die Informatiker sollen die Höhe des Fahnenmasts vor dem Institutsgebäude messen. Sie stehen davor und überlegen wie sie das machen. Da kommt ein Ingenieur daher und fragt was los ist. Die Informatiker sagen, daß sie die Höhe messen sollen, aber nicht wissen wie. Der Ing. nimmt den Mast raus, legt ihn hin und schreitet den Mast ab und sagt "etwas über 4m. Dann geht er weiter. Als er weg ist sagen die Informatiker "typisch - wir brauchen die Höhe und er mißt die Länge."
 
Es gibt 10 Sorten von Menschen, die die Binär verstehen, die dies nicht tun und die die jetzt erst merken, dass der Witz in Base 3 ist.
 
Daraus erklärt sich auch der scheinbare Widerspruch, dass Python in vielen Sprachbenchmarks (die oft schwachsinnig sind) schlecht abschneidet, aber im Bereich High Performance Computing, wo jede CPU-Cycle zählt, sehr weit verbreitet ist.
Also soweit ich das beurteilen kann wird Python sehr gern im Wissenschaftlichen-HPC Umfeld genutzt, weil es quasi für jedes Problem ein passendes Modul gibt.
Und um die Performance-Thematik zu umgehen, werden die Probleme dann einfach mit starker Parallelisierung umgangen. Bei Servern mit aktuell 128C/256T auch kein großes Problem. Wenn man dann noch MPI u.ä. einsetzt wirft man einfach Compute-Power auf das Problem und dann ist die Sprache auch egal.
 
Und um die Performance-Thematik zu umgehen, werden die Probleme dann einfach mit starker Parallelisierung umgangen. Bei Servern mit aktuell 128C/256T auch kein großes Problem. Wenn man dann noch MPI u.ä. einsetzt wirft man einfach Compute-Power auf das Problem und dann ist die Sprache auch egal.
Da habe ich mal schwere Zweifel.. mein Bruder war am http://www.scc.kit.edu/ und da wurde schon relativ "peinlich" darauf geachtet, dass man nicht unnuetz CPU cycles/RAM verballert.
 
"Unnütz" ist relativ. Wenn jemand eine Analyse laufen lässt ist das ja nicht unbegründet.
Ich weiß nicht, wie das bei so "privaten" Clustern ist aber bei den öffentlich geförderten auf denen ich so unterwegs bin, da schreibst Du nen Antrag und wenn der genemigt wird haust Du auf den Cluster drauf was Du willst und kannst. Die aktuellen workload manager haben ja alle eine Art fair-use Funktion integriert
 
Oder seinen Bruder dc. Es ist im Prinzip das gleiche Programm, aber als RPN-Rechner angelegt. Je nach Situation mag er besser oder schlechter geeignet sein.

(Ich mag RPN-Rechner, aber ich war auch der einzige Mensch nördlich des Main der RPL als Sprache mochte.)
 
Zurück
Oben