2011-11-13 12 views
5

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?

Respuesta

7

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 
1

El uso de digit by digit calculation le dará tantos dígitos como usted busque.

+0

Eso sería reinventar la rueda. – Dykam

+0

@Dykam - ¿Por qué? No estoy sugiriendo que él mismo debería codificar el algoritmo. Si hay una implementación, por supuesto, úselo. –

+0

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

6

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.

+0

Ese enlace bignum está roto. –

+0

@GeorgeDuckett - Así es. ¿Tiene un enlace a un sitio de trabajo? – Oded

+0

No lo siento, lo siento. –

Cuestiones relacionadas