我想定義某種安全除法(和模)函數,當試圖除以零時會返回一些預定義的值。我不想拋出異常,只是爲了返回一些「合理的」值(1?0?)並繼續執行程序流程。顯然沒有正確的返回值,但我想知道是否有一些標準或已知的方法來處理此問題。安全劃分功能
安全劃分功能
回答
IEEE浮點標準定義從division by zero得到什麼。
- + A/+ 0 +提供了天道酬勤
- + A/-0給-Inf
- 0/0產生的NaN
如果用整數的工作,你可以用這個標準來定義你自己的例程,但是你必須定義Inf和什麼是整數邏輯中的NaN。
有趣。那麼我可以返回+ Inf/-Inf/Nan並避免FPU拋出的除零異常? – GabiMe 2010-04-08 08:44:04
這是標準允許的選項,是的。 – MSalters 2010-04-08 09:10:26
@bugspy:默認應該是FPU不會拋出異常。如果你問的是FP,你的平臺是什麼? – Potatoswatter 2010-04-08 09:19:33
您可以將該值作爲輸出參數返回。函數的返回類型可以是bool,並且在成功時返回true,在零除後返回false。然後你只需在函數後檢查是否爲真。但現代方法是拋出異常,並將其捕獲到客戶端代碼中。然後,如果你願意,你可以選擇忽略它。
我假定這是一個整數作爲IEEE花車已經解決這個問題
麻煩的是什麼樣的價值可能是「合理的」賴用,所以你需要將它傳遞例如
DivOrDefault(int a, int b, int def)
{
if (b == 0) return def;
return a/b;
}
替代地可以用信號INF /楠無論是在帶外(你可以包裝在一個結構,其還具有一個bool爲INF和或NaN的INT)或帶外(如m_pGaldiator建議的)
ieee浮動塊如何解決這個問題? – GabiMe 2010-04-08 08:48:53
查看mouviciel的回覆。 – 2010-04-08 08:56:41
既然你問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;
}
我假設你想要一個整型操作,並且我添加了一個溢出檢查。
- 1. 按功能劃分的功能劃分功能
- 2. 安全功能
- 3. https安全功能
- 4. PHP安全功能
- 5. 有效劃分大功能
- 6. 劃分功能屬性
- 7. angularjs中的安全功能
- 8. Activiti的安全功能
- 9. 不安全的功能
- 10. PHP郵件功能安全
- 11. android - 基本安全功能
- 12. SQL Server 2016安全功能
- 13. 此功能是否安全?
- 14. Android中的安全功能
- 15. 使功能異常安全
- 16. 將安全功能添加到大量可分發的網站是否安全?
- 17. 加乘減和劃分模板功能
- 18. 按功能劃分的sql組
- 19. 使用功能來劃分範圍
- 20. 下劃線功能
- 21. PHP計劃任務安全
- 22. 字符串安全功能vs安全增強CRT
- 23. 在SVN中的功能分支之間合併安全嗎?
- 24. 使任意功能運行安全嗎?
- 25. 已禁用HBase錯誤安全功能
- 26. Propel的fromArray/fromJSON功能安全嗎?
- 27. Symfony的功能測試:繞過安全
- 28. 安全的流星管理功能
- 29. WebBrowser控件的安全功能
- 30. 線程安全掛鉤功能
try/catch塊有什麼問題? – 2010-04-08 08:37:30
「int div(int a,int b,bool * bOK = 0);」 如果你想知道結果是否有效,傳入一個指向bool的指針。 – Thomi 2010-04-08 08:37:35
程序越糟越好,我想要的最後一件事就是讓這個過程不被人注意。對於不分小孩的蘋果來說,沒有「合理」的尺寸。 「標準方法」是解決你的錯誤。 – sbi 2010-04-08 08:39:11