【问题标题】:How to represent NaN in array of numbers?如何在数字数组中表示 NaN?
【发布时间】:2011-06-22 11:48:46
【问题描述】:

问题说明了一切。我有一系列双打,正在用它们做点什么。

double expectedOutput[] = { 6.38792, 12.91079, 14.33333, 13.44517,
                12.34539, 12.05397, 8.34061, 2.07900, -2.01999, -5.47802,
                -8.21610, -9.26719, -11.02378 };

理想情况下,我会测试看看是否

6.38792 == 6.38792 并最终获得“通过”

在某些情况下,我最终会遇到这样的情况

6.38792 != NaN

知道有时这是一个有效的情况,我如何在我的代码中表示 NaN?

我要么需要将NaNs 包含到我的预期元素数组中,要么以某种方式找出结果不是数字

我正在使用 Java

【问题讨论】:

  • Java。我会更新问题
  • Double.NaN?测试 NaN x==x(确保它不是 NaN)、Double.isNaN() 等等

标签: java nan


【解决方案1】:

这是Double 对象实际上比原始doubles 更有用的情况。

// auto-boxes them all to Double objects
Collection<Double> expectedOutput =
    Arrays.asList(6.38792, 12.91079, 14.33333, 13.44517, 12.34539,
                  12.05397, 8.34061, 2.07900, -2.01999, -5.47802,
                  -8.21610, -9.26719, -11.02378, Double.NaN );
// maybe fill into HashSet for more efficient lookup?

// later:
double d = Double.NaN;
if(expectedOutput.contains(d)) {
    System.out.println("found");
}

原因是Double.equals实际上实现了equals合约的反身条件,即Double.valueOf(Double.NaN).equals(Double.valueOf(Double.NaN))给出true,与Double.NaN != Double.NaN相反。

【讨论】:

    【解决方案2】:
    double d = 0.0/0.0;
    if(Double.isNan(d)){
        // Double d is not a number.
    }
    

    或者:

    double d = Double.Nan;
    if(Double.isNan(d)){
        // Double d is not a number.
    }
    

    【讨论】:

    • -1 NaN 永远不会等于 NaN(或任何其他数字)。
    • 已修复。 “失败”是不必要的。
    • 取消了反对票,因为您修正了答案,但仍然没有 cookie 适合您。 :-D
    • 嘿,不,你没有。其他人确实支持了,所以感谢那个人。
    • @TheBigO:实际上,我确实撤消了反对票。 (但我没有对你投赞成票。最初有两个用户对你投了反对票;我撤回了其中一个。) OTOH,我只是注意到有人决定连续对我的帖子投反对票。如果是您,请注意这可能会导致您的所有投票被取消:blog.stackoverflow.com/2008/12/vote-fraud-and-you
    【解决方案3】:

    由于在许多语言中 NaN 不等于自身(在 Java 中也是如此),因此您应该将其作为特定情况处理。使用 Float.NaN 或 Double.NaN 来引用 NaN。使用 Float.isNaN 或 Double.isNaN 检查特定值是否为 NaN。

    【讨论】:

    • “多种语言”应该是“所有符合 IEEE-754 的语言”:)
    • 我仍在寻找“IEEE 快速参考引文书”,以便在社交晚会中使用它;) - 无论如何感谢您的参考
    【解决方案4】:

    在Java中,你可以通过使用获得NaN

    Double.NaN
    

    所以你可以把它放到你的数组中。

    如果您的问题是如何检查某事物是否为 NaN,您可以致电

    Double.isNan(/* ... value ... */);
    

    【讨论】:

      【解决方案5】:

      你必须明确地测试它,因为NaN != NaN,你不能只将它包含在你的数组中。你必须使用Double.isNaN(x)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        • 2018-10-19
        • 2014-08-17
        • 2018-12-02
        相关资源
        最近更新 更多