代码之家  ›  专栏  ›  技术社区  ›  GabiMe

安全分区功能

c++
  •  1
  • GabiMe  · 技术社区  · 15 年前

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

    4 回复  |  直到 15 年前
        1
  •  2
  •   mouviciel    15 年前

    ieee浮点标准定义了从 division by zero .

    • +a/+0给出+inf
    • +A/-0给出-inf
    • 0/0表示NaN

    如果使用整数,则可以使用此标准定义自己的例程,但必须在整数逻辑中定义什么是inf,什么是nan。

        2
  •  6
  •   Potatoswatter    15 年前

    既然你特别要求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;
    }
    

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

        3
  •  0
  •   m_pGladiator    15 年前

    可以将该值作为输出参数返回。函数返回类型可以是bool,成功时返回true,除以0时返回false。然后在函数之后简单地检查是否为true。但是现代的方法是抛出异常并在客户端代码中捕获它。如果你愿意,你可以选择忽略它。

        4
  •  0
  •   jk.    15 年前

    我假设这是针对int的,因为ieee float已经修复了这个问题

    问题是什么价值可能是“合理的”取决于使用,因此您需要将其传递给例如。

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

    或者,您可以给inf/nan发送带内信号(您可以将int包装在一个结构中,该结构还具有inf和或nan的bool)或带外信号(如m_pgaldiator建议的那样)