2011-09-27 13 views
7

में गोलाकार गणना, मैं कोबोल में गणना समारोह में गोलाकार हूं।कोबोल

घोषणा:

VAR-A  PIC S9(9)V99 COMP-3. 
VAR-B  PIC S9(9)V9(6) COMP-3. 

प्रक्रिया।

MOVE +12.08 TO VAR-A. 
MOVE +6.181657 TO VAR-B. 


COMPUTE VAR-A ROUNDED = VAR-A + VAR-B. 

वीएआर-ए का परिणाम 18.27 या 18.26 हो जाएगा? कंप्यूटिंग पर कोबोल क्या करेगा? क्या यह VAR-B में निर्दिष्ट दशमलव स्थानों पर पहले VAR-B को गोल करेगा या फिर cobol 2 चर जोड़ देगा, फिर उन्हें VAR-A में निर्दिष्ट दशमलव स्थानों तक ले जाएगा?

किसी भी मदद की सराहना की जाएगी।

@NealB,

कैसे इस उदाहरण के बारे में:

घोषणा:

01 VAR-ARRAY OCCURS 22 TIMES. 
    03 VAR-A  PIC S9(9)V9(6) COMP-3. 


01 VAR-B  PIC S9(9)V99 COMP-3. 

वीएआर-ए मान लें कि एक सरणी है, और के बाद अपने मूल्य हैं:

VAR-A(01) = 123.164612 
VAR-A(02) = 12.07865 
VAR-A(03) = 6.181657 
VAR-A(04) = 1.744353 
VAR-A(05) = 6.118182 
VAR-A(06) = 1.744353 
VAR-A(07) = 6.158715 
VAR-A(08) = 1.744353 
VAR-A(09) = 6.194759 
VAR-A(10) = 1.744353 
VAR-A(11) = 3.037896 
VAR-A(12) = 1.743852 
VAR-A(13) = 6.14653 
VAR-A(14) = 1.744353 
VAR-A(15) = 0.000377 
VAR-A(16) = 1.743852 
VAR-A(17) = 6.144363 
VAR-A(18) = 1.743852 
VAR-A(19) = 0.007649 
VAR-A(20) = 1.744353 
VAR-A(21) = 0.000377 
VAR-A(22) = 1.744353 

VAR-B का मान है:

VAR-B = 405.25 

प्रक्रिया:

PERFORM VAR-IDX FROM 1 BY 1 UNTIL VAR-IDX > 22 
    COMPUTE VAR-B ROUNDED = VAR-B + VAR-A(VAR-IDX) 
END-PERFORM. 

मैं क्यों गणना के बाद एक परिणाम के रूप वीएआर-बी के लिए 597.87 मिलता है?

+0

अजीब जवाब ... मैं 597.88 मिल , जो मुझे विश्वास है सही है। आप किस कॉबोल कंपाइलर का उपयोग कर रहे हैं? – NealB

उत्तर

5

मेरा मानना ​​है कि डिफ़ॉल्ट COBOL गोल करने का व्यवहार है: शून्य से निकटतम।

COMPUTE VAR-A ROUNDED = VAR-A + VAR-B 

VAR-A में परिणाम 18.26

गोलाई होने के बाद अभिव्यक्ति का मूल्यांकन किया गया है जिसमें चाहिए। एक और दिलचस्प उदाहरण हो सकता है:

01 VAR-A  PIC S9(9)V99 COMP-3.    
01 VAR-B  PIC S9(9)V9(6) COMP-3.    
01 VAR-C  PIC S9(9)V9(6) COMP-3.    

MOVE +12.08 TO VAR-A.       
MOVE +06.182000 TO VAR-B.      
MOVE +00.004000 TO VAR-C.      
COMPUTE VAR-A ROUNDED = VAR-A + VAR-B + VAR-C. 

