वहाँ एक तेजी से साइन समारोह है?


25

मैं जनरेशन 3 डी परलिन शोर पर काम कर रहा हूँ। सी # मैथ लाइब्रेरी को लगता है कि मुझे इसके लिए ज़रूरत से ज़्यादा ज़रूरत है क्योंकि इसके अधिकांश कार्यों में डबल पेरीज़ का उपयोग होता है। मैं शोर उत्पन्न करने के लिए कई स्थानों पर Math.Sin () का उपयोग करता हूं। क्या किसी को तेज साइन फ़ंक्शन का पता है?

जवाबों:


32

आप साइन फ़ंक्शन के मान को अनुत्पादक करने के लिए एक पैराबोला का उपयोग कर सकते हैं। यह ठीक -pi / 2 और pi / 2 जो आम तौर पर अन्य फास्ट के आधार पर अनुमान के साथ ऐसा नहीं है पर जड़ों होने का लाभ दिया है टेलर श्रेणी या MaclaurinSeries

public float Sin(float x)
{
    const float B = 4 / PI;
    const float C = -4 / (PI*PI);

    return -(B * x + C * x * ((x < 0) ? -x : x));
} 

यहाँ वास्तविक साइन फ़ंक्शन की तुलना है:

वैकल्पिक शब्द


3
यह वास्तव में एक महान समाधान है। यहाँ devmaster.net का एक उत्कृष्ट लेख है जो बताता है कि यह क्यों काम करता है और कुछ कार्यान्वयन विवरण देता है: devmaster.net/forums/showthread.php?t=5784
reverbb

मुझे C # के बारे में पता नहीं है, लेकिन अधिकांश C वातावरणों में एब्स () फ़ंक्शन संभवतः एक शाखा ((?: ऑपरेटर), से अनुकूलित होने पर तेजी से होगा।

3
मैंने Math.Abs ​​() कॉल को हटा दिया क्योंकि मुझे लगा कि यह कोड Xbox 360 या Windows Phone 7 पर चल सकता है। Xbox 360 पर JIT कंपाइलर कुछ भी इनलाइन नहीं करता है। Math.Abs ​​() के लिए एक कॉल वास्तव में अधिक महंगा है।
zfedoran


1
@zfedoran आप वापसी मूल्य को नकारते क्यों हैं? यह एक नकारात्मक साइन लहर प्रतीत होता है।
डैनियल पेन्डगैस्ट

12

आपके पाप () फ़ंक्शन के इनपुट मानों की सीमा क्या है ? आप इसके लिए इसका उपयोग कर रहे हैं, ऐसा लगता है कि वे सीमित हो सकते हैं, जिसका अर्थ है कि आप मूल्यों की पूर्व-गणना कर सकते हैं । उदाहरण के लिए, यदि आप इनपुट मानों को निकटतम डिग्री तक राउंड कर रहे हैं, तो आपके पास केवल 360 संभावित मान हैं - बस उन्हें पूर्व-गणना करें और एक तालिका में संग्रहीत करें।

यदि आपको थोड़ा और मूल्यों की आवश्यकता है, तो एक दशमलव स्थान पर कहें, आप तालिका से प्रक्षेप कर सकते हैं - मैं पेर्लिन शोर से परिचित नहीं हूं , लेकिन "शोर" शब्द से लगता है कि इसे उच्च सटीकता की आवश्यकता नहीं है। :) (आप बस एक बड़ी तालिका भी बना सकते हैं, 3600 प्रविष्टियाँ ज्यादा जगह नहीं हैं)।


3
यदि गति आपकी नंबर-एक चिंता है, और आपको थोड़ी सटीकता के साथ त्याग करने में कोई दिक्कत नहीं है, तो यह सबसे अच्छा जवाब है।
अटैकिंगहोबो

1
मुझे "सर्वश्रेष्ठ" के बारे में नहीं पता है - जैसा कि एक अन्य उत्तर में दिखाया गया है, आप पांच ऑप्स + एब्स (जिनमें से गति आपके आर्क / कंपाइलर पर निर्भर करती है, लेकिन अक्सर शाखा रहित है) में एक और बहुत अच्छा अनुमान प्राप्त कर सकते हैं। यदि लुकअप तालिका कैश में नहीं है, तो यह बहुत धीमा होने वाला है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.