2010-05-31 11 views
48

मैं एक मुफ्त सी ++ फिक्स्ड पॉइंट लाइब्रेरी (मुख्य रूप से एम्बेडेड डिवाइसों के उपयोग के लिए, मनमाने ढंग से सटीक गणित के लिए उपयोग करने के लिए) की तलाश में हूं। असल में, आवश्यकताएं हैं:सी ++ निश्चित बिंदु पुस्तकालय?

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

कोई सुझाव?

+0

संभावित डुप्ली: http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-math –

+6

@ पावेल: धन्यवाद। मेरा सवाल यह नहीं है कि निश्चित बिंदु गणित को कैसे कार्यान्वित किया जाए। अगर मुझे करना था तो मैं इसे खुद लिखूंगा, लेकिन मैं सभी बॉयलरप्लेट कोड लिखने से बचने की कोशिश कर रहा हूं। यही कारण है कि मैं एक तैयार समाधान के लिए पूछ रहा हूँ। Additionaly, मुझे SO में अन्य समान पदों पर निश्चित-बिंदु गणित कार्यों के लिए कोई mentioing नहीं मिला। – uj2

+2

मैं गणित पुस्तकालयों "बॉयलरप्लेट" को नहीं बुलाऊंगा। –

उत्तर

-3

शायद आप जीएमपी या एमपीएफआर पुस्तकालयों को आजमा सकते हैं। मुझे पूरा यकीन है कि वे आपकी प्रदर्शन आवश्यकताओं को पूरा करेंगे, लेकिन शायद वे आपकी जरूरतों के लिए बहुत अधिक हैं और आप कुछ और हल्के वजन चाहते हैं। विवरण का दावा निश्चित बिंदु डेटा प्रकार और कुछ गणित कार्यों

MPFR library

+0

अच्छा पुस्तकालय, अच्छा सी ++ बाइंडिंग। लेकिन दोनों बड़े इंट्स, राशनल्स और बड़ी फ्लोट्स का समर्थन करते हैं: मुझे नहीं लगता कि या तो निश्चित बिंदु का समर्थन करें। –

+0

मेरा बुरा, मैंने गलती से सोचा कि आपका मतलब "फ़्लोटिंग" बिंदु है। मुझे भविष्य में प्रश्न को और सावधानीपूर्वक पढ़ना चाहिए। माफ़ कीजिये। – PeterK

-3

मैंने कभी SPUC उपयोग नहीं किया है, लेकिन: वैसे भी, यहाँ देखो:

GMP library

या यहाँ।

+2

मुझे साइट पर "निश्चित-चौड़ाई पूर्णांक" का उल्लेख दिखाई देता है, लेकिन निश्चित-बिंदु मान नहीं। क्या आप मुझे पुस्तकालय के निश्चित बिंदु भाग पर इंगित कर सकते हैं? –

+0

@ ब्रुक्समोस - वे वही बात हैं। निश्चित चौड़ाई का मतलब है कि आप दशमलव बिंदु का स्थान निर्दिष्ट कर सकते हैं, जो तब सभी गणित के माध्यम से उस निश्चित स्थिति में रहता है। – mtrw

+2

क्या आप इसके बारे में निश्चित हैं? मैं http://spuc.cvs.sourceforge.net/viewvc/spuc/spuc/generic/int_s.h?view=markup में उनके "निश्चित-चौड़ाई पूर्णांक" कार्यान्वयन के मूल को देख रहा हूं, और ऐसा लगता है कि दशमलव बिंदु के बाईं ओर विशिष्ट चौड़ाई वाले पूर्णांक के कार्यान्वयन (इसलिए "लंबे" अंतर्निहित प्रकार में शेष बिट्स को केवल मास्क आउट किया जाता है), निश्चित बिंदु संख्याओं के नहीं। कहने का मुद्दा यह है कि गुणा पर कोई स्केलिंग नहीं है, क्योंकि मैं उम्मीद करता हूं कि दशमलव बिंदु संख्या के दाईं ओर नहीं था। –

6

वहाँ एक खुला स्रोत तय हो गई है बिंदु गणित पुस्तकालय परियोजना नीचे दिए गए लिंक का पालन करके पाया जा सकता है:

