【问题标题】:double d=1/0.0 vs double d=1/0双 d=1/0.0 与双 d=1/0
【发布时间】:2011-11-14 10:55:36
【问题描述】:
double d=1/0.0;
    System.out.println(d);

它打印 Infinity ,但是如果我们写 double d=1/0; 并打印它,我们会得到这个异常:Exception in thread "main" java.lang.ArithmeticException: / by zero at D.main(D.java:3) 为什么 Java 知道在一种情况下,从零开始跳水是无穷大,但对于 int 0 它是没有定义的? 在这两种情况下,d 都是双倍的,并且在这两种情况下,结果都是无穷大。

【问题讨论】:

    标签: java double infinity


    【解决方案1】:

    严格来说,1.0/0.0 根本不是无穷大,它是未定义的。

    正如大卫在他的回答中所说,浮点数有一种表示数字的方式,该数字不在它可以表示的最高数字和最低数字的范围内。这些值统称为“非数字”或仅称为 NaN。 NaN 也可能发生在真正无限的计算中(例如 lim<sub>x -&gt; 0</sub> ln<sup>2</sup> x),有限但溢出浮点数可以表示的范围的值(例如 10100100),以及未定义的值,例如 1/0。

    浮点数不能很清楚地区分未定义值、溢出和无穷大;该计算产生的位组合取决于。由于对于不知道浮点值如何表示的人来说,仅打印“NaN”或“Not a Number”有点难以理解,因此该格式化程序仅打印“Infinity”或有时“-Infinity”,因为它提供相同的当您知道 FP NaN 的全部内容时的信息级别,并且在您不知道时具有一定的意义。

    整数与浮点 NaN 没有任何可比性。由于在执行 1/0 时整数没有合理的值,因此剩下的唯一选择是引发异常。

    用机器语言编写的相同代码既可以调用中断(类似于 Java 异常),也可以设置一个条件寄存器,它是一个全局值,表示最后一次计算是除以零。其中哪些可用因平台而异。

    【讨论】:

    • 在 Java 中,1.0/0.0 被定义为等于 Infinity。我不同意浮点单位不区分 Infinity 和 NaN。 Sqrt(-1.0) 是 NaN,但溢出会导致无穷大。您是否断言格式化程序会为 NaN 打印输出 Infinity?
    • 嗯.. 我承认我不太了解 java。如果你说的是真的,那1.0/0.0就是无穷大,那我不得不说java是了。
    • 我感觉 1.0/0.0=Infinity 是 IEEE754 的一部分,但是为什么说它是错误的呢?
    【解决方案2】:

    浮点数据类型有一个保留的特殊值来表示无穷大,整数值没有。

    在您的代码中,1/0 是一个整数除法,当然会失败。但是,1/0.0 是浮点除法,因此结果为 Infinity

    【讨论】:

    • 将隐式强制转换设为显式后,double d=1/0double d=(double) (1/0) 相同,而 double d=1/0.0double d=((double) 1)/0.0d 相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多