2012-11-24 15 views
5

büyük bir değer tutan bir dizeden bir çift Ayrıştırma: 1.7976931348623157E308 her şeyin belirtilen değer içinaşağıdaki java kod göz Double.MaxValue

String toParse = "1.7976931348623157E308"; //max value of a double in java   
double parsed = Double.parseDouble(toParse); 
System.out.println(parsed); 

mantıklı ve bir doğru çıkış alır.

Şimdi, eğer biri 1.7976931348623158E308'u ayrıştırmaya çalışırsa (E artmadan önceki son rakam) yine de konsola yazdırılan maksimum değeri elde edersiniz!
Yalnızca 1.7976931348623159E308 ayrıştırmaya çalıştıktan sonra (yine son rakam artırıldı) ve daha büyük olan Infinity alır.
İlgili olumsuz değerler için aynı davranış.

Neden ... 8E308... 7E308 ve Infinity değil ayrıştırıldı?

+1

Bu, herhangi bir uygulama için geçerli midir? – AlexWien

+1

Sanırım kenar kasalarıyla eğleniyorsunuz. Kaynak koduna baktın mı? –

+0

@AlexWien bunu "kaza" ile tökezledi, şimdi merak ediyorum –

cevap

9

parseDouble belgelerin SE 7 sürümünde ifade valueOf belgelerine gelir: aynı zamanda taşma davranışı yuvarlak en yakına kural eder

Not olduğu; Eğer s'nin tam değeri yeterince büyükse (MAX_VALUE + ulp (MAX_VALUE)/2) büyükse veya eşitse, yuvarlama ikiye katlanır ve s'nin kesin değeri yeterince küçükse (daha azsa) veya daha sıfır neden olur yüzer yuvarlama,)/2 MIN_VALUE eşit.

Bu yuvarlama isimli yüzen IEEE 754 olağan yuvarlak to-yakın kuralla çift yazmanız o açıklaması ile uyumludur aritmetik noktası

Dönüştürme işlemi, önce en yakın kayan nokta sayısını, üst sınırın yok sayılmasıyla hesaplayarak ve sonra üssün uyup uymadığını kontrol etmelisiniz. Double.MAX_VALUE, bu kurala göre bazı numaralara en yakın sayıdır. o kesinlikle ondan daha büyüktür.

public class Test { 
     public static void main(String[] args) { 
     double ulp = Math.ulp(Double.MAX_VALUE); 
     System.out.println(ulp); 
     System.out.println(Double.MAX_VALUE); 
     System.out.println(Double.MAX_VALUE+ulp/2.0000000001); 
     System.out.println(Double.MAX_VALUE+ulp/2); 
     } 
    } 

O çıkarır:

1.9958403095347198E292 
1.7976931348623157E308 
1.7976931348623157E308 
Infinity 

Double.MAX_VALUE yarım ulp değişmezse bile biraz daha az şey ekleme

düşünün bunun normal yuvarlama davranıştır şu programı doğrulamak için o. Sonsuzluğa yarım ulp taşması ekleniyor.

+0

+1, başımın etrafına sarılı olan kısım buydu! teşekkürler, patricia –