安全分割功能

时间:2010-04-08 08:34:01

标签: c++

我想定义某种安全除法(和模数)函数,当尝试除以零时会返回一些预定义值。我不想抛出异常,只是为了返回一些“合理”的值(1?0?)并继续程序流程。显然没有正确的返回值,但我想知道是否有一些标准或已知的方法

4 个答案:

答案 0 :(得分: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;
}

我假设你想要一个整数运算,我添加了一个溢出检查。

答案 1 :(得分:2)

IEEE浮点标准定义了从division by zero获取的内容。

  • + a / +0给出+ Inf
  • + a / -0给出-Inf
  • 0/0给出NaN

如果你使用整数,你可以使用这个标准来定义你自己的例程,但你必须定义什么是Inf,什么是整数逻辑中的NaN。

答案 2 :(得分:0)

您可以将值作为输出参数返回。函数返回类型可能是bool,成功时返回true,除零时返回false。然后你只需在函数后检查true。但现代方法是抛出异常而将其捕获到客户端代码中。然后你可以选择忽略它。

答案 3 :(得分:0)

我假设这是为了整数,因为ieee浮动已经修复了这个

问题是价值可能是“合理的”取决于使用,所以你需要传递它,例如。

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

或者你可以在带内信号通知inf / Nan(你可以将int包装在一个结构中,该结构也有一个bo和inf或者是nan)或带外(如m_pGaldiator建议的那样)