2015-09-17 3 views
-3

Проблема, которую я не могу решить, - это то, как я нахожу sqrt чисел между 0 и 1. После этого я думаю, что все работает. Единственными номерами ввода, которые приводят к сбою этой программы, являются номера между 0 (не включены) и 1 (не включены)Попытка найти sqrt чисел между 0 и 1 без функции sqrt

Любая помощь?

#include <iostream> 
#include <cmath> 
#include <cassert> 
#include <stdlib.h> 
#include <cmath> 

using namespace std; 

double squareroot(double x) /* computes the square root of x */ 

{ 
assert(x >= 0); /* make sure x is not negative*/ 
if (x==0) return 0; 

/* the sqrt must be between xhi and xlo */ 
double xhi = x; 
double xlo = 0; 
double guess = x/2; 

/* We stop when guess*guess-x is very small */ 

while (abs(guess*guess-x) > 0.00001) 
    { 
    if (guess*guess > x) xhi = guess; 
    else xlo = guess; 
    guess = (xhi + xlo)/2; 
    } 

return guess; 
} 

/* Test Stub */ 


int main() 
{ 
    double testvalue; 
    cout << "\n Enter a TestValue= " ; 
    cin >> testvalue; 
    cout << endl; 
    double testresult = squareroot(testvalue); 
    cout << "\n Square Root= " << testresult << "\n" ; 
    } 
+1

переполнение стека не вашей личной справочной службы. Поэтому я бы сказал, Нет! –

+0

Если программа выйдет из строя, попробовал ли вы запустить ее в отладчике, чтобы поймать сбой? В противном случае, вы пробовали переходить через код, строко за строкой, в отладчике? –

+0

Это не сбой. Я попробовал отладить его. Он работает очень хорошо, но в какой-то момент я что-то упускаю. И это включает sqrt чисел от 0 до 1 (например, 0,4 0,1 0,7) – Marme

ответ

3

Ваша программа рушится из-за этой линии:

while (abs(guess*guess-x) > 0.00001)

Если у вас есть число между 0 и 1, ваш алгоритм всегда приведет к ряду больше, чем 0,00001, что приводит к бесконечному циклу , Исправить будет либо изменение вашего алгоритма на другой метод аппроксимации квадратного корня (см. Метод Ньютона, теорема о неподвижной точке, методы полиномиальной аппроксимации и т. Д.).

Подсказка: попробуйте трассировку кода, чтобы увидеть, что происходит, даже если вам нужно записать его на бумаге

+0

Основная проблема заключается в исходном предположении, что квадратный корень будет находиться между 'xhi' и' xlo'. Это не так для фракций. – Barmar

+0

Я смог решить это, просто добавив простой IF. Когда x находится между 0 и 1, xhi = 1 и xlo = 0, а процесс внутри while повторяется для этого условия. Не нужно было менять технику аппроксимации или все это. – Marme