C # высокоточные вычисления

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

double result = Math.Sqrt(4746073226998689451);

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


person sventevit    schedule 13.11.2011    source источник


Ответы (4)


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

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
person kol    schedule 13.11.2011

В википедии упоминается множество высокоточных математических библиотек для .NET - Художественный рисунок с произвольной точностью страница.

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

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

person Oded    schedule 13.11.2011
comment
@GeorgeDuckett - Так оно и есть. У вас есть ссылка на рабочий сайт? - person Oded; 13.11.2011

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

person Emond Erno    schedule 13.11.2011
comment
Это было бы изобретением велосипеда. - person Dykam; 13.11.2011
comment
@Dykam - Почему? Я не предлагаю ему самому кодировать алгоритм. Если есть реализация, во что бы то ни стало, используйте ее. - person Emond Erno; 13.11.2011
comment
Это правда, но алгоритмов для произвольных вычислений много, это только один. Думаю, было бы полезнее связать с реализацией. - person Dykam; 13.11.2011

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

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

person pyCthon    schedule 13.11.2011