2009-03-30 10 views
9

मैं शैक्षणिक उद्देश्य के लिए उन जाल के साथ खेलना चाहता हूं।डेवलपर को आईईईई 754 जाल का पर्दाफाश करने वाली कौन सी भाषाएं हैं?

संख्यात्मक गणित में डिफ़ॉल्ट व्यवहार के साथ एक आम समस्या यह है कि हम गलत ऑपरेशन में दिखाई देने वाले नैन (या + -inf) को "याद करते हैं"। डिफ़ॉल्ट व्यवहार गणना के माध्यम से प्रचार है, लेकिन कुछ ऑपरेशन (तुलनात्मक रूप से) श्रृंखला को तोड़ते हैं और नैन को ढीला करते हैं, और शेष उपचार एल्गोरिदम के पिछले चरणों में एकवचन को स्वीकार किए बिना जारी रहता है।

कभी-कभी हमारे पास इस तरह की घटना पर प्रतिक्रिया करने के तरीके होते हैं: एक फ़ंक्शन ("मेरे मामले में 0/0 = 12"), या समय-डोमेन सिमुलेशन में चरण को फेंकना और अन्य सेटिंग्स के साथ प्रयास करना (जैसे भविष्यवाणी, कदम आकार या जो कुछ भी)।

तो मेरा प्रश्न यह है: क्या आप ऐसी भाषाएं जानते हैं जो डेवलपर को आईईईई 754 जाल का पर्दाफाश करते हैं? मैं इसके लिए एएसएम के साथ गड़बड़ महसूस नहीं कर रहा हूँ।

उत्तर

0

सी और शायद सी ++ या पायथन जैसे व्युत्पन्न अधिकांश भाषाएं (हालांकि अप्रत्यक्ष पहुंच हो सकती हैं)। यह अपेक्षा करना उचित है कि निम्न स्तर की भाषाओं में ऐसा समर्थन होगा।

http://www.math.utah.edu/~beebe/software/ieee/#c-notes देखें जिसमें आईईईई 754 नंबरों के साथ काम करने पर कई स्क्रिप्ट और नोट हैं। विशेष रूप से of1.c फ़्लोटिंग पॉइंट अपवादों से संबंधित है। अंत में, स्रोत http://grouper.ieee.org/groups/754/reading.html से जिसमें उपयोगी जानकारी का एक समूह शामिल है।

+0

आप थोड़ा और अधिक विशिष्ट कृपया हो सकता है? मैं दस्तावेज में यह नहीं मिल सका, मैंने पाया झंडे हेरफेर करने के लिए कैसे नहीं, बल्कि एक जाल सेट करने का तरीका: http://www.opengroup.org/onlinepubs/000095399/basedefs/fenv.h.html – nraynaud

+0

अपडेट किया गया लिंक के साथ। –

+0

लिंक के लिए धन्यवाद। (मुझे लगता है कि मैं अच्छी तरह से देखा, लेकिन यह सब पूर्वप्रक्रमक शोर में यह सकारात्मक होना मुश्किल है) सी कार्यक्रम को देखने के बाद, मैं इस तरह के रूप उजागर जाल दिखाई नहीं देता। मैं केवल झंडा हेरफेर देखता हूं। एसआईजी_एफपीई हैंडलर एक मंच के लिए एक विशाल मामला प्रतीत होता है। – nraynaud

3

जहाँ तक मुझे पता है, आप सी और सी में चल बिन्दु अपवाद संचालन के लिए ++ दो विकल्प हैं:

सबसे पहले, यदि आप अक्षम/चल बिन्दु अपवाद (जो अधिकांश वातावरण डिफ़ॉल्ट रूप से करते हैं) मुखौटा, आप देख सकते हैं क्या fetestexcept पर कॉल करके कोई फ़्लोटिंग पॉइंट अपवाद हुआ है। fetestexcept Visual C++ में उपलब्ध नहीं है, लेकिन आप MinGW रनटाइम के कार्यान्वयन को आसानी से पर्याप्त चुरा सकते हैं। (यह सार्वजनिक डोमेन में है।) एक बार अपवाद को ध्वजांकित करने के बाद, यह तब तक साफ़ नहीं किया जाता है जब तक कि आप feclearexcept को कॉल नहीं करते हैं, ताकि आप गणनाओं की एक श्रृंखला के अंत में fetestexcept को कॉल कर सकें ताकि यह देखने के लिए कि उनमें से कोई अपवाद उठाया गया है या नहीं। यह आपको उन जालों को नहीं देता है जिन्हें आपने पूछा था, लेकिन यह आपको परीक्षण करने देता है अगर NaN या +/- inf जैसी समस्याएं हुई हैं और आवश्यकतानुसार प्रतिक्रिया दें।

