Реализация функции вычисления корня

Реализовать математические функции для различных вещей достаточно просто. int mul (int, int); , int pow (int, int); , даже ] double div (float, float); просты в выполнении и могут быть реализованы с помощью циклов или рекурсии. (Это те же методы, которые используются для выполнения этих функций вручную или в голове.) Чтобы умножить, просто несколько раз сложите число. Чтобы делить, многократно вычитайте его. Чтобы получить степень, многократно умножайте. И так далее.

Одна математическая функция, о которой я всегда задумывался, это корни. Например, как бы вы написали функцию для вычисления квадратный (или кубический и т. д.) корень из числа (например, двойной корень (число с плавающей запятой, корень с плавающей запятой); )? Я попытался осмотреться и не смог найти алгоритм или метод для этого.

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

Очевидно, что LUT не имеют отношения к делу, поскольку он должен быть достаточно общим, чтобы принимать любые операнды (если вы не пишете игру с конечным набором данных). В статье Википедии упоминается метод предположений и перечисляются некоторые древние методы (задолго до изобретения компьютеров), а также некоторые чистые математические методы и даже методы исчисления (в том числе те, которые имеют «бесконечность» в качестве компонента). Единственные, которые, кажется, имеют какое-то отношение к электронике, используют уловки или логарифмы. (И это только для квадратных корней , не говоря уже о кубических корнях и т. Д.)

Нет ли простого метода вычисления корня? Как это делают калькуляторы? Как это делают компьютеры? (Нет, просто выполнить double pow (a, 0.5); не получится, потому что тогда как будет реализовано double pow (float, float) ?)

Я просто неправильно группируют корневые функции с более простыми функциями? Они сложнее, чем кажется?

5
задан Synetech 12 June 2011 в 06:46
поделиться