「NA」値が NaN 値と区別される R と対話する Java コードを作成しています。NA は、値が「統計的に欠落している」ことを示します。つまり、値を収集できなかったか、利用できないことを意味します。
class DoubleVector {
public static final double NA = Double.longBitsToDouble(0x7ff0000000001954L);
public static boolean isNA(double input) {
return Double.doubleToRawLongBits(input) == Double.doubleToRawLongBits(NA);
}
/// ...
}
次の単体テストは、NaN と NA の関係を示しており、私の Windows ラップトップでは正常に動作しますが、ubuntu ワークステーションでは「isNA(NA) #2」が失敗することがあります。
@Test
public void test() {
assertFalse("isNA(NaN) #1", DoubleVector.isNA(DoubleVector.NaN));
assertTrue("isNaN(NaN)", Double.isNaN(DoubleVector.NaN));
assertTrue("isNaN(NA)", Double.isNaN(DoubleVector.NA));
assertTrue("isNA(NA) #2", DoubleVector.isNA(DoubleVector.NA));
assertFalse("isNA(NaN)", DoubleVector.isNA(DoubleVector.NaN));
}
デバッグから、DoubleVector.NA が正規の NaN 値 7ff8000000000000L に変更されているように見えますが、stdout に出力するとデバッガとは異なる値が返されるため、見分けるのは困難です。
また、テストは、他の多くの以前のテストの後に実行された場合にのみ失敗します。このテストを単独で実行すると、常にパスします。
これは JVM のバグですか? 最適化の副作用?
テストは常に次のように渡されます。
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)
テストは時々失敗します:
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)