2011-11-13 19 views
5

Rozważmy następujący kod:C# wysokiej precyzji obliczeń

double result = Math.Sqrt(4746073226998689451); 

Dla rezultacie otrzymuję 2178548422 zamiast 2178548421.999999854etc ... Jak mogę uzyskać dokładniejsze wyniki?

Odpowiedz

7

Dla konkretnego problemu, obliczanie pierwiastka kwadratowego, można użyć dziesiętny typ i algorytm Newtona:

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); 
    } 
} 

Rezultat:

2178548421.9999998547197773 
1

Za pomocą digit by digit calculation otrzymasz tyle cyfr, ile potrzebujesz.

+0

To byłoby wymyślanie na nowo Koło. – Dykam

+0

@Dykam - Dlaczego? Nie sugeruję, że powinien sam zakodować algorytm. Jeśli jest jakaś implementacja, użyj jej. –

+0

To prawda, ale istnieje wiele algorytmów do arbitralnych obliczeń, to tylko jeden. Myślę, że bardziej użyteczne byłoby powiązanie z implementacją. – Dykam

6

Istnieje kilka bibliotek matematycznych o wysokiej precyzji dla .NET wymienionych na stronie wikipedia - Arbitrary-percision artithmatic.

Widziałem wcześniej zalecaną wersję BigNum, mimo że łącze do Wikipedii jest zepsute i nie mogę w tej chwili znaleźć biblioteki w innym miejscu.

Inną opcją na stronie jest C# binding for MPIR.

+0

To połączenie binarne jest zepsute. –

+0

@GeorgeDuckett - Tak jest. Czy masz link do działającej witryny? – Oded

+0

Nie, przepraszam. –

Powiązane problemy