Я пишу код Java, который взаимодействует с R, где значения «NA» отличаются от значений NaN. 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, но «isNA (NA) # 2» завершается ошибкой иногда на моей рабочей станции Ubuntu.
@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, но трудно сказать, потому что его печать на стандартный вывод дает значения, отличные от отладчика.
Кроме того, тест не пройден, только если он выполняется после ряда других предыдущих тестов; если я запускаю этот тест в одиночку, он всегда проходит.
Это ошибка 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)