2010-01-28 24 views
8

documentation for java.lang.Double.NaN buDiğer NaN değerleri nelerdir?

tip double sabit bir stok Not-a-numarası (NaN) değer olduğunu söyler. Double.longBitsToDouble(0x7ff8000000000000L) tarafından döndürülen değere eşdeğerdir.

Bu başkaları da vardır ima görünüyor. Eğer öyleyse, onları nasıl ele geçirebilirim, ve bu da portably yapılabilir mi?

net olmak gerekirse, ben

Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN) 

ve

Double.isNaN(x) 

ikisi de doğruysa double değerleri x böyle bulmak istiyoruz.

+0

diğer 'java.lang vardır * NaN' kastediyorsun? –

+0

@Dominic: Hayır - Bence soruya bir açıklama getirdiğimi ekledim. –

cevap

8

Sen doubleToRawLongBits yerine doubleToLongBits gerekir.

doubleToRawLongBits gerçek bir ikili gösterimini ayıklar. doubleToLongBits ilk varsayılan NaN tüm NaN s dönüştürür bunu dikkate almaz.

double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN 
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0 

System.out.printf("%X\n", Double.doubleToLongBits(n)); 
System.out.printf("%X\n", Double.doubleToRawLongBits(n)); 
System.out.printf("%X\n", Double.doubleToLongBits(n2)); 
System.out.printf("%X\n", Double.doubleToRawLongBits(n2)); 

çıkışı:..

7FF8000000000000 
7FF8000000000000 
7FF8000000000000 
7FF8000000000100 
+0

'doubleToRawLongBits' ile ilgili ipucu için teşekkürler! –

2

IEEE 754 1 tüm üs biti ve mantis olmayan bir sıfır numarası olan bir sayı olarak NaN tanımlar. şöyle

S  E   M 
x 11111111 xxxxxx....xxx (with M != 0) 

Java kolları bu:

Yani bir tek duyarlıklı sayı için aradığınız

Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN 
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0 

System.out.println(n.isNaN()); // true 
System.out.println(n2.isNaN()); // true 
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true 

Özetle, sen uyan istediğiniz herhangi NaN kullanabilirsiniz Yukarıda belirtilen kurallar (üs ve mantis içinde her bit 1! = 0).

+0

Son ifade hiçbir anlam ifade etmiyor. 'Double.doubleToLongBits (...) 'örtük bir şekilde' double ', otomatik kutuya dönüştürülür ve * reference * ile n2'ye karşılaştırılır. – finnw

+0

Muhtemelen son satırında olmalıdır Double.doubleToLongBits (n2)! = Double.doubleToLongBits (Double.NaN) '? –

+0

Bu 'false' yazdırır, çünkü 'doubleToLongBits' tüm NaN'leri aynı değere dönüştürür. Ama 'doubleToRawLongBits' kullanırsanız doğrudur. – finnw

5

Java onun kayan nokta sayıları için IEEE 754 kullanır ve bu nedenle onların kurallarını takip eder.

Wikipedia page on NaN göre, bu aşağıdaki gibi tanımlanır:

IEEE kayan nokta standart tek hassas bir NaN bit temelinde örnek: x bakım anlamına gelir x111 1111 1axx xxxx xxxx xxxx xxxx xxxx.

Yani NaN değerlerdir hepsi epeyce bit desenleri vardır.

+0

Teşekkürler. VM'ler arasında taşınabilir olması garanti ediliyor mu? –

+1

@simonn: Bu soru bir an beni durduracaktır: Bu gerçeği tam olarak nasıl kullanmak istiyorsunuz? Bant içi bilgileri "çifte" NaN değerine göndermeyi deniyor musunuz? –

+0

Sıralama. NaN gibi davranan birkaç farklı değerin olduğu bir sistemin semantiğini öykünmeye çalışıyorum, fakat bunlar ayırt edilebilir. –