2010-08-08 12 views
7

पर मॉड (%) ऑपरेटर मुझे एक अजीब बग को हल करने में मदद की ज़रूरत है - जब मैं x86 पर mod (%) ऑपरेटर का उपयोग करता हूं तो सभी अच्छे, पर, लेकिन x64 पर मुझे कभी-कभी NaN शेष के रूप में मिलता है (यह आमतौर पर कोण के साथ होता है = 0)। मैं अपने कोड के बाहर उस बग को पुन: उत्पन्न करने में कामयाब रहा, लेकिन केवल कोण = डबल के साथ। एप्सिलॉन (मेरे कोड पर यह कोण = 0 के साथ भी होता है)।x86 बनाम x64

class Program 
{ 
    public const double M_PI = 3.14159265358979323846; 
    static void Main(string[] args) 
    { 
     double m_2PI = (2 * M_PI); 
     double m_Angle = double.Epsilon; 
     double mod = (m_Angle % m_2PI); 
     //x86 mod = 4.94065645841247E-324 
     //x64 mod = NaN 
     if (double.IsNaN(mod)) 
      Debug.Write(mod); 
    } 
} 

सादर, शे

+0

इतना यकीन नहीं है कि यह एक बग है - x86 और x64 फ़्लोटिंग पॉइंट अलग-अलग परिणाम लौटा सकता है। आपको बस इसके आसपास काम करने की आवश्यकता हो सकती है। –

+1

छोटी युक्ति: आप इसे अपने स्वयं के स्थिर –

उत्तर

1

यह एक अजीब बग, बल्कि एक काफी उम्मीद बग नहीं है। यदि आप संख्यात्मक डेटाटाइप की बाहरी सीमा में हैं और संचालन के साथ खेलते हैं, तो यह आश्चर्यचकित होगा अगर ऐसा नहीं होता है।

एक समाधान मॉड फ़ंक्शन को समाहित कर सकता है।

static double myMod(double v, double m){ 
    if(v < m) return v; 
    return v % m; 
} 

क्या मैं पूछ सकता हूं, आप इस तरह के सीमा रेखा के मामले के बारे में चिंता क्यों करते हैं?

+7

के रूप में निर्दिष्ट करने के बजाय 'Math.PI' का उपयोग कर सकते हैं स्पष्ट रूप से, सीमा रेखा के मामले बहुत महत्वपूर्ण हैं। वे उत्पादन सॉफ्टवेयर में बड़ी संख्या में बग के लिए खाते हैं। –

+0

दिया गया कार्य गलत है यदि 'v' या' m' नकारात्मक हो सकता है। – phoog

1

सी # मॉड्यूलस ऑपरेटर सामान्य सी के int मानों से अधिक ले सकता है। लेकिन हाँ, मुझे लगता है कि आईएसए के बीच मतभेद हैं जब आप ईपीएसलॉन मात्रा कर रहे हैं।

आपके मामले में एनपीएस के कारण पर्याप्त संख्या में ईपीएसलॉन।

देखें कि क्या आप इसे फ्लोट और अन्य प्रकार के साथ पुन: पेश कर सकते हैं। यदि आप उनका उपयोग कर सकते हैं, तो समस्या "हल" हो जाती है।

एक कामकाज के रूप में आप अपने आप को निकट ईपीएसलॉन के साथ गणित कर सकते हैं और बस उस मामले को 0 वापस कर सकते हैं।

0

अस्वीकरण: मैं नेट प्रोग्रामर नहीं हूं।

लेकिन यह एक बग की तरह लगता है। ऑपरेशन आपके द्वारा प्रदान किए गए इनपुट के लिए अच्छी तरह से परिभाषित किया गया है, और m_Angle वापस करना चाहिए। मेरा अनुमान है कि कार्यान्वयन बिना शर्त रूप से विभाजन m_Angle/m_2PI का प्रयास करता है, जो आपके इनपुट के लिए बहती है। जाहिर है, इस स्थिति का प्रबंधन 32-बिट और 64-बिट प्लेटफार्मों के बीच अलग है। यह अतिरिक्त रेंज जांच के लिए मामूली रनटाइम जुर्माना की लागत पर मार्कस जोहानसन के उत्तर के समान कुछ सही ढंग से किया जा सकता था।

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