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

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double bisection(double errorVal, double userNum){
double upper=userNum, lower=0;
double mid=(lower+upper)/2.0;
while(!(fabs(mid*mid-userNum)<=errorVal)){
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 "<<std::setprecision(11)<<bisection(errorVal,userNum)<<". The amount of error is "<<fabs(bisection(errorVal, userNum)-sqrt(userNum))<<"."<<std::endl;
}

Это программа-прототип, которую я разработал для вычисления квадратного корня числа, определяемого пользовательским вводом, используя метод деления пополам (я знаю, что есть лучшие способы, такие как Ньютон-Рафсон, CORDIC, но это задание дано).

Единственная проблема заключается в следующем:

Когда вход для userNum это десятичное число от 0 до 1, программа останавливается независимо от заданной точности, за исключением ввода 0,1, 0,1. Это приводит к неточному результату 0,5 с ошибкой 0,266227766, что превышает указанный предел погрешности 0,1.

Мои основные вопросы: почему он не обрабатывает числа от 0 до 1?

0

Решение

Квадратные корни чисел, меньших 1, больше исходного числа (помните функцию корня). Как userNum верхняя граница возможных результатов, эти корни не могут быть вычислены с вашим кодом.
Как решение: добавить

if( userNum < 1.0 ) {
upper = 1.0;
}

перед петлей.

Чтобы обратиться к другой части вопроса: mid на самом деле состоит из истинного корня и ошибки, середина + дельта середина. в fabs-часть, вы квадраты обоих. Таким образом, вы на самом деле сравнить errorVal с  (\ Delta mid) ^ 2 + 2 mid * \ Delta mid ,в конце вы печатаете для сравнения просто середина + дельта середина.

1

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

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

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