我的for-loop没有启动

Tip*_*Rex -1 c++ for-loop

我知道有很多关于这个问题的主题,但这些都没有帮助我.我试图通过测试-10到10范围内的每个数字以及两个小数位来找到函数的根.我知道这可能不是最好的方式,但我是初学者,只是想尝试一下.不知怎的,循环不起作用,因为我总是得到-10作为输出.无论如何,这是我的代码:

 #include <iostream>
using namespace std;

double calc (double m,double n)
{
  double x;
  for (x=-10;x<10 && m*x+n==0; x+=0.01)
  {
   cout << x << endl;
  }
  return x;
}



int main()
{
  double m, n, x;

  cout << "......\n";
  cin >> m;                         // gradient
  cout << "........\n";
  cin >> n;                         // y-intercept
  x=calc(m,n);                      // using function to calculate
  cout << ".......... " << x<< endl; //output solution
  cout << "..............\n";        // Nothing of importance
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

mer*_*011 5

您正在测试循环条件中两个条件的结合.

for (x=-10;x<10 && m*x+n==0; x+=0.01
Run Code Online (Sandbox Code Playgroud)

对于许多输入,第二个条件不会为真,因此循环将在第一次迭代之前终止,从而导致返回值为-10.

你想要的可能更接近以下的东西.我们需要测试绝对值是否小于某些EPSILON因为两个原因.一,double不准确.第二,你正在做一个近似的解决方案,所以除非你碰巧幸运,否则你不会指望一个确切的答案.

#define EPSILON 1E-2
double calc (double m,double n)
{
    double x;
    for (x=-10;x<10; x+=0.001)
    {
        if (abs(m*x+n) < EPSILON) return x;
    }

    // return a value outside the range to indicate that we failed to find a
    // solution within range.
    return -20;
}
Run Code Online (Sandbox Code Playgroud)

更新:根据OP的要求,我将更具体地EPSILON解决问题所解决的问题.

  1. double不精确.在计算机中,浮点数通常由固定数量的位表示,其中位表示通常由诸如IEE 754的标准指定.由于位数是固定且有限的,因此不能表示任意精度数.让我们考虑一个例子,基座10为便于理解,但你应该明白,电脑在基地2.遇到类似的问题.如果m = 1/3,x = 3n = -1,我们预期m*x + n == 0.但是,因为1/3是重复的小数0.33333...,我们只能表示它们的固定数,结果3*0.33333实际上是0.999999,它不等于1.因此,m*x + n != 0我们的检查将失败.因此,我们必须通过将其绝对值与我们调用的小数字进行比较检查结果是否足够接近于零,而不是检查是否为零EPSILON.正如其中一条评论所指出的EPSILON,这个特定目的的正确价值是std::numeric_limits::epsilon,但第二个问题需要更大EPSILON.

  2. 你只是在做一个近似的解决方案.由于您正在x以有限的小增量检查值,因此很有可能您只是跨过根而不会完全落在它上面.考虑方程式10000x + 1 = 0.正确的解决方案是-0.0001,但如果您正在采取措施0.001,您将永远不会尝试该值x = -0.0001,因此您无法找到正确的解决方案.对于线性函数,我们期望x接近的值-0.0001,例如x = 0,将使我们合理地接近正确的解,因此我们使用EPSILON软糖因子来解决方法中缺乏精度的问题.