Голосование за лучший ответ
Сергей Барановский
Мудрец
(14000)
14 лет назад
По моему функция absValue афигительно портит стек и после нескольких итераций может произойти что угодно. Предлагаю переписать ее следующим образом:
float absValue(float x)
{
return ((x<0) ? -x:x);
}
Удачи !
При вычислении квадратного корня из числа следует помнить, что подкоренное выражение не должно быть отрицательным.
Алгоритм метода Ньютона–Рафсона для вычисления квадратного корня числа:
Шаг 1. Выбрать приблизительное значение 1.
Шаг 2. Если |guess^2 – x| < e, перейти к шагу 4.
Шаг 3. Установить приблизительное значение, равное (x/guess + guess)/2, и перейти к шагу 2.
Шаг 4. Считать приблизительное значение квадратным корнем числа
Но при вводе числа программа зависает..В чем может быть проблема?
#include <stdio.h>
#include <conio.h>
float absValue(float x);
float squareRoot (float Na);
// Функция абсолютного значения числа
float absValue(float x)
{
(x < 0)? x = (-1)*x: x;
return (x);
}
// Функция расчета квадратного корня из числа
float squareRoot (float Na) {
const float epsilon = 0.000001F;
float m03 = 7.5F; //Начальное приближение
while (absValue(m03*m03 - Na) >= epsilon)
m03 = (Na/m03 + m03)/2.0;
return (m03);
}
int main (void)
{
float result, X = -3.0F;
while (X < 0){
printf("\n\t Enter a number: ");
scanf_s("%f", &X);
}
// Обращение к функции с фактическим параметром
result = squareRoot(X);
printf("\n\t Square root of \"%1.4f\" is: %1.8f\n", X, result);
printf("\n Press any key: ");
_getch();
return 0;
}