2013-10-11 6 views
5

का उपयोग करके परिणाम को गोल करना क्या एक खोल स्क्रिप्ट में डीसी का उपयोग करके स्टैक के शीर्ष को गोल करना संभव है? यदि हां परिणाम नीचे और नीचे गोल करने के लिए आदेश हैं?डीसी (डेस्क कैलकुलेटर)

धन्यवाद दोस्तों!

उत्तर

6

dc manual का कहना है:

अधिकांश अंकगणितीय आपरेशनों "सटीक मूल्य", आप k कमांड के साथ सेट कर सकते हैं जो से प्रभावित हैं। डिफ़ॉल्ट परिशुद्धता मान शून्य है ...

/ दो मानों को रोकता है, दूसरे को पॉप किए गए दूसरे को विभाजित करता है, और परिणाम को धक्का देता है। अंश अंकों की संख्या परिशुद्धता मान द्वारा निर्दिष्ट है।

तो तुम काट-छांट कर सकते हैं (शून्य की ओर दौर) 0k1/, या बस 1/ का उपयोग कर यदि आप जानते हैं कि परिशुद्धता 0 है, जो यह डिफ़ॉल्ट रूप से है। उदाहरण के लिए:

$ dc -e '12.9 1/ p' 
12 
$ dc -e '_12.9 1/ p' 
-12 

अन्य प्रकार के राउंडिंग अधिक कठिन हैं। रजिस्टर a में

  1. [_1*]sa भंडार आदेश _1* (-1 से गुणा): निकटतम पूर्णांक को दौर के लिए, आप उदाहरण के लिए [_1*]sad.5r0>a+0k1/ उपयोग कर सकते हैं,:

    $ dc -e '12.9 [_1*]sad.5r0>a+0k1/ p' 
    13 
    $ dc -e '_12.9 [_1*]sad.5r0>a+0k1/ p' 
    -13 
    

    एक त्वरित विवरण।

  2. d स्टैक के शीर्ष पर मूल्य को डुप्लिकेट करता है (जिस मूल्य को हम गोल करना चाहते हैं, उसे v पर कॉल करें)।
  3. .5r 0.5 धक्का और फिर शीर्ष दो मानों अदला-बदली, तो ढेर अब वी 0.5 वी है।
  4. 0>a रजिस्टर में आदेश निष्पादित करता a अगर 0>वी (है कि, अगर वी नकारात्मक है)। ढेर 0.5 वी अगर वी सकारात्मक है, या -0.5 वीअगर वी नकारात्मक है अब है।
  5. + शीर्ष दो मान जोड़ता और धक्का वी + 0.5 यदि वी सकारात्मक है, या वी - 0.5 यदि वी नकारात्मक है।
  6. 0k1/ उपरोक्त वर्णित अनुसार truncates।

आप जानते हैं कि आप जिस नंबर पर गोलाई कर रहे हैं गैर नकारात्मक है, तो आप सिर्फ .5+0k1/ उपयोग कर सकते हैं; और यदि आप अतिरिक्त रूप से परिशुद्धता जानते हैं तोका उपयोग कर सकते हैं।

के नीचे, [dX[1-]sa0<a]sad0>a0k1/ का उपयोग करें।

के ऊपर, [dX[1+]sa0<a]sad0<a0k1/ का उपयोग करें।

ये सभी सुझाव a रजिस्टर का उपयोग करते हैं, इसलिए आपको उन्हें अपने वास्तविक कार्यक्रम में समायोजित करने की आवश्यकता हो सकती है। [_1*]sa[d1r0>a+]sbd0k1/2%0!=b1/:

1

बिल्डिंग गैरेथ के जवाब पर, बैंकर का गोलाई (अर्थात निकटतम भी पूर्णांक तक गोल) के लिए निम्नलिखित का उपयोग करें।

नोट यह अतिरिक्त रजिस्टर, बी का उपयोग करता है।

कि थोड़ा घने है, तो चलो इसे तोड़ने को नीचा दिखाया:

[_1*]sa   #1- Assign a macro "$input *= -1" to register 'a' 
[d1r0>a+]sb  #2- Assign a macro "if($input<0){$input -= 1} else{$input += 1}" 
       #  to register 'b' 
d    #3- Duplicate the input value; the duplicate will be used 
       #  to decide if the input is odd or even. 
0k    #4- Set precision to 0; this makes the 1/ operation truncate 
       #  all digits to the right of the decimal point. 
1/    #5- Truncate those decimal places on our duplicate input. 
2%    #6- Modulo 2; if we get 0, it was even, otherwise it's odd. 
       #  Note this consumes the duplicate from line #3. 
0!=b   #7- If it was odd, run the macro in register 'b'. This adds +/-1 
       #  to the input, respectively if it's positive or negative. 
1/    #8- Truncate decimal places; if the input was odd we're now 
       #  at floor($input+1) for positive or floor($input-1) 
       #  for negative; if it was even we're at floor($input). 
संबंधित मुद्दे