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?
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?
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
L'utilizzo di digit by digit calculation ti darà tutte le cifre che cerchi.
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.
Questo link bignum è rotto. –
@GeorgeDuckett - Così è. Hai un link a un sito di lavoro? – Oded
Io no, mi dispiace. –
invece di doppio, prova grande intero e anche controllare questo link
Questo sarebbe reinventare la ruota. – Dykam
@Dykam - Perché? Non sto suggerendo che dovrebbe codificare l'algoritmo da solo. Se c'è un'implementazione, con tutti i mezzi, usala. –
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