मैं सोच रहा था कि क्या 0 और Math.PI * 2 के बीच त्रिकोणमितीय फलनों को दिए गए कोण को बंद करने का कोई फायदा है? मेरे पास एक ऐसा कार्य था जिसमें त्रिकोणमितीय कार्यों का भारी उपयोग किया गया था, और परियोजना में किसी ने इसे भीख मांगने के लिए जोड़ा:

angle %= Math.PI * 2;

क्या इसका कोई फायदा है? क्या त्रिकोणमितीय कार्य तेजी से होते हैं यदि पारित कोण उन मानों के बीच होता है? यदि हां, तो क्या उन्हें इसे स्वयं बंद नहीं करना चाहिए? क्या कोई अन्य मामला है जहां समकक्ष कोणों को क्लैंप किया जाना चाहिए?

भाषा जावास्क्रिप्ट है, जिसके V8 और स्पाइडरमोन्की पर चलने की सबसे अधिक संभावना है।

3
Alex Turpin 7 सितंबर 2011, 19:12
उत्तर आपके द्वारा उपयोग किए जाने वाले प्लेटफॉर्म पर निर्भर होने वाला है। आप किस भाषा/ढांचे/कंपाइलर/आदि का उपयोग कर रहे हैं? मेरा संदेह यह है कि यह पेर्फ के मामले में ज्यादा मायने नहीं रखता है, लेकिन यह शायद डिबगिंग को बहुत आसान बना देता है।
 – 
i_am_jorf
7 सितंबर 2011, 19:15

2 जवाब

सबसे बढ़िया उत्तर

चूंकि त्रिकोणमितीय कार्यों की गणना के लिए अधिकांश (ऑन-डाई) एल्गोरिदम CORDIC के कुछ प्रकार का उपयोग करते हैं, मेरी शर्त है ट्रिगर फ़ंक्शन कॉल के प्रवेश बिंदु पर वैसे भी वे मान [0, Pi/2) के भीतर जकड़े जा रहे हैं।

ऐसा कहा जा रहा है, यदि आपके पास पूरे एल्गोरिदम में कोणों को शून्य के करीब रखने का कोई तरीका है, तो शायद ऐसा करना बुद्धिमानी है। दरअसल, sin(10^42) का मान बहुत अधिक अपरिभाषित है, क्योंकि 10^42 रेंज में ग्रैन्युलैरिटी लगभग 10^25 है।

उदाहरण के लिए इसका अर्थ है कि यदि आपको कोणों को जोड़ना है, और यदि ऐसा करने से वे परिमाण में बड़े हो सकते हैं, तो आपको उन्हें समय-समय पर क्लैंप करने पर विचार करना चाहिए। लेकिन त्रिकोणमितीय फ़ंक्शन कॉल से ठीक पहले उन्हें दबाना आवश्यक नहीं है।

7
Alexandre C. 7 सितंबर 2011, 23:53
मुझे डर है कि आपका आधार आवश्यक रूप से सत्य नहीं है। मुझे इसके बारे में हॉटस्पॉट कोडबेस में पढ़ना याद है जहां उन्हें पाप/कॉस कंप्यूटेशंस के लिए अनुकूलन को हटाना पड़ा क्योंकि x86 सीपीयू (अच्छी तरह से x87 कोप्रोसेसर) पीआई या कुछ के लिए पर्याप्त उच्च सटीकता का उपयोग नहीं करते हैं। संपादित करें: इसे यहां देखें।
 – 
