【问题标题】:Typecasting int to float turns DivideByZeroException into Infinity将 int 类型转换为 float 会将 DivideByZeroException 转换为 Infinity
【发布时间】:2011-10-17 13:19:04
【问题描述】:

我用 C# 写了一个简单的divide 函数:

    private string divide(int a, int b)
    {
        return string.Format("Result: {0}", a / b);
    }

如您所料,调用MessageBox.Show(divide(3, 0)) 会得到DivideByZeroException。

所以我决定将a 类型转换为浮点数(以获得非整数返回值),如下所示:

    private string divide(int a, int b)
    {
        return string.Format("Result: {0}", (float)a / b);
    }

奇怪的是,现在这显示了结果:无穷大。

这对我来说似乎是一个错误,尽管我可能弄错了。是不是因为结果现在是一个浮点数,并且本质上被视为3 / 1 x 10^-99999 或类似的返回值?

我对这个结果感到非常惊讶。

【问题讨论】:

标签: c# floating-point-precision divide-by-zero


【解决方案1】:

这是将int 转换为float 时的行为。这取自MSDN 文档:

将浮点值除以零将导致正数 无穷大、负无穷大或非数 (NaN) IEEE 754 算术规则。浮点运算从不抛出 例外。有关详细信息,请参阅Single 和 Double。

【讨论】:

    【解决方案2】:

    来自算术溢出部分下的MSDN:

    浮点算术溢出或除以零永远不会抛出 例外,因为浮点类型基于 IEEE 754 等 有表示无穷大和 NaN(非数字)的规定。

    【讨论】:

      【解决方案3】:

      不,对于浮点运算是正确的。

      几乎所有现代浮点单元都支持的 IEEE 浮点标准指定每个浮点算术运算,包括除以零,都具有明确定义的结果。该标准支持有符号零,以及无穷大和 NaN(不是数字)。有两个零,+0(正零)和-0(负零),这消除了除法时的任何歧义。在 IEEE 754 算术中,当 a 为正时,a ÷ +0 为正无穷,当 a 为负时为负无穷,当 a = ±0 时为 NaN。除以 -0 时,无穷大符号会发生变化。

      Reference

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多