x86_64

2017-08-23 73 views
6

पर फास्ट फ्लोटिंग-पॉइंट पावर 2 2.0 कुछ फ़्लोटिंग-पॉइंट डिग्री x पर लेने का कोई तेज़ तरीका है? मेरा मतलब है pow(2.0, x) से कुछ तेज़ और AVX2 के साथ वेक्टरेट्स को अच्छी तरह से क्या पसंद है।x86_64

पूर्णांक के लिए समकक्ष 1<<n है, लेकिन यह केवल n पूर्णांक के लिए काम करता है।

+1

बस एक त्वरित विचार, '1 << एन' और डबल करने के लिए कैसे करें। क्षमा करें अगर यह मूर्खतापूर्ण लगता है :-) – Malice

+0

मुझे संदेह है कि फ़्लोटिंग पॉइंट में '2 संचालित x' के लिए एक तेज तरीका है या नहीं। पूर्णांक संस्करण अपने स्टोर को पाउ (2, एक्स) की गति के तरीके का उपयोग करता है और मुझे संदेह है कि क्या आपको फ़्लोटिंग पॉइंट प्रस्तुतियों पर – Malice

+0

@ मालिस पर ऐसे फायदे मिलेंगे, समस्या यह है कि 'x' पूर्णांक नहीं है, यह फ़्लोटिंग- बिंदु। –

उत्तर

9

एक मानक std::exp2(double n)

गणना करता 2 दिया घात नहीं है n

यह संभव है कि exp2(x)pow(2.0, x) तुलना में तेजी से एक विशेष वातावरण में नहीं होगा है लेकिन यह सामान्य की तुलना में अधिक विशिष्ट है pow

+3

हाल ही में लिनक्स पर जहां ग्लिबैक में libmvec शामिल है, 'g ++ -Ofast'' std :: exp (x * std :: log (2)) vectorize का प्रबंधन करता है, लेकिन अजीब रूप से 'std :: exp2 (x)' नहीं है। –

1

पूर्णांक शक्तियों के लिए, आप std::ldexp उपयोग कर सकते हैं:

double x = std::ldexp(1.0, k); // 2 to the power of k 

यह 1<<k की तुलना में बेहतर और कास्टिंग के रूप में यह मध्यवर्ती अतिप्रवाह के लिए नहीं होगा है, और साथ ही नकारात्मक शक्तियों का समर्थन करता है।

+0

चुनौती 2 को एक फ्लोटिंग-पॉइंट पावर 'x' लेना है, जो एक पूर्णांक' के' नहीं है। –

+0

यदि 'k' एक पूर्णांक था और आपको आउट-ऑफ-रेंज की जांच करने की आवश्यकता नहीं है, तो आप एक आईईईई 754' डबल' में थोड़ा सा शिफ्ट और एक अतिरिक्त के साथ पक्षपातपूर्ण एक्सपोनेंट को मैन्युअल रूप से भरना चाहते हैं एक्सपोनेंट पूर्वाग्रह और एक ही ऑपरेशन के साथ मंटिसा सेट)। वह अच्छी तरह से स्वत: वेक्टरिज़ होगा। –

संबंधित मुद्दे