Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос по С!

Павел Надоров Ученик (179), на голосовании 14 лет назад
Создал программу вычисления квадратного корня числа по методу Ньютона–Рафсона с использованием функции расчета квадратного корня числа и функции расчета абсолютного значения числа.
При вычислении квадратного корня из числа следует помнить, что подкоренное выражение не должно быть отрицательным.
Алгоритм метода Ньютона–Рафсона для вычисления квадратного корня числа:
Шаг 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;
}

Голосование за лучший ответ
Сид Знаток (382) 14 лет назад
Постить сюда большие задачи - бессмысленно. Никто больше трех строчек тебе отвечать не будет.
Сергей Барановский Мудрец (14000) 14 лет назад
По моему функция absValue афигительно портит стек и после нескольких итераций может произойти что угодно. Предлагаю переписать ее следующим образом:
float absValue(float x)
{
return ((x<0) ? -x:x);
}
Удачи !
Похожие вопросы