2010-02-17 12 views
12

0.0 को विभाजित करने या ऋणात्मक डबल से रूट निकालने पर अंकगणितीय अपवाद फेंकने के लिए जावा को कैसे मजबूर किया जाए? कोड इस प्रकार है:अंकगणित अपवाद फेंकने के लिए जावा को कैसे मजबूर करें?

double a = 1; // or a = 0 to test division by 0 
    double b = 2; 
    double c = 100; 

    double d = b*b - 4*a*c; 
    double x1 = (-b - Math.sqrt(d))/2/a; 
    double x2 = (-b + Math.sqrt(d))/2/a; 
+0

क्या चौकोर सूत्र 2 * ए और 2/ए द्वारा विभाजित नहीं किया जाना चाहिए? – DyingCactus

+0

** ** आप केवल परिणाम की जांच करने के बजाय अपवाद क्यों प्राप्त करना चाहते हैं? या * वास्तविक * समस्या थी जिसे आप नहीं जानते कि परिणाम कैसे जांचें? – BalusC

+1

@DyingCactus: एक्स/2/एक == एक्स/(2 * क) –

उत्तर

12

यह इन कार्यों के लिए जावा फेंक अपवाद बनाने के लिए, क्योंकि जावा IEEE 754 चल बिन्दु गणित, जो जनादेश कि इन आपरेशनों विशिष्ट बिट पैटर्न लौटना चाहिए के लिए मानक लागू करता है संभव नहीं है अर्थ "नहीं संख्या" या "अनंतता" के साथ।

यदि आप इन मामलों का विशेष रूप से इलाज करना चाहते हैं, तो आप Double.POSITIVE_INFINITY जैसे संबंधित स्थिरांक के साथ परिणामों की तुलना कर सकते हैं (NaN के लिए आपको isNAN() विधि का उपयोग करना होगा क्योंकि NaN! = NaN)। ध्यान दें कि आपको प्रत्येक व्यक्तिगत ऑपरेशन के बाद जांच करने की आवश्यकता नहीं है क्योंकि बाद के संचालन NaN या अनंत मूल्य को बनाए रखेंगे। बस अंतिम परिणाम की जांच करें।

+0

सिर्फ एक नोट: 'डबल.NaN! = डबल .NAN' ** सत्य ** है और 'Double.NaN == Double.NaN' ** झूठा ** है, बेहतर उपयोग करें 'Double.isNaN (डबल)' –

+0

@ अवरोध: अच्छा बिंदु –

+4

यह सच नहीं है कि जावा की कमी फ्लोटिंग-पॉइंट अपवादों का * है * यह * आईईईई 754 लागू करता है। जावा वर्चुअल मशीन विशेष रूप से * [differs] (http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html# 35254) * आईईईई 754 से इन शर्तों को जाल या ध्वजांकित करने का कोई तरीका नहीं है। –

0

इस कोड को फेंक देते हैं एक ArithmeticException:

int x = 1/0; 
+0

'println (1d/0 d);' 'प्रिंट Infinity' – sfussenegger

+0

-1 और, कुछ भी – OscarRyz

+2

मेरे बुरा फेंक नहीं है: यह पूर्णांक विभाजन कि अपवाद फेंक दिया। –

2

मुझे लगता है, आप मैन्युअल रूप से जाँच करने के लिए, उदाहरण के लिए होगा

public double void checkValue(double val) throws ArithmeticException { 
    if (Double.isInfinite(val) || Double.isNaN(val)) 
     throw new ArithmeticException("illegal double value: " + val); 
    else 
     return val; 
} 
अपने उदाहरण के लिए

तो

double d = checkValue(b*b - 4*a*c); 
double x1 = checkValue((-b - Math.sqrt(d))/2/a); 
double x2 = checkValue((-b + Math.sqrt(d))/2/a); 
+1

मैं हर बार चेकवैल्यू को कॉल नहीं करना चाहता हूं जब शून्य या अन्य "खराब" ऑपरेशन हो सकता है। मैं अपने कोड को ट्राइक-कैच के साथ घूमना चाहता हूं और एक कोड ब्लॉक में असफलताओं की जांच करना चाहता हूं, जिसमें मुख्य कोड से हाउसकीपिंग सामान (यानी चेकवैल्यू() कॉल) है। – DNNX

+0

@DNNX: "एक स्थान में चेक करें" विधि 'NaN' द्वारा समर्थित है: जब कोई समस्या होती है तो आपकी गणना का अंतिम परिणाम 'NaN' होगा। अंत में बस इसके लिए जांचें। –

+0

@DNNX "आप जो भी चाहते हैं उसे हमेशा प्राप्त नहीं कर सकते हैं/लेकिन यदि आप कभी कोशिश करते हैं, तो आपको मिलेगा/आपको जो चाहिए वह आपको मिलेगा" (जगर/रिचर्ड्स);) – sfussenegger

संबंधित मुद्दे