C # высокая точность расчетов - PullRequest
5 голосов
/ 13 ноября 2011

Рассмотрим этот код:

double result = Math.Sqrt(4746073226998689451);

Для результата я получаю 2178548422 вместо 2178548421.999999854etc ... Как мне получить более точный результат?

Ответы [ 4 ]

7 голосов
/ 13 ноября 2011

Для конкретной задачи, вычисляя квадратный корень, вы можете использовать десятичный тип и алгоритм Ньютона:

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

Результат:

2178548421.9999998547197773
6 голосов
/ 13 ноября 2011

Существует множество высокоточных математических библиотек для .NET, упомянутых в википедии - Произвольное разрешение, арифметика страница.

Я видел рекомендованный здесь BigNum ранее, хотя ссылка на википедию не работает, и я не могу найти библиотеку в другом месте в данный момент.

Другая опция на странице - это привязка C # для MPIR .

1 голос
/ 13 ноября 2011

вместо двойного, попробуйте большое целое число и также проверьте эту ссылку

Большие числа с поддержкой дроби

1 голос
/ 13 ноября 2011

Использование цифр за цифрой даст вам столько цифр, сколько вы ищете.

...