【问题标题】:Dividing a double number with a double of 0 gives the limit of the expression and not error将一个双精度数除以一个 0 的双精度数给出了表达式的限制,而不是错误
【发布时间】:2017-01-27 17:32:44
【问题描述】:

有人问我这段代码的结果:

#include <stdio.h>
int main()

{

    double a =0;

    double b =2/ a;

    printf("b=%f\n", b);

    printf("SLABC\n");

    return 0;

} 

运行它,代码打印出b=infSLABC,然后正确存在。

我不明白为什么除以 2/0 不会产生错误(如果是 int a=0,我会得到适当的运行时错误),我唯一的假设是在 double 类型中,a=0实际上并不意味着 a 是 0,而是 a 非常接近 0(显然,a>0 而不是负数,或者应该是-inf)。

即使a=0.0a=0.00000000 我得到相同的结果。对我来说感觉就像计算机已经决定计算这个表达式的极限(微积分风格),但我想有一个更明智的解释。另外,我不清楚为什么它只有积极的,而不是消极的。

【问题讨论】:

  • 您可以检查除零标志。
  • 它指的是floating point和doubles的架构,如果你使用int而不是double你会看到错误
  • 可能dupe?
  • float/double 值 0.0 表示该值太小,无法在此架构上表示(但实际上可能不为零!)。因此结果是如此之大,它既不能在这个架构上表示,也不能在这个架构上表示 +/-INF。 (聪明,现在我想到了这个。)
  • c++ division by 0的可能重复

标签: c math double


【解决方案1】:

您看到的是正确的浮点除法。

值无穷大和负无穷大是有效的浮点值,以及“非数字”。

当除数为 0 进行浮点除法时,结果将与被除数匹配的符号为无穷大。

如果您要计算0.0/0.0inf/inf,结果将是NaN,即不是数字。

【讨论】:

  • 是否总是如此,或者它可能会在某些拱门上引发异常?
【解决方案2】:

C 明确将此标识为未定义行为 (UB)。

/ 运算符的结果是商...如果第二个操作数的值为零,则行为未定义。 C11dr §6.5.5 5

C 没有定义代码应该出错。

用一个与有限操作数的符号异或的符号来分配一个无穷大的“值”是一种常见的结果。

这符合IEEE 754 行为“divideByZero 的默认结果应为根据操作正确签名的 ∞:”C 不需要遵守 IEEE 754,尽管许多平台都在努力。

【讨论】:

    【解决方案3】:

    floatsdoubles 中,允许除以零,结果为 +-INF+-NAN

    【讨论】:

    • 返回+-NAN。
    猜你喜欢
    • 2020-06-02
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    相关资源
    最近更新 更多