सवाल मैं फ्लोट / डबल के लिए मॉड्यूलस का उपयोग कैसे करूं?


मैं एक स्कूल परियोजना के लिए एक आरपीएन कैलकुलेटर बना रहा हूँ। मुझे मॉड्यूलस ऑपरेटर के साथ परेशानी हो रही है। चूंकि हम डबल डेटा प्रकार का उपयोग कर रहे हैं, इसलिए मॉड्यूलस फ़्लोटिंग पॉइंट नंबरों पर काम नहीं करेगा। उदाहरण के लिए, 0.5% 0.3 0.2 वापस आना चाहिए लेकिन मुझे शून्य अपवाद द्वारा एक विभाजन मिल रहा है।

निर्देश fmod () का उपयोग करने के लिए कहते हैं। मैंने javadocs सहित fmod () के लिए हर जगह देखा है, लेकिन मुझे यह नहीं मिल रहा है। मुझे लगता है कि यह एक तरीका है जिसे मैं बनाना चाहता हूं?

संपादित करें: हम्म, अजीब। मैंने अभी उन नंबरों में फिर से प्लग किया है और ऐसा लगता है कि यह ठीक काम कर रहा है ... लेकिन बस मामले में। फ़्लोटिंग प्रकारों का उपयोग करते समय मुझे जावा में मॉड ऑपरेटर का उपयोग करने की ज़रूरत है? मुझे कुछ पता है जैसे सी ++ (मुझे लगता है) में नहीं किया जा सकता है।


39
2018-06-01 02:53


मूल




जवाब:


जब आप पहली बार इसे चलाते थे तो आपके पास शायद एक टाइपो था।

का मूल्यांकन 0.5 % 0.3 अपेक्षित के रूप में '0.2' (एक डबल) देता है।

माइंडप्रोड में एक है मॉड्यूलस कैसे काम करता है इसका अच्छा अवलोकन जावा में


61
2018-06-01 02:59



परंतु 1.0 % 0.1 रिटर्न ... 0.09999999999999995, एक गोल त्रुटि के परिणामस्वरूप। किसी भी विचार के लिए इसे कैसे सही करें (संभावित रूप से ईपीएसलॉन मानों के साथ?) - Groostav
गोल करने वाली त्रुटियां हमेशा फ़्लोटिंग पॉइंट गणनाओं में होती रहेंगी। या तो मूल्य दिया गया है, या इसे निकटतम आवश्यक मूल्य पर ले जाएं। - Anarchofascist
String.format("%.8f",1.0%0.1) रिटर्न 0.10000000 - Anarchofascist
@ ग्रोस्टव यह एक गोल त्रुटि नहीं है। 0.1 डबल मान के रूप में प्रदर्शित नहीं किया जा सकता है, इसलिए परिणाम निकटतम प्रतिनिधित्व योग्य डबल मान है। - augurar
यह सिर्फ गोल होने के परिणाम से भी बदतर है। तुमने कहा था 1.0 % 0.1 लेकिन आपने वास्तव में क्या किया था 1.0 % 0.10000000000000000555111512... इसलिए यदि आप उस 1.0 को बढ़ाते हैं तो उत्तर 0.1 से आगे और आगे जाएगा। - Mark Jeronimus


सी के विपरीत, जावा दोनों पूर्णांक और फ़्लोटिंग बिंदु के लिए% का उपयोग करने की अनुमति देता है और (सी 8 9 और सी ++ के विपरीत) यह सभी इनपुट (नकारात्मक सहित) के लिए अच्छी तरह परिभाषित है:

से जेएलएस §15.17.3:

एक फ्लोटिंग पॉइंट का परिणाम   शेष ऑपरेशन द्वारा निर्धारित किया जाता है   आईईईई अंकगणितीय के नियम:

  • यदि ऑपरेशन नैन है, तो परिणाम नैन है।
  • यदि परिणाम NaN नहीं है, तो परिणाम का संकेत चिह्न के बराबर है   लाभांश
  • यदि लाभांश एक अनंत है, या divisor शून्य है, या दोनों,   परिणाम NaN है।
  • यदि लाभांश सीमित है और divisor एक अनंत है, परिणाम   लाभांश के बराबर है।
  • यदि लाभांश शून्य है और divisor परिमित है, परिणाम   लाभांश के बराबर है।
  • शेष मामलों में, जहां न तो अनंत, न ही शून्य, न ही   NaN शामिल है, फ्लोटिंग पॉइंट   ए के विभाजन से शेष आर   divisor डी द्वारा लाभांश एन परिभाषित किया गया है   गणितीय संबंध आर = एन- (डी क्यू) द्वारा   जहां क्यू एक पूर्णांक है जो नकारात्मक है   केवल अगर एन / डी नकारात्मक और सकारात्मक है   केवल अगर एन / डी सकारात्मक है, और जिसका   परिमाण जितना संभव हो उतना बड़ा है   की परिमाण से अधिक के बिना   एन और डी के वास्तविक गणितीय भाग्य।

तो आपके उदाहरण के लिए, 0.5 / 0.3 = 1.6 ...। क्यू में एक ही संकेत (सकारात्मक) 0.5 (लाभांश) के रूप में होता है, और परिमाण 1 (1.6 तीव्रता से अधिक नहीं होने वाला सबसे बड़ा परिमाण वाला पूर्णांक होता है), और आर = 0.5 - (0.3 * 1) = 0.2


38
2018-06-01 03:03



अंतिम बुलेट बिंदु पाठ की दीवार है। यह स्पष्ट होगा कि एक उदाहरण से: 0.5 % 0.3 = 0.2 तथा (-0.5) % 0.3 = -0.2 - GameDeveloper


मैंने सोचा कि नियमित मॉड्यूलस ऑपरेटर जावा में इसके लिए काम करेगा, लेकिन कोड को मुश्किल नहीं हो सकता है। बस संख्याकर्ता द्वारा denatorator विभाजित, और परिणाम के पूर्णांक भाग ले लो। Denominator द्वारा गुणा करें, और अंक से परिणाम घटाएं।

x = n / d
xint = Integer portion of x
result = n - d * xint

5
2018-06-01 02:59





fmod फ्लोटिंग-पॉइंट मॉड्यूलस को संभालने के लिए मानक सी फ़ंक्शन है; मुझे लगता है कि आपका स्रोत कह रहा था कि जावा फ्लोटिंग-पॉइंट मॉड्यूलस को सी के समान ही संभालता है fmod समारोह। जावा में आप इसका उपयोग कर सकते हैं % युगल पर ऑपरेटर पूर्णांक पर समान है:

int x = 5 % 3; // x = 2
double y = .5 % .3; // y = .2

2
2018-06-01 02:59