Целта на функциите е да изчислят корен квадратен от число по метода на Нютон-Рафсън. Включих рутина printf в цикъла while, за да мога да виждам как стойността на корен 2 се доближава все по-близо до действителната стойност. Първоначално използвах float, за да дефинирам епсилон, но тъй като увеличих стойността на епсилон, стойността на върнатите резултати изглежда отрязана след определен брой цифри. Затова реших да превключа цялата променлива на long double и програмата показва отрицателни резултати. Как да го поправя?
//Function to calculate the absolute value of a number
#include <stdio.h>
long double absoluteValue (long double x)
{
if (x < 0)
x = -x;
return (x);
}
//Function to compute the square root of a number
long double squareRoot (long double x, long double a)
{
long double guess = 1.0;
while ( absoluteValue (guess * guess - x) >= a){
guess = (x / guess + guess) / 2.0;
printf ("%Lf\n ", guess);
}
return guess;
}
int main (void)
{
long double epsilon = 0.0000000000000001;
printf ("\nsquareRoot (2.0) = %Lf\n\n\n\n", squareRoot (2.0, epsilon));
printf ("\nsquareRoot (144.0) = %Lf\n\n\n\n", squareRoot (144.0, epsilon));
printf ("\nsquareRoot (17.5) = %Lf\n", squareRoot (17.5, epsilon));
return 0;
}
double
и да поставите някакъв код, за да избегнете безкраен цикъл. - person Matthew Carlson   schedule 30.05.2015printf
повишаватfloat
доdouble
, така че третират%f
и%lf
по същия начин (очаквайки 8-байтов аргумент). Те (%f
и%lf
) се различават само когато се използват във функции от семействотоscanf
. - person barak manos   schedule 30.05.2015