SORU
31 Temmuz 2014, PERŞEMBE


Olan NaNs bit desenleri gerçekten donanım bağımlı?

Java Dili Belirtimi (sıkıyorum) değerleri NaN-kayan nokta hakkında bir kitap okuyordum. Bir 32-bit float Bu bit biçimi vardır:

seee eeee emmm mmmm mmmm mmmm mmmm mmmm

s işaret biti, e üs bit ve m mantis bit. NaN değeri, tüm 1'lerin bir üs olarak kodlanır ve mantis bitlerin hepsi 0 /- sonsuz olacaktı). Bu farklı Olası NaN çok fazla değer (s m bit değerleri farklı olan) var demektir.

Bu diyor ki:

IEEE 754 tek ve kayan nokta çift biçimlerinin her biri için çok farklı NaN değerlere izin verir. Her donanım mimarisi yeni bir NaN oluşturulduğunda NaN için belirli bir bit deseni döndürür iken, bir programcı da farklı bit desenleri ile NaNs, örneğin, retrospektif tanı bilgileri kodlamak için oluşturabilirsiniz.

Metin İDEA gibi görünüyor ima sonucu, örneğin, 0.0/0.0 bir donanım bağımlı bit desen, ve olmasına bağlı olarak ifade edildi hesaplanmış gibi bir derleme zamanı sabiti, donanım bağımlı olabilir donanım Java program derlenmiş veya donanım programı çalıştırıldı. Bu gibi görünüyorçokeğer doğruysa lapa lapa.

Aşağıdaki testi yaptım:

System.out.println(Integer.toHexString(Float.floatToRawIntBits(0.0f/0.0f)));
System.out.println(Integer.toHexString(Float.floatToRawIntBits(Float.NaN)));
System.out.println(Long.toHexString(Double.doubleToRawLongBits(0.0d/0.0d)));
System.out.println(Long.toHexString(Double.doubleToRawLongBits(Double.NaN)));

Benim makinede çıktı

7fc00000
7fc00000
7ff8000000000000
7ff8000000000000

Çıkış üs bit beklendiği gibi 1 olduğunu gösterir. Mantis üst bit de NaNs için görünüşe göre bir gösteren 1, 'sessiz NaN bir karşıt olarak' 'sinyalizasyon NaN (https://en.wikipedia.org/wiki/NaN#Floating_point)'. Biti ve mantis bit geri kalanı 0. Bu çıktı aynı zamanda NaNs benim makinede üretilen Yüzer ve Çift kişilik sınıflardan sürekli NaNs arasında fark olmadığını gösterir.

Benim sorum, bu çıkış Java garantilidir, derleyici veya VM CPU ne olursa olsun, yoksa hepsi gerçekten tahmin edilemez? Bu İDEA bu konuda gizemli.

Eğer bu çıkış 0.0/0.0, orada başka olan NaNs üreten herhangi bir aritmetik yolları (muhtemelen donanım bağımlı?) için garantili ise desenler bit? (15*/longBitsToDouble *Diğer NaNs kasten kodlamak için kullanabileceğimi biliyorum, ama eğer diğer değerler normal aritmetik oluşabilir bilmek isterim.)


Bir takip soru: fark ettim ki Float.NaN Double.NaN belirtin onların tam bit desen, ama kaynak (Float, Double) tarafından oluşturulan 0.0/0.0. Eğer sonuç gerçekten derleyici donanım bağımlı ise, spec yanlış, doğru, ve aslında bu bir garanti veremez mi?

CEVAP
31 Temmuz 2014, PERŞEMBE


Bu §2.3.2 of the JVM 7 spec bu konuda ne diyor:

Çift değer kümesinin elemanları tam olarak temsil edilebilir değerlerdir kayan noktalı çift biçimini kullanarak IEEE 754 standardı dışında tanımlanan tek NaN 754 değerini belirtir 2 . (IEEE olduğunu ^sup>53-2) NaN değerleri farklı.

ve 26**:

Java Sanal Makinesi hiçbir sinyal NaN değeri vardır.

Yani teknik olarak sadece bir NaN. Ama §4.2.3 of the JLS de söylüyor (sağda alıntı sonra):

Çoğunlukla, Java SE platformu davranır NaN değerlerin belirli bir türü sanki içine çökmüş bir tek kurallı değeri, ve dolayısıyla bu şartname normalde başvurulan bir keyfi NaN sanki bir standart değer.

Ancak, Java SE platformunun 1.3 yöntemleri NaN değerler arasında ayrım yapmak için programcı sağlayan tanıttı: Kaydır.floatToRawİntBits ve Çift.doubleToRawLongBits yöntemleri. İlgilenen okuyucu daha fazla bilgi için Yüzer ve Çift kişilik sınıflar için özellikleri denir.

Ben ve sen tam olarak CandiedOrange teklif ne demek: temel işlemci bağımlı, ama Java hepsi aynı şekilde davranır.

Ama daha iyi olur: Görünüşe göre, NaN değerleri sessizce Double.longBitsToDouble(): açıklandığı gibi farklı NaNs, dönüştürülür bu tamamen mümkündür

Bu yöntem uzun argüman olarak tam olarak aynı bit deseni ile çift NaN dönmek mümkün olmayabilir unutmayın. NaNs iki tür, sessiz ve sinyal NaNs NaNs arasında IEEE 754 ayırt eder. NaN iki tür arasındaki farklılıklar genellikle Java görülmez. Sinyal NaNs üzerinde aritmetik işlemler farklı, ama genellikle benzer, bir bit deseni ile sessiz NaNs dönüşür. Ancak bazı işlemcilerde sadece bir sinyal NaN kopyalama da bu dönüşüm gerçekleştirir. Özellikle, arama yöntemi döndürmek için bir sinyal NaN kopyalama bu dönüşümü gerçekleştirebilir. LongBitsToDouble sinyal NaN bir bit deseni ile bir çift dönüş mümkün olmayabilir. Sonuç olarak, bazı uzun değerler için, doubleToRawLongBits(longBitsToDouble(başlangıç)) başlangıç eşit olmayabilir. Ayrıca, sinyal NaNs temsil eden platform bağımlı; NaN bit desenleri, sessiz ya da sinyal, NaN aralığı, yukarıda tanımlanmış olmalıdır rağmen.

Başvuru için donanım bağımlı NaNs here bir tablo var. Özet olarak:

- x86:     
   quiet:      Sign=0  Exp=0x7ff  Frac=0x80000
   signalling: Sign=0  Exp=0x7ff  Frac=0x40000
- PA-RISC:               
   quiet:      Sign=0  Exp=0x7ff  Frac=0x40000
   signalling: Sign=0  Exp=0x7ff  Frac=0x80000
- Power:
   quiet:      Sign=0  Exp=0x7ff  Frac=0x80000
   signalling: Sign=0  Exp=0x7ff  Frac=0x5555555500055555
- Alpha:
   quiet:      Sign=0  Exp=0      Frac=0xfff8000000000000
   signalling: Sign=1  Exp=0x2aa  Frac=0x7ff5555500055555

Yani, bunu doğrulamak için gerçekten bu işlemcilerin biri lazım ve denemek giderdim. Ayrıca Güç ve Alfa mimarileri için uzun değerlerinin nasıl yorumlanacağı üzerinde herhangi bir anlayış bekliyoruz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • LiteralMSPaint

    LiteralMSPai

    27 EKİM 2010
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011