Visual Basic
03.07.2024, 11:23 Uhr
Klasse für Rationalzahlen unter VB.NET
Eine praktische Lösung zur Speicherung von Rationalzahlen mit unbegrenzter Genauigkeit
Rationale Zahlen lassen sich durch Brüche darstellen. Sie verfügen also über einen Zähler und einen Nenner. Die Klasse von Xavier Junqué i de Fortuny ermöglicht die Speicherung dieser Zahlen, wobei sowohl Zähler als auch Nenner in BigIntegers vorliegen. Dies erlaubt die Handhabung von Ganzzahlen jeder Länge. Um Nicht-Ganzzahlen zu speichern, wird die Zahl entsprechend multipliziert, um sie in eine Ganzzahl umzuwandeln. Der Nenner wird dabei in gleichem Maße multipliziert wie der Zähler.
Zum Beispiel wird 1,2 durch 1,2 / 1 dargestellt. Der Zähler sollte somit 1,2 und der Nenner 1 enthalten. Da jedoch nur Ganzzahlen zulässig sind, wird 1,2 mit 10 multipliziert, ebenso der Nenner. Am Ende wird 12 als Zähler und 10 als Nenner gespeichert.
Ein spezielles Attribut, 'tipo', gibt an, ob die Rationalzahl keine Zahl (Double.NaN) oder unendlich (Double.Infinity) ist, was z.B. eine Division durch Null ermöglicht:
Console.OutputEncoding = Text.Encoding.UTF8
Dim toDivide As New Rational(1.0)
Dim byZero As New Rational(0.0)
Dim s As String = (toDivide / byZero).toString
Console.WriteLine(s) ' zeigt das Unendlichkeits-Symbol"
Obwohl der Code möglicherweise nicht der schnellste ist, ist er praktisch und erfüllt seinen Zweck.
Wenn die Länge die maximal zulässige Grenze überschreitet, wird die Rationalzahl abgeschnitten. Dies geschieht durch Konvertierung in Byte-Arrays, Umdrehen der Bytes, Kürzen und erneutes Umdrehen, um den neuen Zähler und Nenner zu erhalten. Dabei wird auch das Attribut 'bReduced' gesetzt. Abschließend wird, falls der Zähler oder Nenner nicht bereits reduziert wurde, versucht, beide durch den größten gemeinsamen Teiler zu teilen.