我想定义某种安全除法(和模)函数,当试图除以零时会返回一些预定义的值。我不想抛出异常,只是为了返回一些“合理的”值(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