2016-03-02 92 views
-3

我遇到的問題與下面的代碼: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; 
} 

在項目描述中,有人告訴我,創建一個包含,b和c,我做到了輸入文件。輸出格式也是正確的。它是一個顯示a,b和c值以及2個計算出的根的表格。然而,根的計算似乎是關閉的。我的if語句是否是這個問題?

+2

也許你可以告訴我們什麼輸入會給出什麼錯誤的輸出。 –

+0

輸入是: 6 -10 -4 但輸出似乎是: 6 -10 -4 -0.333333 2 2 6 9 - 0.333333 2 2 4 8 -0.333333 2 0 2 4 -0.333333 2 2 4 2 2 -0.333333 通過佩耶W. Kialain 按編碼任意鍵繼續。 。 。 –

+0

一些最新出現錯誤的細節:[爲什麼浮點數不準確?](http://stackoverflow.com/questions/21895756/why-are-floating-point-numbers-incucurate) – user4581301

回答

1

陳述discriminant == 0A == 0是危險的比較,因爲discriminantAfloat s。浮點計算通常伴隨着浮點錯誤(想想你用數學近似得到的錯誤)。

考慮浮點錯誤的這個簡單的例子:

#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。如果ab分別爲double 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; 
} 
+0

感謝您的幫助!但是,我不確定如何結合epsilon常數而不會使任何事情複雜化;並且會阻止代碼爲每個root1和root2值賦予相同的值? –

+0

將'epsilon'方法看作'some_float == 0'的「安全」版本。我不明白它會如何使任何事情複雜化。你必須自己嘗試一下。如果您不能爲煩瑣或害怕進行實驗和迭代而無法進行編程。 – Nard