【问题标题】:Why getting Double.isNan() value as False in below scenario? [duplicate]为什么在以下场景中将 Double.isNan() 值设为 False? [复制]
【发布时间】:2017-12-08 14:31:19
【问题描述】:

谁能解释为什么标志值返回 False?

double a = 1.0;
double b = 0.0;
double c = a / b;
boolean flag = Double.isNaN(c);
System.out.println(flag); // False?
System.out.println(c); // Infinity

【问题讨论】:

标签: java


【解决方案1】:

这是由于 IEEE 754 标准中对浮点表示的定义。该标准具有“无穷大”和“NaN”的表示形式。 “Infinity”适用于产生无限结果(例如 1/0 或 tan(pi/2) [*])或产生绝对值大于格式可以表示的最大可能数的结果的操作。更准确地说,在数学中,真的不存在无限的结果。相反,它是根据限制来定义的。因此,1/0 不存在,但当 x 接近 0 时 1/x 的极限是无限的。

为“不确定的形式”返回 NaN。在数学中,这些情况是例如 0/0,当仅通过查看分子和分母无法确定极限时。 (如果你有两个函数 f(x) 和 g(x),其中某个点 f(a)=g(a)=0 的值都为 0,那么你无法确定 f(x)/ g(x) 当 x 接近 a 时,不需要像 L'Hopital 规则这样的额外工作。)对于取负数的平方根等事情也会返回 NaN。

在 Java 中,isNan 仅对实际的 NaN 值返回 true,而不是无穷大。尽管无穷大确实“不是数字”,但它不符合 IEEE 标准对 NaN 的定义。

请参阅here 了解哪些操作生成 NaN 的定义。

[*] 请注意,“pi”不能精确地表示为浮点数,因此这确实不是一个可以在计算机上产生“无限结果”的操作。

【讨论】:

    【解决方案2】:

    这就是 IEEE-754 标准所说的。当你将一个非零浮点数除以零时,它返回的不是数字,而是infinity

    看看这个:http://grouper.ieee.org/groups/754/faq.html#exceptions

    【讨论】:

    • “当您将浮点数除以零时”应该是“当您将非零浮点数除以零时”。 0/0 将返回一个 NaN。
    • 你是绝对正确的。已编辑。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2021-10-08
    • 2015-01-31
    • 2015-05-09
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多