Проблемы с нахождением квадратного корня числа методом деления пополам

#include<iostream>
#include<cmath>
using namespace std;
double bisection(double errorVal, double userNum){
double upper=userNum, lower=0;
double mid=(lower+upper)/2.0;;
while(mid*mid!=userNum){
double mid=(lower+upper)/2.0;
if(mid*mid>userNum){
upper=mid;
} else {
lower=mid;
}
}
return mid;
}

int main(){
double errorVal=0, userNum=0;
std::cout<<"Please enter a number (larger than 0) to calculate its square root, and the desired margin of error."<<std::endl;
std::cin>>userNum>>errorVal;
bisection(errorVal,userNum);
std::cout<<"The calculated result is "<<bisection(errorVal,userNum)<<". The error is "<<abs(bisection(errorVal,userNum)-sqrt(userNum))<<"."<<std::endl;
}

Это программа, которую я написал, чтобы найти квадратный корень любого числа, введенного методом деления пополам. Я, должно быть, что-то делаю не так, потому что я не получаю никаких выходных данных после ввода двух входных параметров, процесс просто застревает там.

Я также хотел бы знать, как правильно реализовать errorVal, так как для указания допустимой погрешности. Благодарю.

2

Решение

Значение ошибки используется для исправления любых неточностей округления, возникающих при выполнении операций с плавающей запятой.

Следующее утверждение редко будет правдой, поэтому ваш цикл может продолжаться в течение длительного времени.

while(mid*mid==userNum)

Обычный способ сравнить две плавающие точки после расчета

fabs(x1-x2) < e //where, fabs retrieves the absolute value,
//x1,2 are the numbers to compare
//and e is the epsilon chosen.

Таким образом, исправление значения ошибки, или обычно называемое epsilon, также исправит цикл.

double bisection(double errorVal, double userNum){
double upper=userNum, lower=0;
double mid=(lower+upper)/2.0;

//error val added
//** fabs(mid*mid - userNum) < errorVal is true if the numers are "equal"//** and you want to run the loop as long as the are NOT "equal"while(!(fabs(mid*mid - userNum) < errorVal)){

mid=(lower+upper)/2.0;
if(mid*mid>userNum){
upper=mid;
} else {
lower=mid;
}
}
return mid;
}

Увидеть:
http://www.cplusplus.com/reference/cmath/fabs/

https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]