परिणाम 18.27 है। अतिरिक्त करने से पहले VAR-B और VAR-C से 2 दशमलव स्थानों पर गोल करना 18.26 हो गया था क्योंकि वीएआर-बी राउंड 6.18 और वीएआर-सी राउंड 0.00 तक पहुंच गए थे। नतीजा वास्तव में 18.27 है इसलिए अभिव्यक्ति के मूल्यांकन के बाद गोल होता है।

को संपादित सवाल

सुंदर नहीं उत्पादन उत्तर, लेकिन यह कैसे मेरे गणना z के लिए आईबीएम उद्यम कोबोल का उपयोग कर चला जाता है/ओएस

 
VAR-IDX = 01 VAR-B = +405.25 VAR-A = +123.164612 VAR-B + VAR-A = +528.41 
VAR-IDX = 02 VAR-B = +528.41 VAR-A = +012.078650 VAR-B + VAR-A = +540.49 
VAR-IDX = 03 VAR-B = +540.49 VAR-A = +006.181657 VAR-B + VAR-A = +546.67 
VAR-IDX = 04 VAR-B = +546.67 VAR-A = +001.744353 VAR-B + VAR-A = +548.41 
VAR-IDX = 05 VAR-B = +548.41 VAR-A = +006.118182 VAR-B + VAR-A = +554.53 
VAR-IDX = 06 VAR-B = +554.53 VAR-A = +001.744353 VAR-B + VAR-A = +556.27 
VAR-IDX = 07 VAR-B = +556.27 VAR-A = +006.158715 VAR-B + VAR-A = +562.43 
VAR-IDX = 08 VAR-B = +562.43 VAR-A = +001.744353 VAR-B + VAR-A = +564.17 
VAR-IDX = 09 VAR-B = +564.17 VAR-A = +006.194759 VAR-B + VAR-A = +570.36 
VAR-IDX = 10 VAR-B = +570.36 VAR-A = +001.744353 VAR-B + VAR-A = +572.10 
VAR-IDX = 11 VAR-B = +572.10 VAR-A = +003.037896 VAR-B + VAR-A = +575.14 
VAR-IDX = 12 VAR-B = +575.14 VAR-A = +001.743852 VAR-B + VAR-A = +576.88 
VAR-IDX = 13 VAR-B = +576.88 VAR-A = +006.146530 VAR-B + VAR-A = +583.03 
VAR-IDX = 14 VAR-B = +583.03 VAR-A = +001.744353 VAR-B + VAR-A = +584.77 
VAR-IDX = 15 VAR-B = +584.77 VAR-A = +000.000377 VAR-B + VAR-A = +584.77 
VAR-IDX = 16 VAR-B = +584.77 VAR-A = +001.743852 VAR-B + VAR-A = +586.51 
VAR-IDX = 17 VAR-B = +586.51 VAR-A = +006.144363 VAR-B + VAR-A = +592.65 
VAR-IDX = 18 VAR-B = +592.65 VAR-A = +001.743852 VAR-B + VAR-A = +594.39 
VAR-IDX = 19 VAR-B = +594.39 VAR-A = +000.007649 VAR-B + VAR-A = +594.40 
VAR-IDX = 20 VAR-B = +594.40 VAR-A = +001.744353 VAR-B + VAR-A = +596.14 
VAR-IDX = 21 VAR-B = +596.14 VAR-A = +000.000377 VAR-B + VAR-A = +596.14 
VAR-IDX = 22 VAR-B = +596.14 VAR-A = +001.744353 VAR-B + VAR-A = +597.88 
FINAL RESULT = +597.88            
1

यह मध्यवर्ती दौर और अंतिम दौर सेट पर निर्भर करता है।

अधिक जानकारी के लिए इस देखें:

कोबोल अंकगणितीय बयान और मूल्यांकन की प्रक्रिया में विभिन्न बिंदुओं पर भाव में गोलाई को निर्दिष्ट करने की क्षमता प्रदान करता है

