【问题标题】:what is a domain error什么是域错误
【发布时间】:2009-03-13 00:41:52
【问题描述】:

在 c++ 中, 有一个用于“域错误”的基类 std::domain_error。我不明白在什么情况下我应该在我的代码中抛出一个域错误。所有其他异常基类都很容易解释。我很确定 std::domain_error 本身与互联网域名无关,所以请解释一下域错误是哪类错误并提供一些示例。

【问题讨论】:

  • 所以我看到很多关于数学领域的回应,例如sqrt(-1) 应该抛出一个域错误(当然,除非你实现复数)。这与 range_error 有何不同?在你回答之前,我会认为 sqrt(-1) 是一个 range_error。
  • 需要注意的是,没有c++标准库函数会抛出域错误。它适用于最终用户。

标签: c++ stl


【解决方案1】:

很好的解释表cplusplus.com:

通常,数学函数的域是为其定义的值的子集。例如,平方根函数只为非负数定义。因此,此类函数的负数将是域错误。

【讨论】:

    【解决方案2】:

    嗯,这就是您从 C++ 标准中获得的所有指导:

    类 domain_error 定义了 作为异常抛出的对象类型 由执行报告域 错误。

    这里的域是指“问题域”,与互联网无关。例如,如果传递负数,平方根函数可能会引发域错误。

    【讨论】:

      【解决方案3】:

      "详细说明 由库或您抛出以报告域错误(数学意义上的域)。 "

      发件人:http://www.aoc.nrao.edu/~tjuerges/ALMA/STL/html/classstd_1_1domain__error.html

      据此,如果您的输入不符合您在界面上设置的约束,则应该使用它。比如说,一个应该接收正值并被赋予负值的函数。

      【讨论】:

        【解决方案4】:

        在处理数学函数时会使用域和范围误差。

        一方面,函数的域是函数可以接受的值的集合。例如,平方根函数的域是一组正实数。因此,当函数的参数不包含在其域中时,将引发domain_error 异常

        另一方面,函数的范围是函数可以返回的值的集合。例如,像这样的函数的范围:

        f(x) = -x²
        

        是负实数的集合。那么range_error 的意义何在?如果函数的参数在它的域中,那么结果必须在它的范围内,所以我们不应该在范围内有任何错误......但是,有时值可以定义,但不能具有代表性。例如,在 C 中,<math.h> 中的函数如果返回值的大小太大(或太小)而无法表示,则会产生错误

        【讨论】:

        • 我想知道在非数学函数中抛出 domain_error 和 range_error 是否是标准或应受谴责的,以表示相同的错误条件(也许是argument_error而不是domain_error?)
        • @fuzzyTew:事实上,标准库包含一个类invalid_argument,所以你应该改用它:)!
        • 感谢您对何时使用异常进行了很好的解释。您对 range_error 的看法也很有趣。正如cpplus.com 所说,它用于“内部计算中的范围错误”。它甚至被放在运行时错误组中......
        • ...而返回值太大或太小无法被机器表示,这正是运行时错误。以同样的思维方式,我也可以看到当函数进行逐步计算时使用了这个异常,即使函数域和函数范围都可以,它仍然可以在中间的某个地方超出范围。
        【解决方案5】:

        域错误是指数学域函数的问题。有时只为某些值定义函数。如果您尝试使用不属于其域的参数调用此类函数,则会出现域错误。

        例如,尝试使用负参数调用 sqrt() 是域错误,因为负数不是 sqrt() 域的一部分。

        【讨论】:

        • 但是当我执行 sqrt(-1) 它返回 nan 并且不会抛出异常。
        【解决方案6】:

        用于“领域”错误类的逻辑错误。这可能适用于函数的输入超出其操作的允许域的任何情况。这是它在标准中声明的目的。

        例如,您有一个只接受正浮点数的函数,因此它会为负数抛出 domain_error。

        【讨论】:

          【解决方案7】:

          它指的是数学领域。

          float MySqrRoot(float x)
          {
              // sqrt is not valid for negative numbers.
              if (x < 0) throw new domain_error;
          
              //...
          }
          

          【讨论】:

            猜你喜欢
            • 2021-10-26
            • 2012-06-08
            • 2015-03-28
            • 2017-01-26
            • 2014-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多