我想定义某种安全除法(和模)函数,当试图除以零时会返回一些预定义的值。我不想抛出异常,只是为了返回一些“合理的”值(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. https安全功能
- 3. 有效划分大功能
- 4. SQL Server 2016安全功能
- 5. 不安全的功能
- 6. Activiti的安全功能
- 7. Android中的安全功能
- 8. 按功能划分的sql组
- 9. 使用功能来划分范围
- 10. 下划线功能
- 11. PHP计划任务安全
- 12. 字符串安全功能vs安全增强CRT
- 13. 在SVN中的功能分支之间合并安全吗?
- 14. 禁止AJAX作为安全功能
- 15. 没有复制安全功能
- 16. 这些安全功能是否足够?
- 17. 安全[是/否]; [1/2/3/etc。]功能
- 18. 安全登录和注册功能
- 19. 如何使此功能缩小安全?
- 20. 此登录功能是否安全?
- 21. WCF安全与AD功能组
- 22. 安全加密/解密功能
- 23. 已禁用HBase错误安全功能
- 24. 线程安全,无锁增量功能?
- 25. 使任意功能运行安全吗?
- 26. 是否启用安全保护功能
- 27. WebBrowser控件的安全功能
- 28. 禁用Windows Mobile安全功能
- 29. 使用eval安全地执行功能
- 30. Symfony的功能测试:绕过安全
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