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?
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?
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
Za pomocą digit by digit calculation otrzymasz tyle cyfr, ile potrzebujesz.
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.
To połączenie binarne jest zepsute. –
@GeorgeDuckett - Tak jest. Czy masz link do działającej witryny? – Oded
Nie, przepraszam. –
zamiast podwójne, spróbuj dużą liczbę całkowitą, a także sprawdzić ten link
To byłoby wymyślanie na nowo Koło. – Dykam
@Dykam - Dlaczego? Nie sugeruję, że powinien sam zakodować algorytm. Jeśli jest jakaś implementacja, użyj jej. –
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