BigInteger Division in C #

8

Ich schreibe eine Klasse, die eine genaue Unterteilung der BigInteger-Klasse in C # benötigt.

Beispiel:

%Vor%

Das Problem ist, dass es eine Integer ist, natürlich hält es keine Dezimalwerte. Wie kann ich das überwinden, um das reale Ergebnis von 0,5 zu erhalten (gegebenes Beispiel).

P.S. Die Lösung muss in der Lage sein, jeden BigInteger genau zu teilen, nicht nur das Beispiel!

    
series0ne 08.08.2012, 06:50
quelle

7 Antworten

13

Im obigen Beispiel sind die Zahlen immer noch klein genug, um in double konvertiert zu werden. In diesem Fall können Sie also

sagen %Vor%

Wenn x und y für ein double zu groß sind, aber immer noch vergleichbar, ist dieser tolle Trick vielleicht hilfreich:

%Vor%

Aber im Allgemeinen, wenn die BigInteger sehr groß sind und ihr Quotient ebenfalls sehr groß ist, ist dies ohne den Import einer Drittanbieter-Bibliothek schwer zu bewerkstelligen.

    
Jeppe Stig Nielsen 08.08.2012, 07:03
quelle
6

Welche Genauigkeit benötigen Sie für die Division? Ein Weg wäre:

  • Multiplizieren Sie den Zähler mit zB 1000
  • Teilen Sie die Zahlen
  • Konvertiere das Ergebnis in double und dividiere durch 1000

Dasselbe im Code:

%Vor%     
Ilmo Euro 08.08.2012 06:56
quelle
1

Wenn Sie die volle Genauigkeit beibehalten möchten, verwenden Sie eine Implementierung von rationalen Elementen (das Java-Äquivalent wäre die Fraction-Klasse aus der Apache Commons Math-Bibliothek). Es gibt verschiedene Implementierungen, die herumlungern, aber die leichteste Lösung für .NET 4.0 (wie es System.Numerics.BigInteger eingebaut hat) wäre die folgende:

%Vor%

Damit dies funktioniert, benötigen Sie den System.Numbers.BigInteger von .Net 4.0 System.Numerics.dll und dem BigRational Implementierung von CodePlex.

Es gibt eine Rational-Struktur auch in der Microsoft Solver Foundation 3.0 implementiert. Zum Zeitpunkt des Schreibens war die Website www.solverfoundation.com defekt, daher ein Link zum Archiv.

    
jpe 08.08.2012 07:05
quelle
0

Wie Sie vielleicht wissen, wird die Division von Ganzzahlen keine Dezimalwerte ergeben, daher wird Ihr Ergebnis auf 0 gekürzt. Nach diese Frage große Doppel-Implementierung finden Sie hier , aber die letzte Version davon war im Jahr 2009. Wenn Sie schauen weiter können Sie einen neueren finden oder dieser ist einfach fertig.

    
Rafal 08.08.2012 06:57
quelle
0

Klingt wie ein Job für Fixed Point (anstatt Fließkomma).

Verschieben Sie den Zähler einfach um die Anzahl der benötigten Teilbits wie folgt:

%Vor%

Das würde 10 Bits nach dem Punkt geben (ungefähr 3 Dezimalstellen).

    
harold 08.08.2012 07:17
quelle
0
%Vor%     
user168345 19.01.2018 15:02
quelle
-1

Parsen Sie es zu verdoppeln:

%Vor%     
Karl 08.08.2012 06:54
quelle

Tags und Links