यह सी ++ उपयोगकर्ताओं के लिए सी ++ कक्षा इंटरफेस के साथ एक सी स्थिर पुस्तकालय है, यह निम्न कार्यक्षमता लागू करता है: ट्रिग। कार्य sin, cos, टैन, असिन, acos, atan, atan2 संतृप्त अंकगणित: साद, ssub, smul, sdiv अन्य कार्य: sqrt, exp

यह केवल 16.16 fixed-point datatype का समर्थन करता है।

यह एक सक्रिय रूप से विकसित ओपन-सोर्स प्रोजेक्ट है (रुचि रखने वाले डेवलपर्स की तलाश में)।

+3

यह केवल Q16.16 का समर्थन क्यों करता है? तो अधिकतम मूल्य 65536 है। कई मामलों के लिए पर्याप्त नहीं है। – javapowered

+0

16.16 सबसे आम है, यदि आप प्रदर्शन कारणों के लिए निश्चित बिंदु का उपयोग कर रहे हैं (मुझे 64-बिट माइक्रोकंट्रोलर के बारे में पता नहीं है) तो आप 32-बिट्स पर कभी भी उपयोग करने की संभावना नहीं रखते हैं। कुछ अन्य मामूली प्रारूप जैसे 24.8, या 8 हैं।24 और मुझे लगता है कि बड़ी संख्या में अजीब स्वरूप हैं, लेकिन यदि आप उन लोगों की आवश्यकता के चरण में हैं तो शायद आपको हाथ से कोड लिखना होगा (जैसे मैं सामान्य रूप से करता हूं)। – flatmush

+0

मृत यूआरएल ...... – Cuadue

1

मुझे एक अच्छा छोटा सी ++ हेडर मिला। आप इसे sweet::Fixed के तहत पा सकते हैं। बस typedef मीठा परिभाषित :: फिक्स्ड MyFloat; और इसे किसी अन्य फ्लोट वैल्यू की तरह इस्तेमाल करें। या इसे बाद में जो भी फ्लोट प्रकार आप चाहते हैं उसका आदान-प्रदान करें। कक्षा में दो 64 बिट मान हैं। पूर्णांक भाग के लिए और अंश के लिए एक।

मैं एक छोटे से नियत बिन्दु C++ sweet.hpp में 11 वर्ग हैडर impl fixed.hpp कहा जाता है। यह दोनों भागों के लिए 32 बिट का उपयोग करता है।

typedef float MyFloat;   // This will feel the same 
typedef sweet::Fixed MyFloat; // like this 
5

सी ++ में निश्चित बिंदु प्रतिनिधित्व को संभालने के बारे में निम्नलिखित दो अच्छे कार्यान्वयन देखें (कोई बाहरी libs आवश्यक नहीं है)।

  1. Fixed-Point-Class पीटर श्रेगल द्वारा। यह अतिरिक्त, गुणा, और विभाजन जैसे बुनियादी संचालन को कुशलतापूर्वक लागू करता है।

    कोड उदाहरण:

    #include <fixed_point.h> 
    using namespace fpml; 
    
    main() 
    { 
        fixed_point<int, 16> a = 256; 
        fixed_point<int, 16> b = sqrt(a); 
    } 
    
  2. Implementing Fixed-Point Numbers in C++ Khuram अली ने।

    https://github.com/mbedded-ninja/MFixedPoint

    यह 32-बिट और 64-बिट निश्चित बिन्दु संख्या (एक मनमाना भागफल के साथ) का समर्थन करता है और दोनों तेजी से:

1

यहाँ GitHub पर एक खुला स्रोत तय सूत्री पुस्तकालय है (सब कुछ templated है, लेकिन थोड़ा और मैनुअल) और धीमी निश्चित बिंदु संख्या (अधिक स्वचालित, लेकिन धीमी)।

यह एम्बेडेड प्लेटफॉर्म की ओर तैयार है, हालांकि मैंने इसे बिना किसी समस्या के माइक्रोकंट्रोलर और लिनक्स दोनों पर उपयोग किया है।