2016-10-28 54 views
7

Java'nın kayan nokta aritmetiğini uygulamak için IEEE 754 standardını kullanmasıyla ilgilenirim. Here Ben belgelerinde bu tür şeyleri gördük: Ben IEEE 754 olumlu tarafı noktası Arithmetics yüzen kesinliğini arttırmaktır anlamak gibi IEEE 754-2008Java kayan nokta ilkelleri için herhangi bir IEEE 754 standart uygulaması var mı?

tanımlanan

operasyon yüzden olacak eğer Java'da double veya float kullanın, hesaplamalar BigDecimal ile aynı mıdır? Ve değilse, Math sınıfında IEEE 754 standardını kullanmanın amacı nedir?

cevap

8

Java'nın kayan nokta aritmetiğini uygulamak için IEEE 754 standardını kullanmasıyla ilgilenirim.

IEEE-754 birden kayan nokta türleri için standartlar belirler. Uzun yıllar boyunca hepsi ikili kayan nokta idi; Bu, Java'nın float ve double'dur: float, 32 bit IEEE-754 ikili kayan nokta değeridir (standart aramalar binary32). double, 64 bittir (standart olarak binary64 numaralı telefonu arar). Bu ikili kayan nokta sayıları bilgisayarların hesaplanması için çok verimlidir, ancak ikili olarak çalıştıkları ve ondalık olarak çalıştığımız için, bazı beklenti uyumsuzlukları vardır; Örneğin, 0.1, double numaralı belgede tam olarak saklanamaz ve 0.30000000000000004 olmak üzere 0.1 + 0.2 gibi gariplikler alırsınız. Detaylar için bkz. Is floating point math broken?. Örneğin, finansal hesaplamalar için iyi bir seçim değildir.

BigDecimalondalık kayan nokta uygulayan bir Java sınıfıdır. double'u kullanmaktan çok daha yavaştır, ancak sonuçlar ondalık düşüncemiz beklentilerimize uygundur (örneğin, 0.1 + 0.20.3 olacaktır).

IEEE-754 2008 baskı özellikle decimal32, decimal64 ve decimal128 yılında, önemli yeni biçimleri ekler. Bunlar ondalık kayan noktalardır ve bu nedenle yaptığımız gibi çalışırlar. 0.1, decimal64 numaralı telefondan doğru bir şekilde saklanabilir. 0.1 + 0.2, decimal64 numaralı telefondan 0.3'dir. Ancak, anlayabildiğim kadarıyla, sorunuzla gerçekten alakalı değiller.

BigDecimal, IEEE-754 2008'den beri (bazı kenar boşluklarıyla), kendi anlamlarını tanımlar.

Ve değilse Matematik sınıfında IEEE 754 standardını kullanarak ne anlamı var daha

? ,

JDK9 IEEE-754 2008 spec (a fused multiply-add yapar gibi fma) tarafından tanımlanan şeyler Math yeni işlemleri ekler ve bu yüzden, IEEE-754 2008 spec referansla bu işlemleri tanımlamaktadır açıklık için.

Daha okuma:

+0

nitpick: ikili kayan noktalı tiplerine ek olarak, ondalık kayan tanımlar, IEEE 754-2008, yaklaşık asker sorgulamalarla tam olarak '0.1' gösterme yeteneğine sahip ondalık64 ve ondalık128 nokta türleri. – njuffa

+0

@njuffa: İyi nokta, bu sorunun alıntılanan bitini özledim. Ve kör bağlantılar 2008 standardından bahseden JDK9 özellikleriyle ilgili. Bu tamamen cevabı değiştirir. –

+0

@njuffa: Düzeltildi ve işaret ettiğin için tekrar teşekkürler. –

İlgili konular