Есть ли функция квадратного корня более точная, чем java.lang.Math.sqrt (double) - PullRequest
1 голос
/ 06 апреля 2009

Я ищу функции квадратного корня (для использования в Java), которые могут дать квадратные корни по крайней мере до 5-6 знаков после запятой. Если есть способ контролировать точность java.lang.Math.sqrt (double) или любой внешней математической библиотеки, пожалуйста, укажите это.

Ответы [ 8 ]

12 голосов
/ 06 апреля 2009

Какую проблему вы пытаетесь решить? Я полагаю, что java.lang. Математический sqrt должен быть точным до полной двойной ширины . Вам нужно больше, чем это?

6 голосов
/ 06 апреля 2009

Попробуйте код по этой ссылке, который использует метод Ньютона для вычисления квадратных корней для больших чисел (и получает вывод BigDecimal), чтобы увидеть, соответствует ли он вашим потребностям. Если нет, вы можете изменить его :).

http://www.merriampark.com/bigsqrt.htm

4 голосов
/ 06 апреля 2009

Вы всегда можете реализовать свой собственный метод Метод Ньютона . Тогда вы можете сделать его настолько точным, насколько захотите (конечно, за счет ЦП).

Численные рецепты в C имеют код и подробное обсуждение. Однако убедитесь, что вы проверили лицензию перед использованием их кода в вашем продукте.

4 голосов
/ 06 апреля 2009

Вы можете использовать эту формулу, чтобы получить ее с произвольной точностью:

http://en.wikipedia.org/wiki/Newton's_method#Square_root_of_a_number

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

2 голосов
/ 06 апреля 2009

Вы можете бросить свой собственный, используя BigDecimal и такой метод, как Ньютон-Рафсон. Это позволит вам указать точность.

Посмотрите на Численные рецепты, если вам нужно вдохновение.

1 голос
/ 06 апреля 2009

На этот вопрос уже достаточно подробно дан ответ, но вот экспериментальный способ убедиться, что Math.sqrt является точным:

import static java.lang.Math.*;
public class Test {
  public static void main(String[] args) {
    double max = 0;
    for (int i = 0; i < 100; i++) {
      double r = random();
      double err = abs(pow(sqrt(r), 2) - r) / ulp(r);
      if (err > max) max = err;
    }
    System.out.println(max);
  }
}

Это печатает 1.0, подтверждая то, что говорится в документации - что значение, возвращаемое из sqrt, будет в пределах одной единицы точности до точного ответа.

1 голос
/ 06 апреля 2009

Math.sqrt

public static double sqrt (double a)

Возвращает правильно округленный положительный квадратный корень двойного значения . Особые случаи:

  • Если аргумент равен NaN или меньше нуля, то результат равен NaN.
  • Если аргумент является положительной бесконечностью, то результатом является положительная бесконечность.
  • Если аргумент имеет положительный ноль или отрицательный ноль, то результат совпадает с аргументом.

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

Параметры:

  • а - значение.

Возвращает:

  • положительный квадратный корень из a. Если аргумент равен NaN или меньше нуля, результат равен NaN.
0 голосов
/ 06 апреля 2009

Я обычно рекомендую Apache commons в качестве первого места для поиска большинства задач. Но, похоже, commons.math не не включает sqrt ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...