【问题标题】:Java maths - testing for NaNJava 数学 - 测试 NaN
【发布时间】:2011-01-09 13:49:23
【问题描述】:

对于导致分配NaN 的任何代码,我希望有某种项目范围的快速失败机制(可能是RuntimeException)。

在我的项目中,NaN 永远不是有效值。

我意识到我可以在整个过程中添加断言(使用isNaN)或其他测试,但我想知道是否有更优雅的方法。

【问题讨论】:

  • 你到底打算做什么?
  • 想要做的是确切地知道复杂的数值计算出错的地方,而不是在代码中分散isNaN测试。在许多其他环境中我可以使用IEEE 754 traps,但not on the JVM

标签: java math nan


【解决方案1】:

是的,只要将值设置为 NaN,您就可以使用 AspectJ(面向方面​​的编程)引发错误。

本质上,您希望在设置值时进行拦截,并执行一些其他功能。

我们已经在我们的代码库中做了类似的事情......但除此之外我无法为您提供太多帮助。

【讨论】:

    【解决方案2】:

    否 - 因为NaN 是一个有效值,使用它不会引发任何异常。如果没有任何普遍存在的监控机制可供使用,您将不得不在可能被分配或从方法返回的点上进行显式测试。

    【讨论】:

      【解决方案3】:

      如果您准备牺牲应用程序的性能,您可以为 Double(或您想使用的其他数字对象)创建一个包装器,并在设置 NaN 时抛出异常。

      【讨论】:

        【解决方案4】:

        从技术上讲,可以通过instrumenting 相关代码创建代理来自动注入 assertif 测试。这将涉及一些字节码检查和转换(例如,使用 ASM)。在我看来,需要特殊情况才能保证这一点。您必须注意不要检测任何依赖于能够在内部处理 NaN 的类。

        我不知道有人写过这样的代理。如果您正在寻找灵丹妙药,我认为没有。

        【讨论】:

          【解决方案5】:

          只是另一种方法 - 您可以将 PMD 之类的代码检查器集成到您的构建过程中,并创建一个规则来报告 Double.NaN 的每个分配。

          它不会是完美的,因为它无法捕获您从外部(数据库、连接)或某人通过位操作创建的 NaN,但至少您可以确保不能将 Double.NaN 分配给变量或用作方法参数或在评估中使用。

          定义规则可能具有挑战性 - 但至少 - 这是另一种方法。最简单的规则可能是完全禁止Double.NaN

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-16
            • 2013-10-15
            • 2013-03-05
            • 1970-01-01
            • 2019-08-24
            • 2012-07-06
            • 2021-02-13
            • 2011-02-13
            相关资源
            最近更新 更多