mit großen Zahlen arbeite

  • VB.NET

Es gibt 65 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    mit großen Zahlen arbeite

    Hi

    Ist es möglich zum Beispiel so eine Zahl:
    72105101114321151161011041163210610111612211632101105 durch 12 zu rechnen. Das steht meistens nur die Zahl ist zu groß für Integer.

    Warum eigentlich? Ein Computer müsste doch eigentlich so schlau sein und bis unendlich rechnen können, da wir ja ein Dezimalsystem haben und der Computer sich so wieso nur 10 Zahlen (0-9) merken muss

    MFG
    PhoenixBlaster9
    Servus,

    ein PC kann leider nicht mit unendlich großen Zahlen arbeiten.
    Wenn du größere Zahlen haben willst hast du mehrere Möglichkeiten:

    1.Einen eigenen Datentyp erstellen (frag mich nich wie)
    2. ein Programm für 64 bit erstellen (reicht in deinem Fall immer noch nicht aus)
    3. Den Datentyp long benutzen (wie viel genau der akzeptiert weiß ich nicht genau, aber mehr als Integer)

    Mit den letzten beiden zusammen könnte es klappen, bei deiner Zahl

    Mfg
    Das geht auch, aber nur mit einem BIG Integer,
    Zahlen sind im Grunde nur eine Abfolge von 0'en und 1'en für den Computer, und je größer die Zahl desto mehr verschiedene Möglichkeiten benötigt der Computer um die Zahl darzustellen, d.h. da jetzt zwei Zustände (0 und 1) dargestellt werden und jenachdem wie groß die Zahl ist, es unterschiedlich viele unterschiedliche Möglichkeiten von der Abfolge dieser beiden Zahlen geben muss, ergibt sich die Formal 2^n, wobei n die Anzahl der Bits (also eine 0 bzw eine 1 ist), jetzt wäre es z.B. bei 8 Bits 2^8 was 256 entspricht, also einem Byte und wieviele Zahlen kann ein Byte darstellen? Richtig 256 (von 0 bis 255).
    Um jetzt größere Zahlen darzustellen, werden mehr Bits benötigt, d.h. auch mehr Speicher.
    Ein Integer hat 4 Bytes (32 Bits), also 2^32 Möglichkeiten wie die 0'en und 1'en aufgestellt sein könnten und daraus ergeben sich 2^32 Zahlen.
    2^32 ist ca 4294967296 und welchen Zahlenbereich kann ein Integer also darstellen? Richtig, -2147483647 - 2147483647 (Insgesamt 4294967296)
    Wenn jetzt die Zahl aber so groß wird, das viel zu viele Bits benötigt werden, geht der Speicher irgendwann leer und deswegen wären unendliche Zahlen praktisch unmöglich, da diese unendlich viele verschiedene Aneinanderreihungen an Bits benötigen würden.

    PhoenixBlaster schrieb:

    eigentlich so schlau sein und bis unendlich rechnen können

    Ganzahlen belegen je nach Typ (Short, Int32, Int64) eine festen Bereich im Speicher. Egal ob eine Int32 Varible den Wert 1 oder den Wert Int32.MaxValue (=2147483647) hat, sie belegt immer 4 byte (=32bit).


    PhoenixBlaster schrieb:

    da wir ja ein Dezimalsystem haben und der Computer sich so wieso nur 10 Zahlen (0-9) merken muss


    NEIN. Du sagst es ja selber: WIR haben ein Dezimalsystem. Für den Computer ist alles binär. Wenn ein Byte den Wert 15 hat, dann ist die binäre Repräsentation 00001111.


    Zum Problem: Es gibt andere Sprachen wie Python, bei denen man mit beliebig großen Ganzzahlen arbeiten kann.
    In .NET nimmt man zum Rechnen mit großen Zahlen meistens double/float, wenn man keine Ganzzahlen braucht, sondern Gleitkommazahlen auch OK sind.
    Diese Gleitkommazahlen besitzen dann festgelegte Genauigkeit bzw. gültige Stellen. z.B. bei Double 15-16 Stellen.

    (Für Berechnungen von Geldbeträgen nimmt man häufig den langsameren aber genaueren Datentyp Decimal.)

    Die Frage ist welche Genauigkeit willst du? Ganzzahl ist exakt, Gleitkommazahl nicht, brauchst du mehr als 15 gültige Stellen?

    €: Gruß an @nafets3646. Zu spät, aber nicht vergebens, du hast dir auch die Mühe gemacht das Entscheidende auf den Punkt zu bringen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „markus.obi“ ()

    Schau dir mal den BigInteger an, den kannste unendlich groß machen. Außerdem hast du ein falsches Verständnis vom Speichern von Zahlen denke ich. Eine Zahl wird immer in einer Abfolge von Bits abgespeichert. Ein Beispiel ist hier der Datentyp Byte, welcher 2^8 (=256 -> Bereich von 0 bis 255) Kombinationen bereitstellt. Er verbraucht einen Speicher von 8 Bits bzw. einem Byte. Das ist das Selbe wie bei nem Integer, Long, ... und auch Doubles, Decimals usw. haben alle eine bestimmte Länge an Bytes und können damit auch nur einen bestimmten Zahlenbereich abbilden. Datentypen wie der BigInteger umgehen dieses Problem, indem sie die einzelnen Bytes in einem Bytearray beliebiger Länge speichern (glaube ich zumindest).

    //EDIT: Leider zu spät, Markus hats schon erklärt :(
    //EDIT2: Und RushDen anscheinend auch schon ^^.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nafets3646“ ()

    sieh dir mal das an ;) intx.codeplex.com/

    VB.NET-Quellcode

    1. Dim a As New Oyster.Math.IntX("1234567890123456789012345678901234567890")
    2. Dim b As New Oyster.Math.IntX("1234567890123456789012345678901234567890")
    3. Debug.Print(Oyster.Math.IntX.Multiply(a, b, Oyster.Math.MultiplyMode.AutoFht).ToString)


    Quelle
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Option Strict On ist in Post #5 nicht vorhanden. Daher ist auch die Idee vollkommener Bullshit, @Andy16823:.
    #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 :!:
    Argh nein. Das E+51 steht für 10^51 also 10 hoch 51. Les dir mal meinen Post durch.

    Die Zahl in nem String zu speichern ist absoluter Bullshit. Erstens langsam. Zweitens kann man damit nicht Rechnen. Drittens musst du beim Rechnen den String in ne Zahl parsen. Da stehste wieder vor dem Ursprungsproblem.

    OT: geben sich hier die noobs die Klinke in die Hand? Wenn man keine Ahnung hat, einfach mal...
    @Andy16823: bitte! bitte, lerne Grundlagen wie zB. Option Strict On! Das andere ist alles unsauberer Microsoft.Visualbasic shi*!!
    _________________________________________________________________________________________________________
    wie gesagt dein prog bekommt vom GC einen festen bereich im speicher, wenn dieser outofrange ist gibt's thoretisch nen bsod, das wird aber vom sys geblockt d.h. beim rechnen kommt 'n E bei anderem weiß ich nicht, hab ich nicht ausprobiert :P

    </abkürzungen-benutzen>