2010-07-23 11 views
5

मैं सिर्फ लिस्प जानने के लिए शुरू कर रहा हूँ और सोच रहा था अंक के बहुत सारे के साथ एक दशमलव संख्या के रूप में एक तर्कसंगत प्रदर्शित करने के लिए कैसे।कैसे लिस्प में अंकों की लंबी सूची के रूप में परिमेय प्रदर्शित करने के लिए?

यदि मैं (फ्लोट एक्स) का उपयोग करता हूं, जहां x एक तर्कसंगत है तो यह लगभग 8 अंकों या उससे भी अधिक प्रदर्शित करता है। लेकिन मैं सैकड़ों अंकों को प्रदर्शित करना चाहता हूं।

उत्तर

2

आपको मूल रूप से लंबे विभाजन को करने और अंकों की गणना करने के लिए एक एल्गोरिदम लागू करना होगा। कोई देशी डेटाप्रकार दशमलव अंक के सैकड़ों धारण करने में सक्षम है।

2

आप सामान्य लिस्प के कार्यान्वयन, सीएलआईएसपी का उपयोग कर सकते हैं। एक विस्तार के रूप में यह सेटटेबल परिशुद्धता के साथ फ्लोट प्रदान करता है। देखें: http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd

मैक्सिमा और एक्सीम जैसे सिस्टम भी हैं जो आम लिस्प के शीर्ष पर चलते हैं। ये उच्च परिशुद्धता वास्तविकताओं के साथ भी गणना कर सकते हैं।

सामान्य लिस्प मानक हालांकि यह प्रदान नहीं करता है।

+0

एक अन्य लोकप्रिय कार्यान्वयन:: यहाँ मेरा प्रस्ताव है डेव गिलेस्पी का कैल्क लागू करता elisp में मनमाने ढंग से परिशुद्धता फ्लोटिंग प्वाइंट (जो अपने आप भी bigints नहीं है!)। – Ken

1

ऐसे कार्यान्वयन हो सकते हैं जिन पर आप (format nil "~,100F" x) चाहते हैं जो आप चाहते हैं। लेकिन सबसे एक नाव को यह पहले धर्मान्तरित पर है, तो अंक की गणना करता है, जो सटीक खो देता है।

यह अपने स्वयं के कार्यक्रम भी मुश्किल नहीं है। विचार करने से पहले और अलग से पूर्णांक के रूप में दशमलव बिंदु के बाद भागों गणना करने के लिए है।

(defun number->string-with-fixed-decimal-places (x width &optional stream) 
    "Print an approximation of <x> with <width> digits after the decimal point." 
    (multiple-value-bind (int dec) (truncate x) 
    (let ((dec-shifted (truncate (* (abs dec) (expt 10 width))))) 
     (format stream "~d.~v,vd" int width #\0 dec-shifted)))) 
संबंधित मुद्दे