2012-02-04 5 views
138

मेरे पास सी ++ में एक प्रोग्राम है (जी ++ का उपयोग करके संकलित)। मैं मापांक कार्य करने के लिए ऑपरेंड के रूप में दो युगल लागू करने के लिए कोशिश कर रहा हूँ, लेकिन मैं निम्नलिखित त्रुटि मिलती है:युगल पर मॉड्यूलस का उपयोग नहीं कर सकता?

error: invalid operands of types 'double' and 'double' to binary 'operator%'

कोड यह रहा:

int main() { 
    double x = 6.3; 
    double y = 2; 
    double z = x % y; 
} 
+9

के रूप में उल्लेख किया गया है, fmod() आवश्यक समारोह प्रदान करता है। जैसा कि अभी तक उल्लेख नहीं किया गया है, यह जानना महत्वपूर्ण है कि 'fmod' के दूसरे ऑपरेंड में गोल करने वाली त्रुटियां अप्रत्याशित व्यवहार कर सकती हैं। उदाहरण के लिए, 'fmod (1, 0.1);' गणितीय रूप से शून्य होना चाहिए, लेकिन वास्तव में लगभग 0.1 हो जाएगा। त्रुटि की सीमा मात्रा के आयाम के साथ बढ़ जाती है। उदाहरण के लिए, 'fmod (9E14, 0.1); '0.05 का मूल्यांकन करता है, जो गणितीय दृष्टिकोण से सिर्फ सादा गलत है। – supercat

+1

@supercat अधिक जानकारी अद्भुत होगा। मुझे लगता है कि दृश्यों के पीछे क्या है, इसके बारे में एक विचार है जो आप सच कहने के लिए करते हैं, लेकिन यह देखने के लिए अच्छा होगा कि आप जो कहते हैं वह सच है; देखना दिलचस्प होगा कि यह दृश्यों के पीछे कैसे काम करता है (मुझे लगता है कि मैं समझता हूं लेकिन बहुत आसानी से गलत हो सकता है)। – RastaJedi

+2

फ़्लोटिंग-पॉइंट मान सटीक पूर्णांक गुणांक या दो की शक्तियों के अंशों का प्रतिनिधित्व करते हैं। उदाहरण के लिए, पूर्णांक अक्षर 0.1 वास्तव में 3602879701896397/36028797018963968 है (बाद वाला मान दो की शक्ति है)। 'fmod (x, 0.1) 'उस सटीक अंश से एक्स को विभाजित करेगा और संख्यात्मक मूल्य" दसवां "द्वारा विभाजित करने के बजाय शेष को ले जाएगा। – supercat

उत्तर

214

% ऑपरेटर पूर्णांकों के लिए है। आप fmod() function खोज रहे हैं।

#include <cmath> 

int main() 
{ 
    double x = 6.3; 
    double y = 2.0; 
    double z = std::fmod(x,y); 

} 
+0

मैं क्यूटी के लिए सी ++ में प्रोग्रामिंग कर रहा हूं और fmod में एक बग है। एफएमओडी (कोण, 360) का परिणाम 360 हो सकता है (WAT ?!) – Paul

+1

@ पॉल: शायद यह एक बग नहीं है। यदि 'कोण' है, तो कहें, '35 9.9 99 99 99', फिर' कोण 'और' एफएमओडी (कोण, 360) 'दोनों को '360' के रूप में प्रदर्शित होने की संभावना है। (आवश्यकतानुसार 9 और जोड़ें।) मूल्यों को प्रिंट करने का प्रयास करें, कहें, सटीकता के 50 अंक। –

33

fmod(x, y) वह फ़ंक्शन है जिसका आप उपयोग करते हैं।

2

fmod()<cmath> से fmod() का उपयोग करें। आप सी हेडर फाइल शामिल करने के लिए नहीं करना चाहते हैं (ध्यान दें: Ufloat या double नहीं किया जा सकता):

template<typename T, typename U> 
constexpr T dmod (T x, U mod) 
{ 
    return !mod ? x : static_cast<long long>(x) % mod + x - static_cast<long long>(x); 
} 

//Usage: 
double z = dmod<double, unsigned int>(14.3, 4); 
double z = dmod<long, short>(14, 4); 
//This also works: 
double z = dmod(14, 4); 
double z = dmod(14, 0); 
double z = dmod(myFirstVariable, someOtherVariable); 
+0

आप सी हेडर फ़ाइल क्यों शामिल नहीं करना चाहेंगे? यही वह है जो इसके लिए है। –

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

  • कोई संबंधित समस्या नहीं^_^