2010-03-02 9 views
17

मैंने कल का हिस्सा बिताया और आज कुछ मैटलैब कोड में एक बग को ट्रैक किया। मैंने सोचा था कि मेरी समस्या इंडेक्सिंग थी (कई संरचनाओं के साथ जिन्हें मैंने परिभाषित नहीं किया था और अभी भी उपयोग किया जा रहा है), लेकिन यह एक अतिप्रवाह बग साबित हुआ। मैं एक बहुत ही विशेष कारण से इस चूक:Matlab में अतिप्रवाह बग को कैसे पहचानें?

>> uint8(2) - uint8(1) 

ans = 

    1 

>> uint8(2) - uint8(2) 

ans = 

    0 

>> uint8(2) - uint8(3) 

ans = 

    0 

मैं अपेक्षा की होगी -1 (या 255) की तरह कुछ होने के लिए पिछले एक। एक बड़े वेक्टर के बीच में, गलत 0 एस का पता लगाना मुश्किल था, लेकिन 255 आसानी से खड़ा होता।

भविष्य में इन समस्याओं का आसानी से पता लगाने के तरीके पर कोई सुझाव? (आदर्श रूप से, मैं इसे सी की तरह काम करने के लिए अतिप्रवाह जांच को बंद करना चाहता हूं।) double पर काम करना, निश्चित रूप से, लेकिन अगर मुझे नहीं पता कि यह uint8 है, तो इससे मदद नहीं मिलती है।

+1

कहाँ से इन नंबरों मिलता है? यदि आप उन्हें फ़ाइल से लोड करते हैं, तो आप बस लोडर को एक लाइन जोड़ सकते हैं या तो यूंट 8, या डबल के रूप में सभी को वापस कर सकते हैं। फ़ाइलों को पढ़ने के अलावा आपको मैटलैब में uint8 की अपेक्षा नहीं करनी चाहिए। – Jonas

+0

मैं वास्तव में वास्तव में नहीं जानता कि वे कहां से आ रहे हैं। मैं किसी और के कोड के साथ एकीकृत कर रहा हूं, इसलिए मुझे विवरण नहीं पता। –

उत्तर

13

आप पूर्णांक चेतावनी को चालू करके शुरू कर सकते हैं:

intwarning('on') 

यह आपको एक चेतावनी पूर्णांक गणित अतिप्रवाह जब दे देंगे।

हालांकि सावधान रहें, जैसा कि here उल्लिखित है, यह पूर्णांक अंकगणित धीमा कर देता है, इसलिए केवल डीबग के दौरान इसका उपयोग करें।

+3

नोट: [इंटवार्निंग अब हटा दिया गया है] (http://www.mathworks.com/help/techdoc/rn/bsdgysw-1.html#bseu09o-1), और उपरोक्त लिंक अब अमान्य है। – gnovice

+0

क्या आप जानते हैं कि इसे क्यों हटाया गया था और इसके बजाय क्या उपयोग करना है? – Lupocci

1

पूर्णांक संचालन पर चेतावनियों को नियंत्रित करने के लिए INTWARNING फ़ंक्शन देखें।

http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intwarning.html

+1

नोट: [इंटवार्निंग अब हटा दिया गया है] (http://www.mathworks.com/help/techdoc/rn/bsdgysw-1.html#bseu09o-1), और उपरोक्त लिंक अब अमान्य है। – gnovice

6

, रिहाई R2010b और बाद में, समारोह INTWARNING has been removed के साथ शुरू these warning messages for integer math and conversion के साथ:

  • MATLAB:intConvertNaN
  • MATLAB:intConvertNonIntVal
  • MATLAB:intConvertOverflow
  • MATLAB:intMathOverflow

तो इंटीवायरिंग का उपयोग करने के लिए इंटीवायरिंग का उपयोग करने के लिए अब एक व्यवहार्य विकल्प नहीं है जब पूर्णांक अतिप्रवाह होता है। एक विकल्प है कि आप अपने डेटा की कक्षा का परीक्षण करने के लिए CLASS फ़ंक्शन का उपयोग करें और ऑपरेशन करने से पहले इसे तदनुसार पुन: प्रस्तुत करें। यहाँ एक उदाहरण है:

if strcmp(class(data),'uint8') %# Check if data is a uint8 
    data = double(data);   %# Convert data to a double 
end 

तुम भी ISA समारोह इस्तेमाल कर सकते हैं और साथ ही:

if ~isa(data,'single') %# Check if data is not a single 
    data = single(data); %# Convert data to a single 
end 
+2

यदि आप नहीं जानते कि आपका डेटा कहां से आ रहा है, तो आपको निश्चित रूप से इस तरह के बहुत सावधानीपूर्वक इनपुट परीक्षण करना चाहिए। – Jonas

+0

@gnovice मैं बस एक ही समस्या में भाग गया, लेकिन डबल या सिंगल को कास्टिंग करने का आपका दृष्टिकोण मेरे लिए बहुत अजीब लगता है। अगर मुझे उन संकेतों की ज़रूरत है तो क्या होगा? मैं युगल पर सबकुछ करने के लिए मजबूर नहीं होना चाहता हूं। निश्चित रूप से आप के लिए कोई सवाल नहीं है, लेकिन MATLAB मानक हस्ताक्षरित पूर्णांक संचालन का उपयोग क्यों नहीं कर सकता? – angainor

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