2011-02-13 17 views
5

Bugün bir hatayı izleyen yaklaşık 2 saat harcadım ve NaN'i bir şamandıra ile karşılaştırırken java'nın bir istisna attığını daha hızlı buldum. Kendimi bundan sonra koruyabilirsem hoş olurdu. Herhangi bir yardım takdir edilir.Java'nın NaN olması gerektiğinde floatlar arasında bir karşılaştırma yaparken bir istisna atmasını sağlayabilir miyim?

+1

Eğer bir sinyalizasyonu NaN (snan) ihtiyaç gibi geliyor, ama bu mümkün değil şüpheli. – Gabe

+0

Gerçekten, [Java sinyal karşılaştırmalarını desteklemiyor] (http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#35254). –

cevap

5

JVM instruction set reference özellikle kayan nokta matematiğini atanan özel durumlardan bayt kodlarına izin vermez ve NaN bir işlenen olduğunda bunların nasıl çalışması gerektiğini katı bir şekilde belirtir. Bunu yapmanın bir yolu varsa, ya NaN'ye özel durumlar eklemeniz ya da bu denetimleri sizin için eklemek için özel bir derleyici kullanmanız gerekir.

float f = check(myOtherFloat/yetAnotherFloat); 

Bu da hesaplama yapar: Bu yöndeki kod yazabilir, Bununla

public static float check(float value) { 
    if (Float.isNaN(value)) 
     throw new ArithmeticException("NaN"); 
    return value; 
} 

: yararlı olabilir

Seçeneklerden biri böyle bir işlevi yazmak olacaktır ve bir hatayı atmak. İdeal olarak kısa bir işlev adıyla çok rahatsızlık vermez.

W

2

Kayan nokta veya çifte koruma, sonucu NaN veya false yapmaktır. NaN'yi tespit etmek istiyorsanız, ilk etapta değeri 0 0 0'dan daha iyi engelleyebilirsiniz. Bir bölümleme yaptığınızda, böleni bir 0 olarak kontrol edin ve eğer bir istisna atayın. Bunu basitleştirmek için bir yardımcı yöntemle sarabilirsiniz.

public static double div(double a, double b) { 
    if(b == 0) throw new IllegalArguementException(); 
    return a/b; 
} 

ben değeri 0 olabilir ya da daha sadece, sık sık

double d = a/(b + 1e-9); 

Bu NaN> = 0. Eğer sağlandı b üreten asla böyle bir önyargı eklemek biliyorsanız bir == 0, d = = 0. Kullanılacak önyargı duruma göre değişir.

+0

Bu fikri beğeniyorum, ama sonsuzluğun sıfır ile çarpılması ne olacak? Çarpma sırasında aynı şeyi yapar mısın? – templatetypedef

+1

İyi nokta. Belki sonsuzluğa sahip olursun. –