[英]C++ divide by zero
我開始學習C ++編程,並對錯誤處理有疑問。
我已經制作了一個代碼,用函數ax+b=0
來計算x(所以我必須將-b
除以a
)。 用戶通過cin >>
輸入值
如果我除以0,我得到-int
作為我的輸出。 是否有可能捕獲錯誤(例如,使用if
語句)?
我知道除以零是不可能的,我也知道如果它沒有檢查用戶的輸入(例如if ((a != 0)){calculate}
),它就不是一個好的行為形成一個程序。 問題是我想知道如何/如何捕獲此錯誤;-)它是否依賴於硬件,操作系統或編譯器?
我的老師幫不了我;)
順便說一句。 我在Mac OS X 10.8.2上使用Eclipse Juno IDE for C / C ++
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
float a, b, x; //float da Kommazahlen erwartet werden
cout << "ax + b = 0" << '\n'<< endl;
cout << "Bitte geben Sie einen Wert für a ein:" << endl;
cin >> a;
cout << "Bitte geben Sie einen Wert für b ein:" << endl;
cin >> b;
x = -b/a;
cout << "Ergebnis:" << x << endl;
if (x == #INF )
{
cout << "Du bist a Volldepp - durch Null kann man nicht teilen!" << endl;
}
return 0;
}
是:
在C ++ 03中
if ((x == +std::numeric_limits<float>::infinity()) ||
(x == -std::numeric_limits<float>::infinity())
)
在C ++ 11中
if (std::isinf(x))
在嘗試除法之前,只需檢查a == 0
:
if (a == 0) {
std::cerr << "I'm not even going to try\n";
return 1;
} else {
std::cout << "-b/a = " << (-b/a) << std::endl;
}
但是,對於一些非常小的數字,這可能仍會產生inf
。
(注意,一般來說,檢查float
是否等於某個值因為舍入錯誤而不可靠 ,但是對於零則沒關系。)
您應該在計算之前檢查輸入的正確性,而不是之后:
if ( a == 0 ) {
if ( b == 0 )
cout << "equation valid for all x" << endl;
else
cout << "no x satisfies this equation" << endl;
}
是的,處理這種情況的最佳方法是== 0條件。 除以零也不例外,它在硬件級別處理。 硬件向操作系統和操作系統發送中斷,從而導致應用程序崩潰。 它可以通過信號捕獲:
#include <csignal>
#include <iostream>
using namespace std;
void handler(int nVal)
{
cout << "Divid By Zero Error" << endl;
}
int main()
{
signal(SIGFPE, handler);
int nVal = 1/0;
}
我回應其他海報說你應該檢查你的論點,但還有另一種選擇: http : //en.cppreference.com/w/cpp/numeric/math/math_errhandling
根據該鏈接,在C ++ 11中,您可以設置#define
以使其在除以零時拋出FE_DIVBYZERO
類型的異常。 但該頁面上的文檔並不清楚,因此請查看您自己的編譯器是否支持此功能。
您無法在C
捕獲異常,但您可以通過檢查值來避免它。
試試這樣,它會幫助你
if (a == 0) {
x = 0;
} else {
x = b/a;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.