C++ 安全划分函数

C++ 安全划分函数,c++,C++,我想定义一种安全的除法(和模)函数,当试图除以零时,它将返回一些预定义的值。我不想抛出异常,只想返回一些“合理”值(1?0?)并继续程序流程。显然,没有正确的返回值,但我想知道是否有某种标准或已知的方法来实现此目的您可以将该值作为输出参数返回。函数返回类型可以是bool,成功时返回true,除以零时返回false。然后,只需在函数之后检查true。但是现代的方法是抛出异常,并在客户端代码中捕获它。如果您愿意,您可以选择忽略它。IEEE浮点标准定义了从一个 +a/+0给出+Inf +a/-0给出

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

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

IEEE浮点标准定义了从一个

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

如果使用整数,可以使用此标准定义自己的例程,但必须定义整数逻辑中的Inf和NaN。

我假设这适用于int,因为ieee float已经解决了这一问题

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

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

可选地,可以在带内信号INF/NAN:(可以在int中包上int,也有INF和ANN的BOL)或带外(如MyPGaldior建议)

< P>因为您特别要求C++,可以做< /P>
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 );
}

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

try/catch块有什么问题?关于“int div(int a,int b,bool*bOK=0)”如何?如果您想知道结果是否有效,请传入一个指向bool的指针。程序越坏越好,我最不想让它通过而不被注意。没有孩子的苹果没有“合理”的大小。解决这个问题的“标准方法”是纠正你的错误。一个没有孩子的苹果可能会腐烂,它的种子可能会长成一棵新树,而新树又可能长成苹果,而苹果可能长成树。。。换句话说:无限取决于你为什么要分裂,有时产生一个无限而不是爆炸是完全合理的。老实说,我不能想象整除的情况是这样的,当然,因为整数没有无限状态。那么,我可以返回+Inf/-Inf/Nan并避免FPU抛出的被零除异常吗?这是标准允许的选项,是的。@bugspy:默认值应该是FPU不抛出异常。如果您询问FP,您的平台是什么?
optional<int> safe_div( int lhs, int rhs ) {
    if ( rhs == 0 || lhs == INT_MIN && rhs == -1 ) return optional<int>();
    else return lhs/rhs;
}