D.13a पूर्णांकन और मूल्यों को प्राप्त करने में संग्रहीत करने के लिए तैयार कर रहे हैं के रूप में डेटा आइटम

• से दूर-शून्य:

इस मानक के द्वारा समर्थित गोलाई के आठ विभिन्न रूपों रहे हैं गोलाई बड़ा परिमाण के निकटतम मूल्य है।

• निकटतम-दूर-से-शून्य: राउंडिंग निकटतम मूल्य पर है। यदि दो मान समान रूप से निकट हैं, तो बड़े परिमाण के साथ मूल्य चुना जाता है। यह मोड ऐतिहासिक रूप से मानक COBOL के पिछले संस्करणों में ROUNDED खंड से जुड़ा हुआ है।

• निकटतम-भीन: गोल निकटतम मूल्य के लिए है। यदि दो मान समान रूप से निकट हैं, तो जिस मूल्य का सही अंक भी चुना गया है। इस मोड को कभी-कभी "बैंकर राउंडिंग" कहा जाता है।

• निकटतम-टॉरवर्ड-शून्य: राउंडिंग निकटतम मूल्य पर है। यदि दो मान समान रूप से निकट हैं, तो छोटे परिमाण के साथ मूल्य चुना जाता है।

• प्रतिबंधित: चूंकि मूल्य वांछित प्रारूप में बिल्कुल प्रदर्शित नहीं किया जा सकता है, इसलिए ईसी-SIZE-ट्रंकेशन स्थिति मौजूद है और ऑपरेशन के परिणाम अपरिभाषित हैं।

• टॉवर-ग्रेटर: गोलिंग निकटतम मूल्य की ओर है जिसका बीजगणितीय मूल्य बड़ा है।

• टावर्ड-लेजर: गोलाकार निकटतम मूल्य की ओर है जिसका बीजगणितीय मूल्य छोटा है।

• ट्रंकेशन: गोलाकार निकटतम मूल्य है जिसका परिमाण छोटा है। इस मोड को ऐतिहासिक रूप से ROUNDED क्लॉज की अनुपस्थिति के साथ-साथ पूर्व कोबोल मानक में मध्यवर्ती परिणामों के गठन के लिए जोड़ा गया है।

प्रोग्रामर निर्दिष्ट कर सकता है कि जब वे घुमावदार खंड के माध्यम से डेटा आइटम प्राप्त करने में संग्रहीत होते हैं तो व्यक्तिगत मध्यवर्ती मान कैसे गोल किए जाते हैं; पहचानने के लिए गोल करने का एक डिफ़ॉल्ट तरीका चुन सकते हैं जब ROUNDED क्लॉज पहचान प्राप्त करने के विकल्प अनुच्छेद के डिफ़ॉल्ट अनुच्छेद मोड खंड के माध्यम से प्राप्त डेटा आइटम पर कोई और योग्यता के साथ प्रकट होता है; और यह निर्दिष्ट कर सकता है कि इंटरमीडिएट फॉर्मों के लिए और मध्यवर्ती रूपों से अंकगणितीय परिचालन और रूपांतरण कैसे इंटरमीडिएट राउंडिंग क्लॉज के माध्यम से गोल किए जाते हैं।

D.13a.1 मध्यवर्ती गोलाई

मध्यवर्ती राउंडिंग लागू होता है जब डेटा आइटम अंकगणितीय संचालन या अंकगणितीय अभिव्यक्ति में शामिल करने के लिए प्राप्त किए गए हैं, और अंकगणितीय ऑपरेटर के निष्पादन के दौरान एक मध्यवर्ती परिणाम उपज।

पिछले मानक में, मानक अंकगणितीय में गुणा और विभाजन के लिए, निष्पक्ष परिणामों के लिए गोल करने का डिफ़ॉल्ट तरीका 32 महत्वपूर्ण अंकों के लिए छंटनी थी। यह डिफ़ॉल्ट इस मानक में अपरिवर्तित है, और मानक-बाइनरी और मानक-दशमलव अंकगणितीय के लिए भी डिफ़ॉल्ट है।

