2009-04-16 10 views
29

मैं विजुअल सी ++ 2008 एक्सप्रेस का एक बिल्कुल नया इंस्टॉल उपयोग कर रहा हूं।लॉग 2 मेरे गणित में नहीं मिला है।

मैं एक प्रोग्राम को संकलित करने की कोशिश कर रहा हूं जो लॉग 2 फ़ंक्शन का उपयोग करता है, जो मैक पर ग्रहण का उपयोग करके पाया गया था, लेकिन यह विंडोज कंप्यूटर फ़ंक्शन नहीं ढूंढ सकता (त्रुटि C3861: 'log2': पहचानकर्ता नहीं मिला)।

जिस तरह से मैंने इसे समझ लिया, निर्देशिकाएं आईडीई के लिए विशिष्ट हैं, है ना? math.h मेरे माइक्रोसॉफ्ट एसडीके \ विंडोज \ v6.0A \ शामिल \ निर्देशिका में मौजूद नहीं है, लेकिन मुझे इस निर्देशिका में math.h मिला: माइक्रोसॉफ्ट विजुअल स्टूडियो 9.0 \ वीसी \ शामिल है। उस निर्देशिका में एक cmath भी है ...

लॉग 2 कहां है?

+0

बहुत बेहतर जवाब [यहां] (http://stackoverflow.com/questions/994593/how-to-do-an-integer-log2-in-c) – bobobobo

उत्तर

56
here से

:

प्रोटोटाइप: डबल log2 (डबल anumber);
हैडर फ़ाइल: math.h (सी) या cmath (C++)

वैकल्पिक रूप से here

#include <math.h> 
... 
// Calculates log2 of number. 
double Log2(double n) 
{ 
    // log(n)/log(2) is log2. 
    return log(n)/log(2); 
} 

दुर्भाग्य से माइक्रोसॉफ्ट does not provide it है जैसे कि यह अनुकरण।

+2

'लॉग (2.)' अस्पष्ट कॉल – jirkamat

+8

के बारे में शिकायत करने वाले संकलक से बचने के लिए आपको वास्तव में एक स्थिर डबल या प्रीकंप्यूटेड स्थिर (0) के रूप में लॉग (2) के मान को स्टोर करना चाहिए। 30102999566398119521373889472449) ताकि प्रत्येक बार – bobobobo

+5

लॉग (2) को एक अच्छा अनुकूलक द्वारा स्थिर (स्थिर) में दो बार कॉल नहीं किया जा सके। मैंने vc2008 में एक टेस्ट केस का उपयोग करके इसे सत्यापित कर लिया है और हाथ लिखित स्थिरांक का उपयोग न करने के लिए यह बेहतर अभ्यास है। यह अन्य रन-टाइम कार्यों के साथ संख्यात्मक स्थिरता सुनिश्चित करता है, न कि कुछ दशमलव एक समस्या होगी लेकिन वैसे भी। – Crog

9

log2() केवल सी 99 मानक में परिभाषित किया गया है, सी 9 0 मानक नहीं। माइक्रोसॉफ्ट विजुअल सी ++ पूरी तरह से सी 99 अनुरूप नहीं है (हेक, अस्तित्व में एक पूरी तरह से सी 99 अनुपालन कंपाइलर नहीं है, मेरा मानना ​​है - जीसीसी पूरी तरह से इसका समर्थन नहीं करता है), इसलिए log2() प्रदान करने की आवश्यकता नहीं है।

10

आप सख्ती से पूर्णांकों का log2 खोजने की कोशिश कर रहे हैं, कुछ बिटवाइज़ चोट नहीं कर सकते हैं:

#include <stdio.h> 

unsigned int log2(unsigned int x) 
{ 
    unsigned int ans = 0 ; 
    while(x>>=1) ans++; 
    return ans ; 
} 

int main() 
{ 
    // log(7) = 2 here, log(8)=3. 
    //for(int i = 0 ; i < 32 ; i++) 
    // printf("log_2(%d) = %d\n", i, log2(i)) ; 

    for(unsigned int i = 1 ; i <= (1<<30) ; i <<= 1) 
    printf("log_2(%d) = %d\n", i, log2(i)) ; 
} 
+2

बेशक यह काम करेगा लेकिन इसका प्रदर्शन लॉग 2 (एन) से भी बदतर है। लॉग 2 में निरंतर समय होता है और हमेशा तेज़ होता है। यह समाधान ओ (log2n) है। बड़ी संख्या में लॉग 2 के लिए लगभग 500% तेज है। – ruralcoder

+0

हां, यह प्रदर्शन और गुणवत्ता को नुकसान पहुंचा सकता है। अधिक कोड = बग के अधिक संभावित स्रोत। –

+0

@ruralcoder यह एक पूर्णांक के 'लॉग (बेस 2)' को खोजने का सबसे प्रभावी तरीका है। – bobobobo

0

log2 (x) = लॉग (एक्स) * लॉग (ङ):

#define _USE_MATH_DEFINES // needed to have definition of M_LOG2E 
#include <math.h> 

static inline double log2(double n) 
{ 
    return log(n) * M_LOG2E; 
} 

यदि आप Android के लिए log2 साथ संकलन मुद्दे हैं मामले में, log2 की तरह लगता है एंड्रॉयड-18 से शुरू होने वाले हेडर में उपलब्ध है :

#include <android/api-level.h> 
#if __ANDROID_API__ < 18 
static inline double log2(double n) 
{ 
    return log(n) * M_LOG2E; 
} 
#endif 
संबंधित मुद्दे