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?
cevap
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
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.
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
İyi nokta. Belki sonsuzluğa sahip olursun. –
Eğer bir sinyalizasyonu NaN (snan) ihtiyaç gibi geliyor, ama bu mümkün değil şüpheli. – Gabe
Gerçekten, [Java sinyal karşılaştırmalarını desteklemiyor] (http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#35254). –