युगल पर मापांक का उपयोग नहीं कर सकते?


185

मेरा C ++ में एक प्रोग्राम है (g ++ का उपयोग करके संकलित)। मैं मॉडुलस फ़ंक्शन में ऑपरेंड के रूप में दो डबल्स लागू करने की कोशिश कर रहा हूं, लेकिन मुझे निम्न त्रुटि मिलती है:

त्रुटि: 'डबल' और बाइनरी 'ऑपरेटर%' के 'डबल' प्रकार के अमान्य ऑपरेंड

यहाँ कोड है:

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

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

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

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

जवाबों:


272

%ऑपरेटर पूर्णांकों के लिए है। आप fmod()फ़ंक्शन की तलाश कर रहे हैं ।

#include <cmath>

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

}

मैं C ++ में Qt के लिए प्रोग्रामिंग कर रहा हूं और fmod का वहां एक बग है। Fmod (कोण, 360) का परिणाम 360 (वाट?) हो सकता है
पॉल

7
@Paul: यह शायद एक बग नहीं है। अगर angle, कहते हैं, 359.9999999तो दोनों angleऔर के fmod(angle, 360)रूप में प्रदर्शित होने की संभावना है 360। (आवश्यकता के अनुसार अधिक 9s जोड़ें।) मानों को मुद्रण के लिए कहें, सटीकता के 50 अंक।
कीथ थॉम्पसन

@Paul Qt का QString :: प्रारूप गोल होगा। यदि यह महत्वपूर्ण है, तो आपको या तो खुद को राउंड करना होगा या "360" के लिए आउटपुट की जांच करनी होगी और इसे अपने मूल्य से बदलना होगा।
jfh


5

का प्रयोग करें fmod()से <cmath>। यदि आप C शीर्षलेख फ़ाइल को शामिल नहीं करना चाहते हैं:

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

//Usage:
double z = dmod<double, unsigned int>(14.3, 4);
double z = dmod<long, float>(14, 4.6);
//This also works:
double z = dmod(14.7, 0.3);
double z = dmod(14.7, 0);
double z = dmod(0, 0.3f);
double z = dmod(myFirstVariable, someOtherVariable);

3
आप C शीर्ष लेख फ़ाइल को क्यों शामिल नहीं करना चाहेंगे? यह वही है जिसके लिए यह है।
कीथ थॉम्पसन

2

आप अपने खुद के मापांक कार्य को लागू कर सकते हैं जो आपके लिए है:

double dmod(double x, double y) {
    return x - (int)(x/y) * y;
}

तो फिर तुम बस का उपयोग कर सकते dmod(6.3, 2), शेष पाने के लिए 0.3


अभी भी एक सही समाधान नहीं है। एक्स = 10.499999999999998, वाई .69999999999999996 रिटर्न .69999999999999929 के बजाय 0.0 =
tarpista
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.