【问题标题】:c++ division by 0c++ 除以 0
【发布时间】:2011-06-12 07:58:14
【问题描述】:

我正在运行长时间的模拟。我将结果记录到向量中以计算有关数据的统计信息。我意识到,理论上,这些样本可能是除以零的结果。这只是理论上的,我很确定事实并非如此。为了避免修改代码后重新运行模拟,我想知道这种情况下会发生什么。我是否能够意识到是否发生了除以 0?我会收到错误消息吗? (目前没有处理异常)。

谢谢

【问题讨论】:

  • 我们在这里说的是什么类型的?浮动?

标签: c++ divide-by-zero


【解决方案1】:

对于 IEEE 浮点数,有限非零浮点数除以 0 是明确定义的,结果是 +infinity(如果值大于零)或 -infinity(如果值小于零)。 0.0/0.0 的结果是 NaN。如果使用整数,则行为未定义。

【讨论】:

  • 明确一点,如果浮点数 0.0 除以整数 0,整数将被转换为浮点数,结果为 NaN,对吗?
  • 是的,结果将是 NAN
【解决方案2】:

请注意,C 标准说 (6.5.5):

/ 运算符的结果是除法的商 第二个操作数的第一个操作数; % 运算符的结果是 余。在这两个操作中,如果第二个操作数的值是 零,行为未定义。

因此,对于整数类型和浮点数,something/0 是未定义的(按标准)。尽管如此,大多数实现都有上述行为(+-INF 或 NAN)。

【讨论】:

  • 值得注意的是,至少在 C 中,如果一个实现声明支持 C standard Annex F(可选),附件 F 会覆盖 6.5.5 的浮点类型并呈现浮点除以零定义.我不认为标准明确说明了这一点,但附件 F 中有几个部分规定了除以零必须或不能如何表现。
【解决方案3】:

如果你说的是整数,那么你的程序应该会在除以零时崩溃。

如果你说的是浮点数,那么除以零是允许的,结果是 INF 或 -INF。现在,程序是否会崩溃、妥善处理或继续出现未定义/意外的结果,这一切都取决于您的代码。

【讨论】:

  • 未定义行为≠崩溃
【解决方案4】:

如果您使用 IEEE 浮点数,那么它将返回 0 或 NaN。如果 op1 为 0,您将得到未定义。如果 op1 大于 0,您将获得 Infinity。如果 op1 小于 0,那么您将得到 -Infinity。如果直接用0除或整数除,会报错“Floating point exception”。

【讨论】:

    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2020-01-08
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多