Considere este código:C# cálculos de alta precisión
double result = Math.Sqrt(4746073226998689451);
Por consecuencia consigo 2178548422 en lugar de 2178548421.999999854etc ... ¿Cómo puedo obtener un resultado más preciso?
Considere este código:C# cálculos de alta precisión
double result = Math.Sqrt(4746073226998689451);
Por consecuencia consigo 2178548422 en lugar de 2178548421.999999854etc ... ¿Cómo puedo obtener un resultado más preciso?
Para el problema particular, el cálculo de la raíz cuadrada, se puede utilizar el tipo decimal y el algoritmo de 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);
}
}
El resultado es:
2178548421.9999998547197773
El uso de digit by digit calculation le dará tantos dígitos como usted busque.
Hay un montón de bibliotecas de matemáticas de alta precisión para .NET mencionadas en wikipedia - Arbitrary-percision artithmatic página.
He visto BigNum recomendado aquí antes, aunque el enlace de la wikipedia está roto y no puedo encontrar la biblioteca en otro lugar en este momento.
La otra opción en la página es C# binding for MPIR.
Ese enlace bignum está roto. –
@GeorgeDuckett - Así es. ¿Tiene un enlace a un sitio de trabajo? – Oded
No lo siento, lo siento. –
en lugar de doble, tratar entero grande y también echa un vistazo a este enlace
Eso sería reinventar la rueda. – Dykam
@Dykam - ¿Por qué? No estoy sugiriendo que él mismo debería codificar el algoritmo. Si hay una implementación, por supuesto, úselo. –
Eso es cierto, pero hay muchos algoritmos para cálculos arbitrarios, este es solo uno. Creo que habría sido más útil vincular a una implementación. – Dykam