मुझे सी ++ में लॉग 2 (फ्लोट एक्स) फ़ंक्शन का एक बहुत तेज़ कार्यान्वयन चाहिए।फास्ट लॉग 2 (फ्लोट एक्स) कार्यान्वयन सी ++
मैं एक बहुत ही दिलचस्प कार्यान्वयन पाया (और बहुत तेज!)
#include <intrin.h>
inline unsigned long log2(int x)
{
unsigned long y;
_BitScanReverse(&y, x);
return y;
}
लेकिन इस समारोह केवल इनपुट में पूर्णांक मूल्यों के लिए अच्छा है।
प्रश्न: वहाँ किसी भी तरह से डबल प्रकार इनपुट चर को यह समारोह कन्वर्ट करने के लिए है?
युपीडी:
मैं इस कार्यान्वयन पाया:
typedef unsigned long uint32;
typedef long int32;
static inline int32 ilog2(float x)
{
uint32 ix = (uint32&)x;
uint32 exp = (ix >> 23) & 0xFF;
int32 log2 = int32(exp) - 127;
return log2;
}
जो पिछले उदाहरण की तुलना में बहुत तेजी से होता है, लेकिन उत्पादन अहस्ताक्षरित प्रकार है।
क्या यह फ़ंक्शन डबल प्रकार वापस करना संभव है?
अग्रिम धन्यवाद!
यह एक बहुत ही अजीब आवश्यकता है, क्योंकि लघुगणक आधार 2 के साथ शायद ही कभी कुछ के लिए बिट्स की संख्या की गणना के अलावा कुछ के लिए प्रयोग किया जाता है और जब आप बिट्स गिनते हैं तो आप पूर्णांक के साथ काम करते हैं। तो आपको इसके लिए क्या चाहिए? –
@JanHudec: मेरे सिर के ऊपर से, लॉगरिदम के दो सामान्य उपयोग सिग्नल की एन्ट्रॉपी की गणना करेंगे, और बहुत बड़ी संख्याओं पर अंकगणित करेंगे जो अन्यथा ओवरफ्लो होगा। –
@ माइकसेमोर: सिग्नल के लिए, पूर्णांक की बजाय फ़्लोटिंग पॉइंट होना दुर्लभ है। बड़ी संख्या में अंकगणितीय के लिए, आपको आधार 2 की आवश्यकता नहीं होगी और संभवतः प्राकृतिक लघुगणक का उपयोग करें क्योंकि गणित आमतौर पर इसके साथ व्यक्त किया जाता है। –