Grandi numeri con supporto di frazione

Ho bisogno di un numero ac # qualcosa che possa gestire numeri molto grandi ma anche un supporto frazione, ho guardato System.Numberics.BigInteger in arrivo su .NET 4.0 ma non riesco a farlo funzionare con le frazioni.

something i = 2; something j = 5; something k = i/j; //should be 0.4 

quando ho provato

  BigInteger i = 2; BigInteger j = 5; double d = (double)(i/j); //d is 0.0 

Qualcuno conosce una tale biblioteca?

    Una volta ho usato questa libreria: W3b.Sine . Suo:

    Una libreria numerica decimale a precisione arbitraria sviluppata in C #.

    Puoi anche provare http://www.fractal-landscapes.co.uk/bigint.html . Tuttavia, non ho esperienza nell’usarlo.

    F # PowerPack contiene un tipo numerico BigRational . È implementato in F # e progettato per F #, ma il tipo dovrebbe essere perfettamente utilizzabile anche da C # (inclusi operatori sovraccaricati e cose del genere). PowerPack è una libreria aggiuntiva con funzionalità aggiuntive di F #, quindi non fa parte del framework .NET, ma è un prodotto supportato da Microsoft.

    Il tipo BigRational supporta tutti gli operatori di base ( +, /, -, *, >, < , >=, < =, ==, != ) E ritengo che mantenga automaticamente una forma normale del numero. Se rappresentassi il numero come due valori BigInteger , dovresti implementare il confronto in modo che 1/2 sia uguale a 2/4 .

    Controlla http://www.extremeoptimization.com/Documentation/Mathematics/Arbitrary_Precision_Arithmetic/Arbitrary_Precision_Rationals.aspx

    Anche se forse vuoi solo fare questo: double d = ((double)i) / ((double)j);

    Considera se la class Decimal è abbastanza grande:

    Il tipo di valore decimale rappresenta numeri decimali che vanno da 79.228.162.514.264,337,593,543,550,335 a un valore negativo di 79,228,162,514,264,337,593,543,950,335. Il tipo di valore decimale è appropriato per i calcoli finanziari che richiedono un numero elevato di cifre integrali e frazionarie significative e nessun errore di arrotondamento.

    Se vuoi diventare davvero grande, cerca una libreria “bignum” come GMP (e google per i binding ).

    Questo dovrebbe dare una buona approssimazione convertendo un numero razionale di due BigInteger in un doppio:

     struct BigRational { BigInteger numerator; BigInteger denominator; public double ToDouble() { BigInteger quotient; BigInteger remainder; quotient = BigInteger.DivRem(numerator, denominator, out remainder); return (double)quotient + (double)remainder / (double)denominator; } } 

    Un BigRational sperimentale in Codeplex BCL basato su BigInterger

    BigInteger supporta proprio quello che dice sullo stagno: numeri interi, che non sono frazioni.

    Il double tipo di dati supporta i numeri in virgola mobile binari da ± 5,0 × 10 -324 a ± 1,7 × 10 308 e decimal numeri decimal decimali a virgola mobile da ± 1,0 × 10 -28 a ± 7,9 × 10 28 . La risposta di Gabe menziona le classi che è ansible utilizzare per modellare le frazioni, ma attenersi ai tipi di dati primitivi se gli intervalli sono sufficienti.

    Qual è l’intervallo per i tuoi “numeri molto grandi”?

    System.Double.MaxValue = 1.7976931348623157E + 308 , che sembra essere un numero piuttosto elevato per me, tuttavia ( MSDN Double.MaxValue )

    Vorrei dire qualcosa? Sono istanze di una class, è necessario utilizzare BigInteger.Divide (i, j)

    Anche se è progettato per funzionare con i numeri interi, quindi dovrei immaginare che butterà via ogni resto. Il che, se supporta la divisione diretta senza la chiamata di funzione, è il motivo per cui stai ricevendo 0.