=0); 如果(x==0)返回0; /*sqrt必须介于xhi和xlo之间*/ 双xhi=x; 双xlo=0; 双猜测=x/2; /*当guess*guess-x非常小时,我们停止*/ 而(abs(guess*guess-x)>0.000001) { 如果(guess*guess>x)xhi=guess; else xlo=猜测; 猜测=(xhi+xlo)/2; } 返回猜测; } /*测试存根*/ int main() { 双重测试值; cout>testvalue; cout,c++,square-root,C++,Square Root" /> =0); 如果(x==0)返回0; /*sqrt必须介于xhi和xlo之间*/ 双xhi=x; 双xlo=0; 双猜测=x/2; /*当guess*guess-x非常小时,我们停止*/ 而(abs(guess*guess-x)>0.000001) { 如果(guess*guess>x)xhi=guess; else xlo=猜测; 猜测=(xhi+xlo)/2; } 返回猜测; } /*测试存根*/ int main() { 双重测试值; cout>testvalue; cout,c++,square-root,C++,Square Root" />

C++;平方根函数错误 < >我有一个C++算法,它计算整数的平方根。除了一个缺陷,该程序可以正常工作。无法计算低于1的数字的平方根。例如,它不能计算.5或.9或.0000001等的平方根,但在所有其他情况下都能按计划工作。我设置了X,所以它不允许负输入,但我仍然不明白为什么它不会返回小于1的值 include <iostream> #include <cmath> #include <cassert> using namespace std; double squareroot(double x) { /* computes the square root of x */ /* make sure x is not negative .. no math crimes allowed! */ assert(x >= 0); 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.000001) { 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"; } double squareroot(double x) { /* make sure x is not negative .. no math crimes allowed! */ assert(x >= 0); if (x == 0) return 0; double guess = x / 2; while (abs(guess*guess - x) > 0.000001) { double dx = 0.5*(guess*guess -x)/guess; guess -= dx; cout << "guess: " << guess << endl; } return guess; } 包括 #包括 #包括 使用名称空间std; 双平方根(双x) {/*计算x的平方根*/ /*确保x不是负的…不允许数学犯罪*/ 断言(x>=0); 如果(x==0)返回0; /*sqrt必须介于xhi和xlo之间*/ 双xhi=x; 双xlo=0; 双猜测=x/2; /*当guess*guess-x非常小时,我们停止*/ 而(abs(guess*guess-x)>0.000001) { 如果(guess*guess>x)xhi=guess; else xlo=猜测; 猜测=(xhi+xlo)/2; } 返回猜测; } /*测试存根*/ int main() { 双重测试值; cout>testvalue; cout

C++;平方根函数错误 < >我有一个C++算法,它计算整数的平方根。除了一个缺陷,该程序可以正常工作。无法计算低于1的数字的平方根。例如,它不能计算.5或.9或.0000001等的平方根,但在所有其他情况下都能按计划工作。我设置了X,所以它不允许负输入,但我仍然不明白为什么它不会返回小于1的值 include <iostream> #include <cmath> #include <cassert> using namespace std; double squareroot(double x) { /* computes the square root of x */ /* make sure x is not negative .. no math crimes allowed! */ assert(x >= 0); 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.000001) { 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"; } double squareroot(double x) { /* make sure x is not negative .. no math crimes allowed! */ assert(x >= 0); if (x == 0) return 0; double guess = x / 2; while (abs(guess*guess - x) > 0.000001) { double dx = 0.5*(guess*guess -x)/guess; guess -= dx; cout << "guess: " << guess << endl; } return guess; } 包括 #包括 #包括 使用名称空间std; 双平方根(双x) {/*计算x的平方根*/ /*确保x不是负的…不允许数学犯罪*/ 断言(x>=0); 如果(x==0)返回0; /*sqrt必须介于xhi和xlo之间*/ 双xhi=x; 双xlo=0; 双猜测=x/2; /*当guess*guess-x非常小时,我们停止*/ 而(abs(guess*guess-x)>0.000001) { 如果(guess*guess>x)xhi=guess; else xlo=猜测; 猜测=(xhi+xlo)/2; } 返回猜测; } /*测试存根*/ int main() { 双重测试值; cout>testvalue; cout,c++,square-root,C++,Square Root,0.5的平方根是~0.7。如果检查失败,您的逻辑是猜测一个较小的数字。您需要做的是添加一个额外的检测层,查看该数字是否

0.5的平方根是~0.7。如果检查失败,您的逻辑是猜测一个较小的数字。您需要做的是添加一个额外的检测层,查看该数字是否<1,然后修改流以增加下一个猜测,而不是减少它。

添加一些调试输出。这将帮助您理解为什么程序永远不会转换当
x<1.0
时,RGE转换为解决方案

while (abs(guess*guess - x) > 0.000001)
{
    if (guess*guess > x)
    {
       cout << "Changing xhi\n";
       xhi = guess;
    }
    else
    {
       cout << "Changing xlo\n";
       xlo = guess;
    }

    guess = (xhi + xlo) / 2;
    cout << "guess: " << guess << endl;
}

撇开XA不谈,浮点值的相等性测试是一个禁忌。改用离散距离测试:
bool IsEqual(double a,double b){return std::fabs(a-b)<0.000001;}
我首先要确保在整个过程中使用“浮点符号”(即
guess=(xhi+xlo)/2.0
)检查数学,而不是代码。注意当
x<1
if(猜测*猜测>x)
将始终遵循
其他
路线。您的问题描述不清楚。您要计算整数的平方根,然后在计算大于零和小于一的值的平方根时遇到问题。好吧,很少有整数同时大于零和小于一。如果您想要高精度n回答,将您的
guess=…
code更改为
double next\u guess=…;如果(next\u guess==guess)中断;guess=next\u guess;
迭代,直到达到稳定(对于任何算法,您都应该始终考虑是否保证会发生这种情况).就数学而言,这是正确的答案,但要使代码正常工作,您需要删除那些
double
声明。只需
xhi=x;
即可(正确)初始化在
if
外部声明的
double xhi;
,而不是在
if
块内部定义一个本地
double xhi=x;
,该块在块外部没有用处或结果。
double squareroot(double x)
{
   /* make sure x is not negative .. no math crimes allowed! */
   assert(x >= 0);
   if (x == 0) return 0;

   double guess = x / 2;
   while (abs(guess*guess - x) > 0.000001)
   {
      double dx = 0.5*(guess*guess -x)/guess;
      guess -= dx;
      cout << "guess: " << guess << endl;
   }

   return guess;
}
double xhi, xlo, guess;
if (x > 1){
    xhi = x;
    xlo = 0;
    guess = x / 2;
}
else{
    xhi = 1;
    xlo = x;
    guess = (x + 1) / 2;
}