फोरट्रान में दोहरा सटीक मान कैसे सेट करें


10

हाल ही में, मुझे FORTRAN95 के साथ एक विचित्र समस्या का सामना करना पड़ा है। मैंने आरंभिक चर X और Y निम्नानुसार हैं:

X=1.0
Y=0.1

बाद में मैंने उन्हें एक साथ जोड़ दिया और परिणाम प्रिंट किया:

1.10000000149012

चरों की जाँच करने के बाद, ऐसा लगता है मानो पूर्ण सटीकता के साथ 0.1 को दोहरी सटीकता में नहीं दर्शाया गया है। क्या इससे बचने का कोई तरीका है?

जवाबों:


21

ऐसा करने का दूसरा तरीका यह है कि आप SELECTED_REAL_KIND आंतरिक का उपयोग करके चर में इच्छित सटीकता को स्पष्ट रूप से निर्दिष्ट करें और फिर चर को परिभाषित करने और आरंभ करने के लिए इसका उपयोग करें। कुछ इस तरह:

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

इस तरह से करने का एक अच्छा फायदा यह है कि आप dpएक मॉड्यूल की परिभाषा को स्टोर कर सकते हैं , फिर USEउस मॉड्यूल को जहां जरूरत हो। अब यदि आप कभी भी अपने प्रोग्राम की शुद्धता को बदलना चाहते हैं, तो आपको केवल अपने वेरिएबल इनिशियलाइज़ेशन के अंत में dpसभी D0s को खोजने और बदलने के बजाय उस एक जगह की परिभाषा को बदलना होगा । (यह भी है कि मैं 1.0D-1सुझाव के रूप में वाई को परिभाषित करने के लिए वाक्यविन्यास का उपयोग नहीं करने की सलाह दूंगा। यह काम करता है, लेकिन भविष्य में सभी उदाहरणों को खोजने और बदलने के लिए कठिन बनाता है।)

फोरट्रान विकी पर यह पृष्ठ कुछ अच्छी अतिरिक्त जानकारी देता है SELECTED_REAL_KIND


यह सही है, यह मानक दृष्टिकोण होना चाहिए।
ओन्ड

और कितनी बार लोगों को वास्तव में वैसे भी प्रक्रिया द्वारा परीक्षण और परीक्षण के बिना आँख बंद करके अपने कार्यक्रमों पर सटीकता को बदलना पड़ता है? _dpयोजना का उपयोग करने का मुख्य कारण यह है कि परिशुद्धता को पोर्टेबल तरीके से स्पष्ट रूप से परिभाषित किया गया है।
ja72

12

आपने चर को दोहरी सटीकता के रूप में घोषित किया, लेकिन आपने उन्हें एकल परिशुद्धता मूल्यों के साथ प्रारंभ किया।

आप लिख सकते हैं:

X=1.0d0
Y=1.0d-1

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


1
मुझे लगता है कि किसी को नीचे पोस्ट में वर्णित 1.0_dp विधि का उपयोग करना चाहिए।
ओन्ड

1
मैं दूसरी @ Ond secondejČertík की टिप्पणी - बैरन का उत्तर सबसे अच्छा है।
ऑस्करबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.