Voo
8 सितंबर 2011, 22:04
@Voo: लिंक के लिए धन्यवाद, यह वास्तव में शिक्षाप्रद है। हालांकि, भले ही लेख बताता है कि x86 पर sin(pi) का मान सापेक्ष सटीकता में के अत्यधिक पक्षपाती है, अधिकांश तर्कों के लिए यह व्यावहारिक रूप से मशीन परिशुद्धता में अनुवाद करता है, इसलिए मैं इसके बारे में चिंता नहीं करूंगा मौजूदा कोड जो इस वजह से x86 पर तोड़ा जा सकता है। लेकिन वास्तव में, ऐसी मशीनों पर तर्क में कमी त्रुटिपूर्ण है। मैं इसका परीक्षण आधुनिक x86 कंप्यूटरों पर करूँगा।
 – 
Alexandre C.
8 सितंबर 2011, 23:46
मुझे यकीन नहीं है कि मैं आपके तर्क का पालन कर सकता हूं। यदि एक गैर कम किए गए इनपुट तर्क का उपयोग करते हुए, एक आउटपुट में परिणाम होता है जो केवल 10 बिलियन यूएलपी या उससे अधिक (थ्रेड से चोरी) के बजाय अपेक्षित 1/2 या 1 के बजाय समस्याग्रस्त लगता है। मेरा मतलब है कि आम तौर पर मैं sin(2PI * 1000000000 + 1) और Sin(1) के लिए "समान" आउटपुट की अपेक्षा करता हूं - जरूरी नहीं कि बिल्कुल वही हो, लेकिन फिर भी कहीं न कहीं उसी सीमा में। हालांकि सवाल यह है कि x87 आज कितना महत्वपूर्ण है - क्या कुछ एसएसई आंतरिक है?
 – 
Voo
9 सितंबर 2011, 01:45
@Voo: "10 बिलियन यूएलपी" केवल पाप (पीआई) के लिए है (और यह 10 ^ -15 आईआईआरसी की पूर्ण सटीकता बनाता है)। अन्य संख्याओं के लिए, पूर्ण सटीकता ठीक है। आप वैसे भी फ़्लोटिंग पॉइंट अंकगणित में पीआई का सही ढंग से प्रतिनिधित्व नहीं कर सकते हैं।
 – 
Alexandre C.
9 सितंबर 2011, 10:56

कोणों को -pi/4 से pi/4 (उपयुक्त के रूप में साइन या कोसाइन का उपयोग करें) के लिए क्लैंपिंग कोणों का एक लाभ यह है कि आप यह सुनिश्चित कर सकते हैं कि यदि कोणों की गणना पाई के कुछ सन्निकटन का उपयोग करके की जाती है, तो का उपयोग करके सीमा में कमी की जाती है। समान सन्निकटन. इस तरह के दृष्टिकोण के दो लाभ होंगे: यह 180 डिग्री की साइन या 90 डिग्री की कोसाइन जैसी चीजों की सटीकता में सुधार करेगा, और यह गणित पुस्तकालयों को सुपर-सटीक रेंज में कमी करने के प्रयास में कम्प्यूटेशनल चक्रों को बर्बाद करने से बचाएगा। पाई का "अधिक सटीक" सन्निकटन जो कोणों की गणना में उपयोग किए जाने वाले से मेल नहीं खाता।

उदाहरण के लिए, 2⁴⁸ * pi की ज्या पर विचार करें। सर्वोत्तम double pi का सन्निकटन, गुणा 2^48, 884279719003555 है, जो कि 2⁴⁸π का सबसे अच्छा दोहरा सन्निकटन भी होता है। 2⁴⁸π का वास्तविक मान 884279719003555.03447074 है। मॉड-सर्वश्रेष्ठ दोहरे सन्निकटन को कम करने से पूर्व के मूल्य को pi के सर्वोत्तम दोहरे सन्निकटन द्वारा शून्य प्राप्त होगा, जिसकी ज्या 2⁴⁸π की सही ज्या के बराबर होती है। द्वारा मॉड-रिड्यूसिंग pi के सर्वोत्तम सन्निकटन द्वारा बढ़ाए गए मान से -0.03447074 प्राप्त होगा, जिसकी ज्या -0.03446278 है।

0
supercat 7 जून 2014, 22:15