दूसरा, आप लिनक्स में feenableexcept या विंडोज में _controlfp पर कॉल करके फ़्लोटिंग पॉइंट अपवादों को सक्षम/अनमास्क कर सकते हैं। ऑपरेटिंग सिस्टम प्रोसेसर से उत्पन्न फ्लोटिंग पॉइंट अपवाद को कैसे संभालता है आपके ऑपरेटिंग सिस्टम पर निर्भर करता है।

  • लिनक्स में, ओएस एक SIGFPE संकेत भेजता है, ताकि आप उस को पकड़ने और एक ध्वज है कि अपनी दिनचर्या बताता उचित प्रतिक्रिया करने के लिए सेट के लिए एक संकेत हैंडलर इंस्टॉल कर सकते हैं।
  • Windows में, ओएस का आह्वान संरचित एक्सेप्शन हैंडलिंग एक भाषा अपवाद है कि आप सी में एक __try/__catch ब्लॉक या सी में try/catch ब्लॉक ++ का उपयोग करते हुए पकड़ कर सकते हैं में प्रोसेसर अपवाद कन्वर्ट करने के लिए।
  • अद्यतन: मैक ओएस एक्स के लिए, this answer में वर्णित है, आप सक्षम करने के लिए/xmmintrin.h से _MM_SET_EXCEPTION_MASK का उपयोग करके अपवादों बेनकाब, और जब तक आप डिफ़ॉल्ट संकलक विकल्पों का उपयोग (यानी, अक्षम न करें SSE) सक्षम होना चाहिए , आप SIGFPE का उपयोग कर अपवादों को पकड़ने में सक्षम होना चाहिए।

(यदि आप उत्सुक हैं तो मैंने this blog posting में सी और सी ++ में अन्य फ्लोटिंग पॉइंट मुद्दों पर और कुछ और लिखा है।)

+0

यह एक अच्छी बात है, मैं तो बस इस के साथ खेल रहा था, और के बाद से मैं भाग्यशाली महसूस करते हैं, मैं पर 2 मंच विशेष समस्याओं के साथ एक मैक हूँ: http://www.gnu.org/software/hello/manual/gnulib/ feenableexcept.html http://lists.apple.com/archives/Darwin-dev/2006/Mar/msg00102.html – nraynaud

+0

मेरे द्वारा जोड़े गए लिंक में दी गई जानकारी मेरे सीमित परीक्षण में मेरे लिए काम करती है। –

+0

मैक ओएस एक्स लिंक के लिए धन्यवाद, यह एक बहुत अनियमित हैंडलिंग बनाता है, क्योंकि यह केवल एसएस प्रकार (फ्लोट और डबल) के लिए काम करता है लेकिन लंबे समय तक नहीं, जो x87 विशिष्ट है। इसके अलावा, अपवादों को सक्षम करने से यह पूरी प्रक्रिया के लिए होता है, न कि वर्तमान धागे के लिए, जो इसके साथ काम करना मुश्किल बनाता है। – nraynaud

0

मैं क्या मानक है के बारे में अनिश्चित हूँ, लेकिन मैं आपको बता सकता है मैं अनुभव से क्या देखा है के रूप में यह उपयोगी हो सकता है। मैंने सी ++ में कोड किया है और कभी-कभी मेरा सबसे बुरा सपना है। वे चुपचाप दिखाई देते हैं और गणना के माध्यम से अंत तक सभी तरह से प्रचार करते हैं, जब तक कि मेरे पास बेकार आउटपुट न हो। मुझे अक्सर एनएएन-कारण परिस्थितियों का पता लगाने के लिए अतिरिक्त कोड बनाना पड़ता है। मैं विजुअल सी ++ 2008 का उपयोग कर रहा हूं, इसलिए मुझे उम्मीद है कि यह इस तरह से आईईईई मानक का पालन करेगा।

+0

हाँ यह पूरी तरह से मानक है। लेकिन मानक उपयोग के 3 स्तरों को परिभाषित करता है 1) NaN और infs 2 का प्रचार) झंडे आप 3) सॉफ़्टवेयर जाल की जांच कर सकते हैं। हो सकता है कि आपका उपयोग डिफ़ॉल्ट व्यवहार को रखने के लिए बहुत उन्नत हो। – nraynaud

0

मेपल के प्रोग्रामिंग भाषा एक संख्यात्मक मॉडल है कि आईईईई-754 सम्मान करता है और आप अपने खुद के जाल संचालकों अगर आप चाहते हैं स्थापित करने के लिए, की अनुमति देता है। ये कुछ लिंक कर रहे हैं:

एक असामान्य मेपल की संपत्ति यह है कि डिफ़ॉल्ट फ़्लोटिंग पॉइंट नंबर दशमलव (बाइनरी नहीं) और मनमाने ढंग से सटीक हैं। यदि आप 64-बिट बाइनरी फ़्लोटिंग पॉइंट नंबरों से निपटना चाहते हैं, तो उन्हें HFloat में लपेटें। उदाहरण के लिए, 0.2, वास्तव में दशमलव संख्या का प्रतिनिधित्व करता है, जबकि HFloat(0.2) एक ही नंबर आप सी में एक डबल करने के लिए 0.2 बताए यह चल रहा है, उदाहरण के लिए द्वारा स्पष्ट है के द्वारा प्राप्त करना चाहते हैं,

a := HFloat(0.2); 
b := 0.2; 
evalf[20](a - b); 

यह बीच का अंतर की गणना करता है का प्रतिनिधित्व करता है a और b 20 दशमलव अंक अंकगणितीय का उपयोग कर, और परिणाम 0.11E-16 है।

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