2010-04-08 68 views
1

我想定義某種安全除法(和模)函數,當試圖除以零時會返回一些預定義的值。我不想拋出異常,只是爲了返回一些「合理的」值(1?0?)並繼續執行程序流程。顯然沒有正確的返回值,但我想知道是否有一些標準或已知的方法來處理此問題。安全劃分功能

+0

try/catch塊有什麼問題? – 2010-04-08 08:37:30

+0

「int div(int a,int b,bool * bOK = 0);」 如果你想知道結果是否有效,傳入一個指向bool的指針。 – Thomi 2010-04-08 08:37:35

+6

程序越糟越好,我想要的最後一件事就是讓這個過程不被人注意。對於不分小孩的蘋果來說,沒有「合理」的尺寸。 「標準方法」是解決你的錯誤。 – sbi 2010-04-08 08:39:11

回答

2

IEEE浮點標準定義從division by zero得到什麼。

  • + A/+ 0 +提供了天道酬勤
  • + A/-0給-Inf
  • 0/0產生的NaN

如果用整數的工作,你可以用這個標準來定義你自己的例程,但是你必須定義Inf和什麼是整數邏輯中的NaN。

+0

有趣。那麼我可以返回+ Inf/-Inf/Nan並避免FPU拋出的除零異常? – GabiMe 2010-04-08 08:44:04

+0

這是標準允許的選項,是的。 – MSalters 2010-04-08 09:10:26

+1

@bugspy:默認應該是FPU不會拋出異常。如果你問的是FP,你的平臺是什麼? – Potatoswatter 2010-04-08 09:19:33

0

您可以將該值作爲輸出參數返回。函數的返回類型可以是bool,並且在成功時返回true,在零除後返回false。然後你只需在函數後檢查是否爲真。但現代方法是拋出異常,並將其捕獲到客戶端代碼中。然後,如果你願意,你可以選擇忽略它。

0

我假定這是一個整數作爲IEEE花車已經解決這個問題

麻煩的是什麼樣的價值可能是「合理的」賴用,所以你需要將它傳遞例如

DivOrDefault(int a, int b, int def) 
{ 
    if (b == 0) return def; 
    return a/b; 
} 

替代地可以用信號INF /楠無論是在帶外(你可以包裝在一個結構,其還具有一個bool爲INF和或NaN的INT)或帶外(如m_pGaldiator建議的)

+0

ieee浮動塊如何解決這個問題? – GabiMe 2010-04-08 08:48:53

+0

查看mouviciel的回覆。 – 2010-04-08 08:56:41

6

既然你問C++的具體情況,你可以做

pair< int, bool > safe_div(int lhs, int rhs) { 
    if (rhs == 0 || lhs == INT_MIN && rhs == -1) return make_pair(0, false); 
    else return make_pair(lhs/rhs, true); 
} 

交替boost::optional

optional<int> safe_div(int lhs, int rhs) { 
    if (rhs == 0 || lhs == INT_MIN && rhs == -1) return optional<int>(); 
    else return lhs/rhs; 
} 

我假設你想要一個整型操作,並且我添加了一個溢出檢查。