जब मध्यवर्ती मूल्य को उचित मध्यवर्ती प्रारूप में बिल्कुल प्रदर्शित किया जा सकता है, तो सटीक मान का उपयोग किया जाता है।

घटना में मूल्य ठीक वैसे ही प्रदर्शित नहीं किया जा सकता, उपयोगकर्ता भी अब अंकगणितीय आपरेशनों के लिए गोलाई की और करने के लिए और विकल्पों में से वैकल्पिक INTERMEDIATE गोलाई खंड के माध्यम से अंकगणितीय आपरेशनों में इस्तेमाल मध्यवर्ती रूप से रूपांतरण के लिए अन्य साधनों निर्दिष्ट कर सकता है पहचान विभाग का अनुच्छेद।

विशेष रूप से, निम्न विकल्प उपलब्ध हैं:

• INTERMEDIATE गोलाई निकटतम से दूर-शून्य • INTERMEDIATE गोलाई निकटतम-भी • INTERMEDIATE गोलाई निषिद्ध है • INTERMEDIATE गोलाई है है ट्रंकेशन

है

जिसके लिए उपखंड विवरण D.13a, Rounding में पाए जाते हैं।

यदि इंटरमीडिएट राउंडिंग क्लॉज निर्दिष्ट नहीं है, तो इंटरमीडिएट राउंडिंग ट्रांज़ेशन माना जाता है। यह पिछले मानकों से अपरिवर्तित है।

D.13a.2 अंतिम गोलाई (गोल खंड)

अंतिम राउंडिंग से पहले, अभिव्यक्ति या बयान के अंतिम परिणाम के गठन के लिए लागू होता है बयान या अभिव्यक्ति के मूल्यांकन के पूरा होने पर, तुरंत परिणाम गंतव्य में रखा गया है। गोल करने का यह रूप वह है जो राउंडेड क्लॉज से जुड़ा हुआ है।

पिछले कोबोल मानकों में, "अंतिम" राउंडिंग के केवल दो तरीकों को प्रदान किया गया था: छोटे परिमाण (घुमावदार, घुमावदार खंड की अनुपस्थिति से संकेतित) की तरफ गोल करना; और निकटतम मूल्यों के लिए घूमते हुए, और यदि दो मान समान रूप से पास थे, तो बड़े आयाम के साथ मान चुनें (राउंड किए गए खंड की उपस्थिति से संकेतित)।

गोल खंड गोलाई के आठ मोड (दो पहले से उपलब्ध सहित) में से किसी का स्पष्ट चयन अनुमति देने के लिए बढ़ाया गया है:

• गोल मोड से दूर-शून्य • गोल विधा है निकटतम-दूर है -से-शून्य • गोल मोड निकटतम-भी • गोल मोड निकटतम -के प्रति-शून्य • गोल मोड निषिद्ध है • गोल मोड है की ओर-ग्रेटर • गोल मोड प्रति-में कम • गोल मोड है ट्रंकेशन

यदि किसी दिए गए परिणाम के लिए ROUNDED क्लॉज मौजूद नहीं है, तो घुमावदार मोड के नियम ट्रांज़ेक्शन लागू होते हैं।

पहचान परिभाषा के विकल्प पैराग्राफ में वैकल्पिक डिफॉल्ट राउंडेड मोड खंड उपयोगकर्ता को किसी भी ऑपरेशन के लिए गोलाकार मोड निर्दिष्ट करने की अनुमति देने के लिए प्रदान किया जाता है जिसके लिए माउस के बिना ROUNDED क्लॉज दिखाई देता है।
डिफ़ॉल्ट गोल मोड खंड इन रूपों में से कोई भी हो सकता है:

