2013-02-23 31 views
14

जब मैं 32-बिट पावरपीसी कर्नेल में नीचे दिए गए C++ प्रोग्राम को चलाता हूं जो सॉफ़्टवेयर फ़्लोटिंग इम्यूलेशन (हार्डवेयर फ्लोटिंग पॉइंट अक्षम) का समर्थन करता है, तो मुझे गलत सशर्त मूल्यांकन मिलता है। क्या कुछ मुझे बता सकते हैं कि यहां संभावित समस्या क्या है?गलत फ़्लोटिंग पॉइंट व्यवहार

#include <stdio.h> 

int main() { 
    int newmax = 1; 
    if ((newmax + 0.0) > 256) { 
     printf("\nShouldn't be here\n"); 
    } else { 
     printf("\nShould be here\n"); 
    } 
} 

संकलित: लक्ष्य सिस्टम में

powerpc-linux-g++ -msoft-float -c floating.cxx 
powerpc-linux-g++ -o floating floating.o 

आउटपुट:

[linux:/]$ ./floating 
Shouldn't be here 
+0

क्या आप मुझे बता सकते हैं कि कर्नेल क्या है? मेरा सबसे अच्छा अनुमान यह है कि इसका अनुकरण किसी भी तरह फ्लोटिंग पॉइंट मानक का पालन नहीं करता है, जिसमें शून्य का अचूक प्रतिनिधित्व होता है। साथ ही, ध्यान रखें कि 0.0 डिफ़ॉल्ट रूप से डिफ़ॉल्ट है, तैरने के लिए नहीं। शायद आपका सॉफ़्टवेयर एमुलेटर डबल का समर्थन नहीं करता है। – speeder

+2

आपको लिंक करते समय -मोफ्ट-फ्लोट भी निर्दिष्ट करना चाहिए। –

+0

@ स्पीडर। यह एक कस्टम 2.6.32.5 9 कर्नेल है। मुझे भी संदेह है कि यह कर्नेल में एक सॉफ्टवेयर इम्यूलेशन मुद्दा हो सकता है। – rajachan

उत्तर

1

आप -msoft फ्लोट भी निर्दिष्ट करना चाहिए जब जोड़ने के लिए हमें एक dissassembly दें एस ध्वज के साथ : powerpc-linux-g ++ -msoft-float -c floating.cxx -S -o floating.s

0

सबसे पहले, क्यों हार्डवेयर फ़्लोटिंग बिंदु अक्षम है?

इस प्रकार के कारण गलत क्रम में किए जा सकते हैं।

(double)1 = 0x3FF0000000000000 
(float) 1 = 0x3F800000 

यह आपकी हालत है।

if ((newmax + 0.0) > 256) 

आपके मामले में: 1) newmax तैरने लगते हैं या करने के लिए कास्टिंग डबल; 2) 0.0 जोड़ना; 3) प्राप्त मूल्य को वापस int में प्राप्त किया गया।

यह आपकी मशीन पर निर्भर करता है, लेकिन आमतौर पर int 32-बिट मान होता है। यह जांच करने के लिए आप का उपयोग कर सकते हैं:

int i; 
printf("%d", sizeof(i)); 

वैसे भी, वापस अपनी समस्या के लिए जा रहा, गणना मूल्य पूर्णांक में परिवर्तित करने के बाद आप बड़े धनात्मक संख्या मिलता है। अपनी स्थिति में मैं इसे प्रिंट होगा/या 0x100 के साथ लेकिन

0x3F800000, 0x3FF0000000000000 साथ नहीं की तुलना, 0x3FF00000

पता लगाने के लिए, क्या हुआ है, लेकिन disassembling सबसे अच्छा विकल्प है।

शायद यह इतना उपयोगी नहीं था, लेकिन यह मेरा विचार था, क्या हुआ।

+0

किस प्रकार के प्रकार का प्रदर्शन किया जाता है, उसे सी ++ मानक द्वारा निर्दिष्ट किया जाता है। यह परवाह नहीं करता है कि क्या फ्लोटिंग पॉइंट ऑपरेशंस एसडब्ल्यू या एचडब्ल्यू द्वारा किया जाता है या इसका मिश्रण होता है। – MSalters

-1

आपके कोड में नया कथन न्यूमैक्स + 0.0 एक परिणाम को फ्लोट या डबल में उत्पन्न करता है लेकिन इसकी तुलना पूर्णांक मान से की जाती है।

इस प्रकार यह त्रुटि।

इस बाहर की कोशिश करो,

int i=1; 
printf("%d",(i+0.0)); 

आप कोई बात नहीं क्या मैं का मूल्य एक परिणाम 0 हर मिलता है। जबकि,

int i=1; 
printf("%f",(i+0.0)); 

यह पैदा करता है 1.0000

0

इस संकलक त्रुटि से कोडांतरक त्रुटि के कुछ भी हो सकता त्रुटि लिंकर करने के लिए त्रुटि कर्नेल। जैसा कि अन्य लोगों ने पहले ही बताया है: कंपाइलर त्रुटियां - जो इस त्रुटि का सबसे अधिक संभावित स्रोत है - यदि आपने -एस विकल्प के साथ संकलन का आउटपुट प्रदान किया है, तो सत्यापित किया जा सकता है (या अस्वीकार कर दिया गया)।यदि यह एक कंपाइलर त्रुटि नहीं है, तो फ्लोटिंग पॉइंट इम्यूलेशन वाला कर्नेल त्रुटि समस्या का अगला संभावित स्रोत होगा।

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