Fragen zu den Grenzen von BigInteger

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Fragen zu den Grenzen von BigInteger

    Ich habe mit großen Zahlen rumgespielt und dafür auch Numerics.BigInteger getestet.

    Folgendes Beispiel habe ich zuerst verwendet.

    VB.NET-Quellcode

    1. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    2. Dim b As Numerics.BigInteger
    3. Dim c As Numerics.BigInteger
    4. Dim d As Numerics.BigInteger
    5. b = 480301496567310999
    6. c = 480301496567310999
    7. d = c * b
    8. Debug.WriteLine(d.ToString)
    9. End Sub


    Ergebnis: 230689527604798659355750777586378001

    Ok, die Zahl ist groß. Aber habe ich damit den Bereich von Long überschritten?

    VB.NET-Quellcode

    1. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    2. Dim b As Long ' Numerics.BigInteger
    3. Dim c As Long ' Numerics.BigInteger
    4. Dim d As Long ' Numerics.BigInteger
    5. b = 480301496567310999
    6. c = 480301496567310999
    7. d = c * b
    8. Debug.WriteLine(d.ToString)
    9. End Sub


    Ergebnis: System.OverflowException: "Die arithmetische Operation hat einen Überlauf verursacht."

    Das Ergebnis hatte ich erwartet. Neuer Versuch.

    VB.NET-Quellcode

    1. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    2. Dim b As Long ' Numerics.BigInteger
    3. Dim c As Long ' Numerics.BigInteger
    4. Dim d As Numerics.BigInteger
    5. b = 480301496567310999
    6. c = 480301496567310999
    7. d = c * b
    8. Debug.WriteLine(d.ToString)
    9. End Sub


    Ergebnis: System.OverflowException: "Die arithmetische Operation hat einen Überlauf verursacht."

    Damit hatte ich jetzt nicht gerechnet, denn die Variable d hat das richtige Zahlenformat.
    Ok, wenn ich alles als BigInteger festlege dann scheint die Berechnung zu klappen.

    Ausgehend von der Aussage Grenzen von BigInteger habe ich die Zahlen noch größer gewählt.

    VB.NET-Quellcode

    1. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    2. Dim b As Numerics.BigInteger
    3. Dim c As Numerics.BigInteger
    4. Dim d As Numerics.BigInteger
    5. b = 480301496567310999480301496567310999
    6. c = 480301496567310999480301496567310999
    7. d = c * b
    8. Debug.WriteLine(d.ToString)
    9. End Sub


    Jetzt hat VS2022 die Zahlen mit einer Wellenlinie unterstrichen und gibts folgende Meldung aus: BC30036: Überlauf (Visual Basic-Fehler)
    Das widerspricht der Aussage aus Grenzen von BigInteger.

    Warum funktioniert das nicht?
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    Das 3. funktioniert nicht, weil Du Long mit Long multiplizierst. Dass das Ergebnis in eine BigInteger-Variable kommt, ist der 2. Schritt. Der erste ist die Berechnung des Ergebnisses. Und das wird erstmal ein Long:

    Das ist wie neulich mit: »Warum ergibt Dim S As Single = 0.025 * 52.0 einen sauberen Wert, aber wenn man es anders macht, dann nicht?« Weil das berechnete Ergebnis ein Doublewert ist, der dann in eine Singlevariable gepresst wird.

    Und das mit den Grenzen von BigInteger ist ähnlich. Ja, eine Berechnungsergebnis (!) kann in einer BigInteger-Variable extrem groß sein. Aber das Hardcodieren eines solchen Werts ist nicht vorgesehen, da VS derzeit wohl nur mit Eingaben (!) bis Long.MaxValue umgehen kann. Also: zwei paar Schuhe.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    oobdoo schrieb:

    Jetzt hat VS2022 die Zahlen mit einer Wellenlinie unterstrichen und gibts folgende Meldung aus: BC30036: Überlauf (Visual Basic-Fehler)

    Hast du mal versucht die Zahl rechnerisch höher zu kriegen (*10*10*10....)? Vielleicht kann nur das Studio selbst mit der Zahl nicht um.
    Ich habe mal irgendwas mit BigInteger und Modulo rechnen müssen. Weiß aber nicht mehr wie groß das wurde (zumindest zuviel für Long). Aber eine "große" Zahl musste ich nicht explizit hinschreiben.

    Haudruferzappeltnoch schrieb:

    Hast du mal versucht die Zahl rechnerisch höher zu kriegen (*10*10*10....)? Vielleicht kann nur das Studio selbst mit der Zahl nicht um.

    Visual Studio hat dafür kein Literal. Als Zahl geht nur Long, was größeres kannst du im Code nicht schreiben. Für BigInteger gibt es dafür ja extra b = BigInteger.Parse("480301496567310999480301496567310999") als String, damit man eine beliebig große Zahl angeben kann.
    Ich habe es nicht getestet, aber ich weiss das es in Vb.Net immer ein bisschen anders ist, gerade wenn es um solche Overflows geht.

    Das hier sollte auch in Vb.Net noch genau sein und funktionieren. Ansonsten halt wirklich über die Strings, wie @Bluespide das angemerkt hat.

    VB.NET-Quellcode

    1. Dim b As Numerics.BigInteger
    2. Dim c As Numerics.BigInteger
    3. Dim d As Numerics.BigInteger
    4. 'Convert from Double
    5. b = CType(480301496567310999480301496567310999.0, BigInteger)
    6. c = CType(480301496567310999480301496567310999.0, BigInteger)
    7. d = c * b
    8. Debug.WriteLine(d.ToString)