C ++二次代码错误

时间:2016-03-02 19:24:27

标签: c++

我遇到以下代码问题:

#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");

    float discriminant, A, B, C, root1, root2;

    fin >> A >> B >> C;

    while (A != -99)
    {
        discriminant = (pow(B, 2.0) - 4 * A*C);

        if (A == 0)
        {
            fout << A << "\t" << B << "\t" << C << "\t" << root1 << "\t" << root2 << endl;
        }

        else if (discriminant > 0)
        {
            root1 = (-B - sqrt(discriminant)) / (2.0*A);
            root2 = (-B + sqrt(discriminant)) / (2.0*A);
            fout << A << "\t" << B << "\t" << C << "\t" << root1 << "\t" << root2 << endl;
        }

        else if (discriminant == 0)
        {
            fout << A << "\t" << B << "\t" << C << "\t" << root1 << "\t" << root2 << endl;
        }

        else
        {
            fout << A << "\t" << B << "\t" << C << "\t" << root1 << "\t" << root2 << endl;
        }

        fin >> A >> B >> C;
    }

    fout.close();

    ifstream fin2("output.txt");

    fin2 >> A >> B >> C >> root1 >> root2;

    while (!fin2.eof())
    {
        cout << A << "\t" << B << "\t" << C << "\t" << root1 << "\t" << root2 << endl;

        fin2 >> A >> B >> C >> root1 >> root2;
    }

    cout << endl;
    cout << "Coded by Paye W. Kialain" << "\t"<< endl;
    system("pause");
    return 0;
}

在项目描述中,我被告知创建一个包含a,b和c的输入文件,我做了。输出的格式也是正确的。它是一个显示a,b和c值以及2个计算根的表。然而,根的计算似乎是关闭的。我的if语句是问题吗?

1 个答案:

答案 0 :(得分:1)

语句discriminant == 0A == 0是危险的比较,因为discriminantAfloat。浮点计算通常伴随着浮点错误(在数学近似中得到的错误)。

考虑这个浮点错误的简单示例:

#include <iostream>
#include <string>

int main()
{
  float a = 3.0;
  float b = 10.0;
  std::cout.precision(20);
  std::cout << a/b << std::endl;
}

3.0 / 10.0,这是小学数学!您希望结果为0.3。但事实证明,结果是0.30000001192092895508。如果abdouble s,则结果为0.2999999999999999889。这是因为浮点数以二进制表示的方式不允许精确表示0.3。现在想象如果我有像if(a/b == 0.3)这样的代码会发生什么。这种情况永远不会得到满足。

此问题的解决方案是引入epsilon值。该epsilon值基本上用作容错的值。

float a = 3.0;
float b = 10.0;

const float epsilon = 0.000001;

if(fabs(a/b - 0.3) < epsilon) {
  std::cout << "a/b is equal to 0.3!" << std::endl;
}