क्या लॉग (बेस 2) फ़ंक्शन लिखने का कोई तरीका है?
C भाषा में 2 फ़ंक्शन हैं - >>
1. log
जो बेस ई है।
2. log10
आधार 10;
लेकिन मुझे इसकी गणना करने के लिए बेस 2.H की लॉग फ़ंक्शन की आवश्यकता है।
क्या लॉग (बेस 2) फ़ंक्शन लिखने का कोई तरीका है?
C भाषा में 2 फ़ंक्शन हैं - >>
1. log
जो बेस ई है।
2. log10
आधार 10;
लेकिन मुझे इसकी गणना करने के लिए बेस 2.H की लॉग फ़ंक्शन की आवश्यकता है।
जवाबों:
C99 है log2
(और साथ ही log2f
और log2l
नाव और लंबी डबल के लिए)।
यदि आप एक अभिन्न परिणाम की तलाश में हैं, तो आप केवल मूल्य में उच्चतम बिट सेट निर्धारित कर सकते हैं और इसकी स्थिति वापस कर सकते हैं।
Integer.highestOneBit(int)
विधि से ली गई ):i |= (i >> 1); i |= (i >> 2); i |= (i >> 4); i |= (i >> 8); i |= (i >> 16); return i - (i >>> 1);
while (i >>= 1) { ++l; }
i>>32
। लेकिन चूंकि जावा में केवल 32-बिट इनट्स हैं, यह ठीक है। C / C ++ के लिए इस पर विचार करने की आवश्यकता है।
#define M_LOG2E 1.44269504088896340736 // log2(e)
inline long double log2(const long double x){
return log(x) * M_LOG2E;
}
(गुणा भाग विभाजन से तेज हो सकता है)
जैसा कि http://en.wikipedia.org/wiki/Logarithm पर बताया गया है :
logb(x) = logk(x) / logk(b)
जिसका अर्थ है कि:
log2(x) = log10(x) / log10(2)
log()
कार्यान्वयन के लिए नहीं देखता है इसलिए वह ऐसा नहीं करेगा। मेरी गलती।
log10()
सी मानक में एक फ़ंक्शन परिभाषित है, इसलिए संकलक इसे "विशेष रूप से" का इलाज करने के लिए स्वतंत्र है, जिसमें परिणाम को शामिल करना शामिल है, जो मुझे लगता है कि @ जोहान्स का सुझाव था?
log10(2)
एक स्थिरांक के साथ 4.7 कम से कम प्रतिस्थापित करता है।
यदि आप इसे तेजी से बनाना चाहते हैं, तो आप बिट ट्विडलिंग हैक्स (केवल पूर्णांक 2) में लुकअप टेबल का उपयोग कर सकते हैं ।
uint32_t v; // find the log base 2 of 32-bit v
int r; // result goes here
static const int MultiplyDeBruijnBitPosition[32] =
{
0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};
v |= v >> 1; // first round down to one less than a power of 2
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];
इसके अलावा आप तरीकों builtin अपने compilers पर एक नज़र की तरह लेना चाहिए _BitScanReverse
जो कर सकता है तेजी से हो, क्योंकि यह पूरी तरह से हार्डवेयर की गणना कर सकते हैं।
संभावित डुप्लिकेट पर भी एक नज़र डालें कि C ++ में पूर्णांक लॉग 2 () कैसे करें?
uint16_t log2(uint32_t n) {//but truncated
if (n==0) throw ...
uint16_t logValue = -1;
while (n) {//
logValue++;
n >>= 1;
}
return logValue;
}
मूल रूप से टॉमालॉजिक के समान ही है ।
आपको math.h (C) या cmath (C ++) को शामिल करना होगा, इस बात का ध्यान रखें कि आपको उन गणित का अनुसरण करना होगा जो हम जानते हैं ... केवल संख्या> 0।
उदाहरण:
#include <iostream>
#include <cmath>
using namespace std;
int main(){
cout<<log2(number);
}
मुझे और अधिक सटीकता की आवश्यकता थी कि बस सबसे महत्वपूर्ण बिट की स्थिति, और मेरे द्वारा उपयोग किए जा रहे माइक्रोकंट्रोलर में कोई गणित पुस्तकालय नहीं था। मैंने पाया कि सकारात्मक पूर्णांक मान तर्क के लिए 2 ^ n मानों के बीच सिर्फ एक रैखिक सन्निकटन का उपयोग करने से अच्छी तरह से काम किया। यहाँ कोड है:
uint16_t approx_log_base_2_N_times_256(uint16_t n)
{
uint16_t msb_only = 0x8000;
uint16_t exp = 15;
if (n == 0)
return (-1);
while ((n & msb_only) == 0) {
msb_only >>= 1;
exp--;
}
return (((uint16_t)((((uint32_t) (n ^ msb_only)) << 8) / msb_only)) | (exp << 8));
}
मेरे मुख्य कार्यक्रम में, मुझे पूर्णांक परिणाम के साथ N * log2 (N) / 2 की गणना करने की आवश्यकता थी:
temp = (((uint32_t) N) * approx_log_base_2_N_times_256 / 512;
और सभी 16 बिट मान कभी भी 2% से अधिक नहीं थे
उपरोक्त सभी उत्तर सही हैं। नीचे दिए गए मेरा यह उत्तर मददगार हो सकता है अगर किसी को इसकी आवश्यकता हो। मैंने कई प्रश्नों में इस आवश्यकता को देखा है जिन्हें हम C का उपयोग करके हल कर रहे हैं।
log2 (x) = logy (x) / logy (2)
हालाँकि, यदि आप C भाषा का उपयोग कर रहे हैं और आप पूर्णांक में परिणाम चाहते हैं, तो आप निम्न का उपयोग कर सकते हैं:
int result = (int)(floor(log(x) / log(2))) + 1;
उम्मीद है की यह मदद करेगा।
उस्मान संगट ने जो किया, उसका बेहतर संस्करण
static inline uint64_t
log2(uint64_t n)
{
uint64_t val;
for (val = 0; n > 1; val++, n >>= 1);
return val;
}