• डिफ़ॉल्ट गोल मोड से दूर-शून्य है • डिफ़ॉल्ट गोल मोड निकटतम से दूर-शून्य • डिफ़ॉल्ट गोल विधा है निकटतम-सम है • डिफ़ॉल्ट गोल विधा है निकटतम -के प्रति-शून्य • डिफ़ॉल्ट गोल मोड निषिद्ध है • डिफ़ॉल्ट गोल मोड की ओर-ग्रेटर • प्रति-में कम • डिफ़ॉल्ट गोल मोड जिसके लिए ट्रंकेशन

डिफ़ॉल्ट गोल विधा है डिफॉल्ट रोड मोड के उप-खंड खंड ए है डी .13 ए, राउंडिंग में वर्णित है।

यदि कार्यक्रम में डिफॉल्ट राउंड मोड मोड दिखाई नहीं देता है, तो मोड के बिना घुमावदार खंड का प्रभाव उप-खंड है जैसे कि घुमावदार मोड शून्य से पहले कहीं भी निर्दिष्ट किया गया था। यह समान COBOL मानकों में उपलब्ध समान कार्यक्षमता प्रदान करता है।

यदि डिफॉल्ट घुमावदार मोड खंड दिखाई देता है, तो मोड के बिना घुमावदार खंड है उपखंड को माना जाता है कि उन्हें डिफॉल्ट रोड मोड में निर्दिष्ट राउंडिंग मोड के साथ निर्दिष्ट किया गया था।

+0

सुपर फास्ट उत्तर के लिए धन्यवाद पैट्रिक। अगर मैं गलत हूं तो मुझे सही करें, ऊपर वर्णित नमूना अंतिम दौर का उपयोग कर रहा है। और चूंकि मैंने डिफॉल्ट रोड मोड निर्दिष्ट नहीं किया है, इसलिए राउंडिंग मोड घुमावदार मोड शून्य से दूर है। क्या cobol किया है कि यह चर वैरिएबल जोड़ दिया और इसे गंतव्य चर में रखने से पहले मूल्य बंद कर दिया। जिसका अर्थ यह भी है कि वीएआर-ए का मूल्य +18.26 होगा? – Grekoz

+0

उपर्युक्त दिखता है जैसे इसे कोबोल के लिए अगले ड्राफ्ट मानक से हटा लिया गया था। मुझे नहीं लगता कि कई वाणिज्यिक COBOL संकलक अभी तक इसका समर्थन करते हैं। तब तक मेरा मानना ​​है कि अधिकांश द्वारा नियोजित डिफ़ॉल्ट राउंडिंग मोड है: शून्य से निकटतम। – NealB

+0

हां नीलब जो सही है। –

-1
IDENTIFICATION DIVISION. 
PROGRAM-ID. HELLO. 
DATA DIVISION. 
WORKING-STORAGE SECTION. 

01 VAR_NUM PIC 9(3)V9(02). 
01 VAR_RESULT PIC 9(3). 


PROCEDURE DIVISION. 
    MOVE 256.50 TO VAR_NUM. 
    COMPUTE VAR_NUM ROUNDED = VAR_NUM/100. 
    MULTIPLY 100 BY VAR_NUM 
    MOVE VAR_NUM TO VAR_RESULT. 
    DISPLAY "Result : " VAR_RESULT. 

STOP RUN. 
+0

यह उत्तर प्रश्न के साथ कुछ लेना देना नहीं है, आपने इसे एक और उत्तर के रूप में अपरिवर्तित पोस्ट किया है। कोड बेकार है। यदि कोई सवाल ऐसा करना चाहता था, तो जवाब 'पूर्ण VAR-RESULT ROUNDED = VAR-NUM' होगा। नहीं 'DIVIDE', नहीं' बहुतायत 'और कोई' MOVE'। कृपया इन उत्तरों को हटाने पर विचार करें। –

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