[ad_1]
कृपया बताएं कि यह कैसे काम करता है? प्रोग्राम मुझे तभी सही परिणाम देता है जब मैं पूर्णांक जोड़ता हूं, लेकिन अपने कार्य में मैं टाइप डबल का उपयोग करना पसंद करूंगा।
कार्य विकल्प:
`
for (int i = -10000; i < 10000; i++) { formula = s1 / (v1 + k) + s2; if (formula == 0) { break; } k += 1; }
परिणाम:3.000000
`
यह सही ढंग से काम नहीं करता:
`
for (int i = -10000; i < 10000; i++) { formula = s1 / (v1 + k) + s2; if (formula == 0) { break; } k += 0.00001; }
परिणाम:0.200000
`
मैंने क्या प्रयास किया है:
मेरे प्रोग्राम में मुझे अधिक सटीक परिणाम की आवश्यकता है इसलिए मैं int प्रकार का उपयोग नहीं कर सकता।
समाधान 1
चरण एक यह सुनिश्चित करना है कि चर formula
, s1
, s2
, v1
और k
सभी डबल प्रकार के हैं। आपको वास्तव में उन सभी को दोगुना करने की आवश्यकता नहीं है लेकिन आप परिणाम सुनिश्चित करना चाहते हैं (formula
) एक दोहरा और विभाजन है अवश्य डबल्स के साथ किया जाए. वहाँ एक पूर्णांक परिणाम त्रुटिपूर्ण परिणाम देने की लगभग गारंटी होगी।
चरण दो में दोहरे मानों के साथ समान तुलनाओं से सावधान रहना है अर्थात यदि का परीक्षण करना है formula
शून्य है. इसके लिए सामान्य तकनीक एक एप्सिलॉन मान को परिभाषित करना है जिसका अर्थ है “काफ़ी करीब” और उसके साथ तुलना करना। यहाँ एक उदाहरण है :
const double epsilon = 1.0E-9; // do calculations here double delta = fabs( formula ); if( delta < epsilon ) break;
यह for लूप से बाहर हो जाएगा यदि formula
-1E-9 और +1E-9 के बीच की सीमा में है। आप ईपीएसलॉन के लिए 1.0E-6 या अन्य मानों का उपयोग तब तक कर सकते हैं जब तक यह आपकी वांछित कम्प्यूटेशनल सहनशीलता के भीतर है।
समाधान 2
यहां ध्यान देने योग्य कई बातें हैं। ऐसा लगता है कि प्रत्येक लूप के साथ केवल वेरिएबल k बदला जाता है।
for (int i = -10000; i < 10000; i++) { formula = s1 / (v1 + k) + s2; if (formula == 0) { break; } k += 0.00001; }
दुर्भाग्य से, मान k += 0.00001 को बिल्कुल फ़्लोट (या डबल) के रूप में संग्रहीत नहीं किया जा सकता है, इसलिए कंपाइलर आमतौर पर निकटतम मान का उपयोग करता है। यदि आप अब इन बिल्कुल मेल न खाने वाली दोहरी संख्याओं को जोड़ते हैं, तो प्रत्येक लूप के साथ योग में त्रुटि बढ़ जाती है।
अब समस्या को हल करने के कई तरीके हैं।
1. बार-बार जोड़ने के बजाय, स्लाइस इंडेक्स द्वारा एक बार गुणा करना बेहतर होता है, जिससे सटीकता काफी बढ़ जाती है।
2. दो फ्लोट्स की एक-दूसरे से सीधे तुलना करने के बजाय, अंतर की जांच करना बेहतर होगा, जिससे अंतर अक्सर 0 नहीं होता है, बल्कि एक निर्दिष्ट मूल्य से नीचे आना चाहिए।
बेहतर सटीकता के लिए फ्लोट के बजाय डबल का उपयोग करने से समस्या केवल स्थानांतरित होगी, हल नहीं होगी।
[ad_2]
コメント