Alterações finais de valor duplo NaN não canônicas durante o tempo de execução

Estou escrevendo um código Java que interage com R, onde os valores "NA" são diferenciados dos valores NaN. NA indica que um valor está "estatisticamente ausente", ou seja, não foi coletado ou não está disponível.

class DoubleVector {
     public static final double NA = Double.longBitsToDouble(0x7ff0000000001954L);

     public static boolean isNA(double input) {
         return Double.doubleToRawLongBits(input) == Double.doubleToRawLongBits(NA);
     }

     /// ... 
}

O teste de unidade a seguir demonstra a relação entre NaN e NA e funciona bem em meu laptop Windows, mas "isNA (NA) # 2" falha às vezes em minha estação de trabalho 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));
}

De depuração, parece que DoubleVector.NA foi alterado para o valor NaN canônico 7ff8000000000000L, mas é difícil dizer porque imprimi-lo em stdout fornece valores diferentes do depurador.

Além disso, o teste só falha se for executado após uma série de outros testes anteriores. ; se eu executar este teste sozinho, ele sempre passa.

Este é um bug da JVM? Um efeito colateral da otimização?

Os testes sempre passam em:

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)

Os testes às vezes falham em:

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)
5
задан Qantas 94 Heavy 17 September 2014 в 11:44
поделиться