Grenzen von BigInteger

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von vb-checker.

    Also, es gibt keine theoretische Grenze, das heißt der BigInteger kann so groß werden, wie er will. Das jedoch nur solange der RAM mitmacht. Wenn es dafür zu groß wird, fliegt eine OutOfMemoryException. Also ja.
    Aber eine direkte MinValue und MaxValue-Grenze exisitiert nicht.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Naja, ich würde sagen, nehme doch einfach ne kleinere Zahl, die er verarbeiten kann und rechne Dich dann hoch.
    Dann kann man ungefähr abschätzen, wie viel verbraucht wird.

    Oder Du machst direkt ne große Zahl und testest mal durch, wann ne Exception fliegt.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    Naja, ich würde sagen, nehme doch einfach ne kleinere Zahl, die er verarbeiten kann und rechne Dich dann hoch.

    Wenn du nen paar Jahre zeit hast ... gerne doch. Im ernst. Hochrechnen bei ner Zahl wo mehrere Gigabyte belegt kannste vergessen. Von dem her ist es auch komplett egal wie groß die Zahl werden kann. Außerdem hängt das auch vom bereits verwendeten RAM ab. Mal davon abgesehen, dass es für Prozesse Grenzen gibt wie viel RAM sie verbrauchen dürfen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hier .. ne kleine Testanwendung. Lastet deinen Rechner auf n-1 Kernen vollständig aus.
    Der gesamte Code:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Numerics;
    5. using System.Text;
    6. using System.Threading.Tasks;
    7. using System.Threading.Tasks.Dataflow;
    8. namespace BigIntMax
    9. {
    10. internal class Program
    11. {
    12. private static void doThings(ITargetBlock<BigInteger> target)
    13. {
    14. BigInteger i;
    15. try
    16. {
    17. for (i = 0; ; i++)
    18. target.Post(i);
    19. }
    20. finally
    21. {
    22. target.Complete();
    23. }
    24. }
    25. private static void Main(string[] args)
    26. {
    27. BroadcastBlock<BigInteger> things = new BroadcastBlock<BigInteger>(i => i);
    28. var post = postThings(things);
    29. doThings(things);
    30. post.Wait();
    31. }
    32. private static async Task postThings(ISourceBlock<BigInteger> source)
    33. {
    34. while (await source.OutputAvailableAsync())
    35. {
    36. Console.WriteLine(source.Receive());
    37. }
    38. }
    39. }
    40. }

    Läuft hier schon geraume Zeit auf 16.8 MB (nicht beachten! Dieser Wert hat überhaupt keine Aussagekraft!)
    Derzeit ist die Anwendung bei 3.632.932.004. Kannst dir ja den Arbeitsspeicherbedarf währenddessen angucken.
    Wenn du 100% der Leistung haben willst, nimmst du das Console.WriteLine() raus, da das einen Kern zu 100% belastet.
    Beachte aber, dass es ewig dauern kann, bis eine Ausnahme fliegt.
    Dateien
    • BigIntMax.zip

      (98,57 kB, 156 mal heruntergeladen, zuletzt: )
    Ich habe mir einen kleinen Algorithmus geschrieben, den ich mit immer groesser werdenden Zahlen verwende, in diesem Algorithmus rechne ich viel mit Potenzen. Leider frage ich mich, warum mein Processor nicht zu 100% belastet ist, obwohl die Berechnungen kontinuierlich laufen. Liegt es vielleicht daran, dass ich die Berechnungen nur auf einen Nebenthread ausgelagert habe??
    Zum einen, dass du mit einem Kern bei weitem nicht alles raus holst und zum anderen, dass soweit ich weiß auch Windows noch ein Wörtchen mitredet und dir nicht 100% Leistung gibt, da ja auch noch andere Dinge laufen als dein Programm.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Wenn du nicht gcAllowVeryLargeobjects gesetzt hast, wird dir die CLR bei Objekten, die größer als 2GB wären, eine OutofmemoryException schmeißen.
    Aber nur zu deinem Verständnis, eine Zahl, die diesen Speicherplatz belegt, läge in der Größenordnung von 2^16.000.000.000. Also mal ganz abgesehen davon, dass man für einfache Berechnungen wie + oder - mit Zahlen von dieser Größe gewaltige Zeitspannen benötigt (ich weiß nicht, wie lange es dauert, aber bereits für einige Zehnerpotenzen weniger braucht man schon Minuten), bräuchte man auch niemals so große Zahlen in irgend einer praktischen Anwendung.
    Und selbst wenn man so große Zahlen hätte, braucht man auch die Genauigkeit? Brauchst du echt mehr als 15 gültige Stellen? Braucht kaum einer!
    Meinstens hat man eh keine GANZEN Zahlen sondern RATIONALE Zahlen und muss deswegen auf FLIEßKOMMAZAHLEN wie float/double umsteigen.
    Diese Fließkommazahlen haben eine festgelegt Genauigkeit, die für technische/wissenschaftliche Gebiete meistens ausreicht.
    Im Finanzbereich wird Decimal verwendet, was wesentlich langsamer ist, aber ein paar mehr gültige Stellen als double bietet.
    Fuer meine Zwecke brauche ich ganze Zahlen, keine Gleitkommazahlen, ich bekomme auch 100%ig keine, und ich versuche mit Zahlen mit mehr als 12 Nullen(weit mehr) zu rechnen, da ich etwas ueberpruefen moechte, was, kann ich leider aber nicht sagen, das wuerde hier nur unnoetiges verursachen. Und ich rechne auch nicght mit Zehnerpotenzen, sondern immer nur Zahlen ins Quadrat.

    PS: Gilt der Parameter von dir @Artentus auch fuer Zahlenwerte, weil da steht, dass es fuer Arrays gilt?

    Wolfram Alpha Kennt den Name von 2^160:

    1 quindecillion 461 quattuordecillion 501 tredecillion 637 duodecillion 330 undecillion 902 decillion 918 nonillion 203 octillion 684 septillion 832 sextillion 716 quintillion 283 quadrillion 19 trillion 655 billion 932 million 542 thousand 976

    Wolfram Alpha kann: 2^1.600.000.000

    Anders dargestellt: 10^10^8.682729755001600

    Länge der Zahl: 4.81648*10^8 besser gesagt: 481.648.000 Zeichen!
    (Aus langeweile in die Console eingeben: fsutil file createnew test.txt 190840832
    Erstellt eine Textdatei mit 477.058.422 Zeichen, damit man mal ungefähr sehen kann wie viel das ist.
    Sublime Test 2 frisst beim öffen genau 999 MB RAM :D

    Edit: Geil ich glaub ich hab nen Memory-Leak (schreibt man das so?) gefunden.
    Die Datei ist geladen und man kann scrollen, aber der verwendete RAM läuft weiter an.
    Nach ~5 GB ist Sublime Test 2 abgestürtzt. :thumbsup:

    Jetzt kannst Du dir ungefähr noch immer nicht ansatzweise vorstellen wie groß 2^16.000.000.000 (Eine ganze Null mehr im Exponent) ist.

    Merk dir nur: Zu groß...

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Eistee“ ()