2011-11-13 29 views
5

Considerare questo codice:C# calcoli ad alta precisione

double result = Math.Sqrt(4746073226998689451); 

Per risultato che ottengo 2.178.548,422 mila invece di 2178548421.999999854etc ... Come posso ottenere risultato più preciso?

risposta

7

Per il problema particolare, il calcolo della radice quadrata, è possibile utilizzare il tipo decimale e l'algoritmo di Newton:

using System; 

class Program 
{ 
    public static void Main() 
    { 
    long x = 4746073226998689451; 
    decimal sqrt_x = (decimal)Math.Sqrt(x); 
    for (int i = 0; i < 10; ++i) 
     sqrt_x = 0.5m * (sqrt_x + x/sqrt_x); 
    Console.WriteLine("{0:F16}", sqrt_x); 
    } 
} 

Il risultato è:

2178548421.9999998547197773 
1

L'utilizzo di digit by digit calculation ti darà tutte le cifre che cerchi.

+0

Questo sarebbe reinventare la ruota. – Dykam

+0

@Dykam - Perché? Non sto suggerendo che dovrebbe codificare l'algoritmo da solo. Se c'è un'implementazione, con tutti i mezzi, usala. –

+0

Questo è vero, ma ci sono molti algoritmi per i calcoli arbitrari, questo è solo uno. Penso che sarebbe stato più utile collegare a un'implementazione. – Dykam

6

C'è una serie di librerie matematiche di alta precisione per .NET menzionate su wikipedia - Arbitrary-percision artithmatic pagina.

Ho visto prima il BigNum consigliato, anche se il collegamento wikipedia è rotto e al momento non riesco a trovare la libreria altrove.

L'altra opzione nella pagina è C# binding for MPIR.

+0

Questo link bignum è rotto. –

+0

@GeorgeDuckett - Così è. Hai un link a un sito di lavoro? – Oded

+0

Io no, mi dispiace. –