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; 
} 

我假设你想要一个整型操作,并且我添加了一个溢出检查。