Найти квадратный корень не используя Math и Sqrt - C (СИ)
Формулировка задачи:
Помогите найти квадратный корень не используя Math и Sqrt.
Решение задачи: «Найти квадратный корень не используя Math и Sqrt»
textual
Листинг программы
#include <assert.h> #include <stdio.h> double my_fabs(double x) { return x < 0 ? -x : x; } double my_sqrt(double x) { assert(x > 0); static const double eps = 1e-10; double prev; double next = x; do { prev = next; next = (prev + x / prev) / 2; } while (my_fabs(prev - next) > eps); return next; } int main() { printf("sqrt(1e-5) = %lf\n", my_sqrt(1e-5)); printf("sqrt(1) = %lf\n", my_sqrt(1)); printf("sqrt(2) = %lf\n", my_sqrt(2)); return 0; }
Объяснение кода листинга программы
- В функции my_sqrt(double x) представлен алгоритм вычисления квадратного корня без использования функций Math.h и Sqrt.
- Алгоритм основан на итерационном методе под названием
метод Ньютона
. - В первой строке функции проверяется, что x > 0, чтобы избежать деления на ноль.
- Вторая строка определяет константу eps, которая используется для контроля за точностью вычислений.
- Третья строка объявляет две переменные, prev и next, которые используются для хранения предыдущего и текущего приближений к корню.
- Четвертая строка инициализирует переменную next значением x.
- Пятая строка начинает цикл do-while, который продолжается, пока изменение между prev и next больше eps.
- Внутри цикла, prev присваивается значение next, а next вычисляется как среднее значение между prev и x/prev.
- Цикл продолжается до тех пор, пока изменение между prev и next не станет меньше eps.
- Функция возвращает значение next, которое является окончательным приближением к корню.
- В функции main() выполняются тестовые вычисления для проверки функции my_sqrt().
- Вывод показывает результаты вычисления функции my_sqrt() для x = 1e-5, 1 и 2.
- Значения 1e-5 и 1 выбраны для демонстрации работы алгоритма на значениях, близких к нулю и единице.
- Значение 2 выбрано как простое число, для которого легко вычислить квадратный корень вручную.
- Функция my_sqrt() должна давать точные результаты для всех трех значений x.
- Функция my_sqrt() может давать неточные результаты для других значений x, если они не являются целыми числами или если они меньше 0.
- Для проверки точности вычислений можно добавить дополнительные тесты с другими значениями x.
- Если точность вычислений недостаточно хороша, можно попробовать уменьшить значение eps, чтобы увеличить количество итераций в цикле.
- Можно добавить дополнительную проверку на NaN или Inf в функцию my_sqrt(), чтобы обработать некорректные входные данные.
- Функция my_sqrt() может быть использована в других программах, где требуется вычисление квадратного корня без использования стандартных математических функций.