簡體   English   中英

C ++除以零

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM