2012-07-09 35 views
9

मैं gfortran में क्वाड परिशुद्धता का उपयोग करने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि real*16 काम नहीं करता है। कुछ मछली पकड़ने के बाद, मैंने पाया है कि इसे real*10 के रूप में कार्यान्वित किया जा सकता है। real*10वास्तव में क्वाड परिशुद्धता है?gfortran में क्वाड परिशुद्धता का उपयोग और सत्यापन कैसे करें?

मैं अपने कोड की सटीकता का परीक्षण कैसे कर सकता हूं? सटीक परीक्षण के लिए एक मानक सरल एल्गोरिदम है? उदाहरण के लिए, जब मैं यह जानना चाहता हूं कि कंप्यूटर शून्य क्या है, तो मैं 2.0 तक विभाजित करता हूं जब तक कि मैं 0.0 तक नहीं पहुंच जाता। मानों का ट्रैक रखने से मुझे पता चलता है कि कंप्यूटर 'सोचता है कि मेरा गैर-शून्य संख्या शून्य है - मुझे कंप्यूटर शून्य दे रहा है।

क्या मैंने वर्णित एक प्रकार के एल्गोरिदम के साथ परिशुद्धता को समझने का एक अच्छा तरीका है?

+0

दुर्भाग्य से, हम वास्तव में जानकारी खो रहे हैं जिसका मतलब है * "काम नहीं करता" *। इस तरह के फॉर्मूलेशन का कभी भी अच्छे प्रश्नों में उपयोग नहीं किया जाना चाहिए, क्योंकि यह कुछ भी उपयोगी नहीं बताता है। –

उत्तर

11

मौजूदा उत्तरों में जोड़ना ... वास्तविक * एन भाषा का विस्तार है और इसका सबसे अच्छा उपयोग नहीं किया जाता है। असली * 10 क्वाड परिशुद्धता नहीं है। इसे "विस्तारित" कहा जाता है - यह इंटेल प्रोसेसर द्वारा प्रदान किया गया 10 बाइट प्रकार है। असली * 16 संकलन संस्करण, हार्डवेयर और libquadmath की उपलब्धता के आधार पर, gfortran पर उपलब्ध हो सकता है या नहीं। यदि सॉफ्टवेयर में प्रदान किया गया है, तो यह धीमा हो जाएगा।

आपके द्वारा इच्छित परिशुद्धता के लिए एक प्रकार का मूल्य परिभाषित करने के लिए चयनित_real_kind फ़ंक्शन का उपयोग करने के लिए फोरट्रान तरीका चयनित_real_kind फ़ंक्शन का उपयोग करना है।

integer, parameter :: QR_K = selected_real_kind (32) 
real (kind=QR_K) :: MyReal 

यदि यह उपलब्ध है, तो क्वाड वास्तविक संख्या प्राप्त होगी। वैकल्पिक रूप से, फोरट्रान 2008 या बाद में आप "ISO_FORTRAN_ENV का उपयोग कर सकते हैं" और फिर इस तरह के मूल्य REAL128 तक पहुंच प्राप्त कर सकते हैं। यदि सटीक अनुपलब्ध है तो दयालु मान -1 होंगे।

इससे संबंधित एक सवाल: What does `real*8` mean?

+0

* "वास्तविक * 10 क्वाड परिशुद्धता नहीं है। इसे" विस्तारित "कहा जाता है - यह इंटेल प्रोसेसर द्वारा प्रदान किया गया 10 बाइट प्रकार है।" * मोटोरोला 68k चिप्स पर भी उपलब्ध है। – dmckee

+0

यह है: पढ़ें (दयालु = QR_K) :: MyReal वास्तविक (दयालु = QR_K) :: MyReal? – user1271772

+0

हां, एक टाइपो। यह 'असली' होना चाहिए, न कि 'पढ़ा'। उत्तर सही किया गया। –

2

kind type parameters जवाब इस सवाल का, विशेष रूप से अंतिम वाक्य में है, जो पढ़ता के लिए gfortran प्रलेखन:

उपलब्ध तरह मापदंडों में लगातार सरणियों CHARACTER_KINDS, INTEGER_KINDS, LOGICAL_KINDS और REAL_KINDS में पाया जा सकता ISO_FORTRAN_ENV मॉड्यूल (ISO_FORTRAN_ENV देखें)।

जो आपने पाया है वह है कि real*16 आपके प्लेटफ़ॉर्म पर लागू नहीं किया गया है। आधुनिक फोरट्रान कोड के लिए

6

प्रकार का प्रयोग करें अर्थात

real(some_kind_value) :: variable 

फिर आप तरह चर पाने के लिए iso_c_binding मॉड्यूल से selected_real_kind() या iso_fortran_env मॉड्यूल या c_long_double तरह मान का उपयोग कर सकते हैं। इन सभी का थोड़ा अलग अर्थ है।

आप अपने कोड की वास्तविक सटीक आकलन करने के लिए epsilon(), tiny(), huge() या nearest() intrinsics का उपयोग कर सकते हैं।

गोरफ्रान में क्वाड परिशुद्धता आमतौर पर libquadmath लाइब्रेरी की आवश्यकता होती है जो अधिकांश प्लेटफॉर्म के लिए उपलब्ध होनी चाहिए, लेकिन शायद डिफ़ॉल्ट रूप से नहीं।

1

असली (तरह = 10) तथाकथित विस्तारित 80-बिट परिशुद्धता Wikipedia 80-bit है।

वास्तविक (दयालु = 16) उचित चौगुनी 128-बिट परिशुद्धता Wikipedia 128-bit है।

जैसा कि पहले से ही उल्लेख किया गया है, आप चयनित_real_kind(), epsilon(), छोटे(), विशाल() को उपयोग करने के लिए सटीक चयन और जांचने के लिए नियोजित कर सकते हैं।

+3

सावधानी: प्रकार पैरामीटर के लिए विशिष्ट संख्यात्मक मानों का उपयोग कंपेलरों में पोर्टेबल नहीं है। –

0

परीक्षण फ़ाइल

 implicit double precision(a-h,o-z) 
1 continue 
     print * , ' i:' 
     read(5,*) i 
     if(i.le.0) stop 
     a=i 
     b=sqrt(a) 
     print * , b 
     c=b*b 
     print * , c 
     goto 1 
     end 

पर gfortran आदेश

gfortran -fdefault-वास्तविक 8 test.f -ओ test.exe

प्रयास करें मेरी मंच पर (फेडोरा 20) यह काम करता है।

+4

यह वास्तव में भयानक है। क्वाड परिशुद्धता के रूप में सभी डबल परिशुद्धता चर वाले दुष्प्रभाव बहुत परेशान हो सकते हैं। मैं यह भी शर्त लगाता हूं कि यदि वास्तविक * 16' काम नहीं करता है, तो यह वास्तव में युगल को क्वाड को बढ़ावा नहीं देगा और इस प्रकार मूल समस्या को हल नहीं करेगा। –

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

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