डिग्री के तर्क के साथ एक ट्रिगर फ़ंक्शन, -0.0 कब लौटना चाहिए?


10

त्रिकोणमिति फ़ंक्शन बनाने में my_sind(d), my_cosd(d), my_tand(d), कि एक रेडियन एक एक डिग्री तर्क के बजाय इस्तेमाल किया और 90 के गुणकों में सटीक जवाब प्रदान की है, मैंने देखा है कि कभी-कभी परिणाम था -0.0बजाय 0.0

my_sind( 0.0) -->  0.0
my_sind(-0.0) --> -0.0

my_sind(180.0) --> -0.0
my_sind(360.0) -->  0.0

sin()और tan()आम तौर पर दिए गए साइन शून्य इनपुट के लिए समान साइन शून्य परिणाम लौटाते हैं। यह समझ में आता है कि उन इनपुट के लिए my_sin()मेल खाना चाहिए sin()

my_sind( 0.0) alike sin( 0.0) -->  0.0
my_sind(-0.0) alike sin(-0.0) --> -0.0

सवाल यह है कि : क्या पूर्ण संख्या के लिए non_zero_n/ परिणाम कभी वापस आ सकते हैं चाहिए -0.0के लिए my_sind(180*non_zero_n), my_cosd(180*n + 180), my_tand(180*non_zero_n)?

यह कोड के लिए पर्याप्त आसान है इसलिए केवल f(-0.0)उत्पादन करता है -0.0और इसके साथ किया जाता है। यदि किसी अन्य ( गैर-शून्य ) के लिए अन्य f(x) रिटर्न बनाने का कोई कारण है और उस संकेत का बीमा करने का महत्व है तो सरल सोच ।-0.0x


नोट: यह एक सवाल नहीं है कि 0.0बनाम क्यों -0.0होता है। ऐसा नहीं है कि क्यों cos(machine_pi/4)नहीं लौटा 0.0। न ही यह सवाल है कि कैसे 0.0या की पीढ़ी को नियंत्रित किया जाए -0.0। मैं इसे डिजाइन प्रश्न के रूप में सबसे अच्छा देखता हूं।

जवाबों:


4

"कम से कम आश्चर्य" का डिज़ाइन सिद्धांत बताता है कि हम मार्गदर्शन के लिए पहले से स्थापित कार्यक्षमता को देखते हैं। इस मामले में, सबसे करीब स्थापित कार्यक्षमता द्वारा प्रदान की जाती है sinpiऔर cospi(फ्लोटिंग प्वाइंट अंकगणित के लिए आईईईई मानक) कार्यों IEEE Std 754-2008 में शुरू की, खंड 9. इन कार्यों वर्तमान आईएसओ सी और आईएसओ सी ++ मानकों का हिस्सा नहीं हैं, लेकिन CUDA उदाहरण के लिए, विभिन्न प्रोग्रामिंग प्लेटफार्मों के गणित पुस्तकालयों में शामिल किया गया है।

ये फ़ंक्शन पाप (πx) और कॉस (,x) की गणना करते हैं, जहां ute के साथ गुणा फ़ंक्शन के अंदर निहित होता है। tanpiपरिभाषित नहीं है, लेकिन गणितीय समानता के आधार पर, के अनुसार कार्यक्षमता प्रदान करने के लिए ग्रहण किया जा सकता है tanpi(x) = sinpi(x) / cospi(x)

अब हम परिभाषित कर सकते हैं sind(x) = sinpi(x/180), cosd(x) = cospi(x/180), tand(x) = tanpi(x/180)एक सहज ढंग से। IEEE-754 की धारा 9.1.2 के लिए sinpiऔर विशेष तर्कों की हैंडलिंग का मंत्र है cospi। विशेष रूप से:

sinPi (+ n) +0 है और sinPi ()n) सकारात्मक पूर्णांक n के लिए (0 है। इसका मतलब है, उपयुक्त गोलाई मोड के तहत, कि sinPi (andx) और PsinPi (x) सभी x के लिए समान संख्या (या दोनों NaN) हैं। किसी भी पूर्णांक n के लिए cosPi (n + ½) +0 है जब n + (प्रतिनिधित्व योग्य है।

IEEE 754-2008 मानक उद्धृत आवश्यकताओं के लिए एक तर्क नहीं देता है, हालांकि, संबंधित अनुभाग का प्रारंभिक मसौदा बताता है:

यदि फ़ंक्शन का मान शून्य है, तो गणितीय फ़ंक्शन के साइन फ़ंक्शन के निरंतर विस्तार पर विचार करके इस 0 का चिह्न सबसे अच्छा निर्धारित किया जाता है।

के अवलोकन के 754 कार्य समूह मेल आर्काइव अतिरिक्त अंतर्दृष्टि उपज सकता है, मैं समय के माध्यम से यह खुदाई करने के लिए नहीं किया है। लागू करना sind(), cosd()और tand()जैसा कि ऊपर वर्णित है, हम तब उदाहरण के मामलों की इस तालिका में आते हैं:

SIND
 angle value 
  -540 -0
  -360 -0
  -180 -0
     0  0
   180  0
   360  0
   540  0

COSD
 angle value
  -630  0
  -450  0
  -270  0
   -90  0
    90  0
   270  0
   450  0

TAND
 angle value
  -540  0
  -360 -0
  -180  0
     0  0
   180 -0
   360  0
   540 -0

5

पाप () और टैन () आम तौर पर दिए गए साइन ज़ीरो इनपुट के लिए समान साइन शून्य परिणाम लौटाते हैं

यह आमतौर पर सच हो सकता है:

  • गति / सटीकता । छोटे पर्याप्त डबल्स के लिए, सबसे अच्छा जवाब sin(x)है x। यही है, संख्या की तुलना में छोटे के लिए 1.49e-8, एक्स के साइन के सबसे करीब डबल वास्तव में एक्स ही है ( पाप के लिए ग्लिबक स्रोत कोड देखें ) ( )।

  • विशेष मामलों की हैंडलिंग

    कुछ असाधारण अंकगणितीय संचालन शून्य के संकेत से प्रभावित होते हैं; उदाहरण के लिए "1/(+0) = +inf", लेकिन "1/(-0) = -inf"। इसकी उपयोगिता को बनाए रखने के लिए, साइन बिट को निरंतरता के विचारों से प्राप्त नियमों के अनुसार कुछ अंकगणितीय कार्यों के माध्यम से प्रचारित करना चाहिए।

    प्राथमिक ट्रांसेंडेंटल फ़ंक्शंस जैसे कि पाप (z) और टैन (z) के कार्यान्वयन और उनके व्युत्क्रम और हाइपरबोलिक एनालॉग्स, हालांकि IEEE मानकों द्वारा निर्दिष्ट नहीं हैं, समान नियमों का पालन करने की अपेक्षा की जाती है। के कार्यान्वयन के रूप में अच्छी तरह से इसके मूल्य पर sin(z) हस्ताक्षर के पुन: पेश करने की उम्मीद हैzz = ±O

    ( डब्ल्यू। कहन द्वारा कुछ भी नहीं साइन बिट के बारे में जटिल प्राथमिक कार्यों के लिए शाखा शाखा या बहुत कुछ )

    नकारात्मक रूप से हस्ताक्षरित शून्य गूँज एक-तरफा सीमा के रूप में नीचे से 0 के निकट आने के गणितीय विश्लेषण अवधारणा पर विचार करती है (विचार करें 1 / sin(x): शून्य का संकेत एक बड़ा अंतर बनाता है)।

संपादित करें

दूसरे बिंदु को ध्यान में रखते हुए मैं my_sindऐसा लिखूंगा :

my_sind(-0.0) is -0.0
my_sind(0.0) is 0.0

नवीनतम सी मानक (F.10.1.6 sinऔर F.10.1.7 tan, एक हस्ताक्षरित शून्य के साथ कार्यान्वयन), निर्दिष्ट करता है कि यदि तर्क है ±0, तो इसे अनमॉडिफाइड लौटा दिया जाता है

EDIT 2

अन्य मूल्यों के लिए मुझे लगता है कि यह सन्निकटन की बात है। दिया गया M_PI<π:

0 = sin(π) < sin(M_PI)  1.2246467991473532e-16  +0.0
0 = sin(-π) > sin(-M_PI)  -1.2246467991473532e-16  -0.0
0 = sin(2*π) > sin(2*M_PI)  -2.4492935982947064e-16
0 = sin(-2*π) < sin(-2*M_PI)  2.4492935982947064e-16

इसलिए यदि my_sindयह 180 ° के गुणकों पर सटीक उत्तर प्रदान करता है तो यह वापस आ सकता है +0.0या -0.0(मुझे एक दूसरे पर पसंद करने का स्पष्ट कारण नहीं दिखता)।

यदि my_sindकुछ सन्निकटन (उदाहरण degree * M_PI / 180.0रूपांतरण फार्मूला) का उपयोग करता है , तो यह विचार करना चाहिए कि यह महत्वपूर्ण मूल्यों के करीब कैसे पहुंच रहा है।


आपके विचार क्या हैं sind(180), sind(-180), sind(360), sind(-360),...?
chux -

अद्यतन के लिए धन्यवाद। शायद मेरी पोस्ट स्पष्ट नहीं है। मुख्य प्रश्न चाहिए my_trig(x)कभी लौट -0.0जब |x|नहीं है 0.0?
chux -

के लिए धन्यवाद "तो अगर my_sind 180 ° के गुणकों पर सटीक उत्तर प्रदान करता है तो यह +0.0 या -0.0 पर लौट सकता है (मुझे एक दूसरे पर पसंद करने का स्पष्ट कारण नहीं दिखता है)।" यह अब तक का सबसे निकटतम चर्चा बिंदु है। मैं सोच रहा हूं कि "कम से कम विस्मय का सिद्धांत" हमेशा लौटने को प्रोत्साहित करता है +0.0, लेकिन यह देखने के लिए कि क्या -0.0कुछ स्थितियों में (अन्य कारणों से) लौटने के लिए मजबूर करने वाले कारण हैं x == +/-0.0
chux -

@chux: मुझे लगता है कि गुणकों के लिए 180.0, किसी को वास्तव में उन मूल्यों को देखते हुए सापेक्ष मशीन परिशुद्धता के मूल्यों की जांच करनी होगी। यही है, सबसे छोटा वेतन वृद्धि / गिरावट जो उस संख्यात्मक प्रारूप में एक अलग प्रतिनिधित्व योग्य मूल्य देता है। फिर, उस मूल्य की सच्चे मूल्य से तुलना करके देखें कि यह प्लस साइड या माइनस साइड पर गिरेगा या नहीं।
रवांग

@rwong विचार के लिए धन्यवाद। 90.0 डिग्री के गुणक , सटीक sind(double degrees) और cosd(double degrees)मूल्य वापस आ सकते हैं -1.0, +0.0, +1.0:। यह पोस्ट लगभग -0.0वापस आनी चाहिए (सिंद (-0.0) से अलग)। नोट: सरलीकृत दृष्टिकोण का उपयोग नहींsind() करता है । sin(x/360*M_PI)
chux -

3

पुस्तकालय -0 से +0 को भेद करने का प्रयास नहीं करता है। आईईईई 754 इस भेद के बारे में काफी चिंतित है ... मुझे कुछ भी नहीं के संकेत के बारे में झल्लाहट के बिना लिखने के लिए [काफी गणित में] कार्यों को मिला। - पीजे प्लेंजर, द स्टैंडर्ड सी लाइब्रेरी , 1992, पृष्ठ 128।

औपचारिक रूप से, ट्रिगर फ़ंक्शंस को सी मानक के अनुरूप शून्य का चिह्न वापस करना चाहिए ... जो व्यवहार को अपरिभाषित छोड़ देता है।

अपरिभाषित व्यवहार के सामने, कम से कम विस्मय के सिद्धांत से संबंधित कार्य के व्यवहार को दोहराते हुए सुझाव दिया जाता है math.h। यह उचित रूप से बदबू आ रही है, जबकि गंध में इसी फ़ंक्शन के व्यवहार से हटकर math.hएक तरह से बग को कोड में लाने का तरीका है जो शून्य के संकेत पर निर्भर करता है।


ट्रिगर फ़ंक्शंस math.h0.0 नहीं लौटाते हैं जब + /- pi / 2 या +/- pi जैसे तर्क दिए जाते हैं क्योंकि ये फ़ंक्शंस केवल +/- pi / 2, आदि के पास प्रतिनिधित्व योग्य मान ले सकते हैं । ये "निकट" मान 0.0 के पास परिणाम लौटाते हैं। चूंकि std लाइब्रेरी ट्रिग फ़ंक्शंस ( sin cos tan) किसी इनपुट के लिए 0.0 (या -0.0) नहीं लौटाती (+/- 0.0 को छोड़कर), लेकिन my_sind (), my_cosd (), my_tand () 0.0 (या -0.0) वापस कर सकती है। कोई 0.0 व्यवहार डुप्लिकेट करने के लिए।
chux -

@chux जिस आधार पर sin(-0.0)वापस लौटना चाहिए -0वह संदिग्ध है। यह IEEE मानक के त्रिकोणमितीय सिद्धांत के रूप में कार्यान्वयन विस्तार का व्यवहार करता है। यद्यपि IEEE कार्यान्वयन में सन्निहित दो अंतरालों की सीमा के रूप में शून्य का एक सामान्य गणितीय सिद्धांत है, यह अमूर्त के उस स्तर पर होता है जो सामान्य त्रिकोणमिति के भीतर नहीं होता [इसलिए आपके त्रिकोणमितीय कार्यों में परिवर्तनशीलता]। जो सबसे अच्छा हो सकता है, वह यह है कि आप एक मनमाना सम्मेलन को परिभाषित कर सकते हैं, लेकिन यह math.hशून्य के संकेत पर असमानता से अलग होगा ।
बेन रडर्स

नोट: मैं सुझाव दे नहीं कर रहा हूँ sin(-0.0)लौटना चाहिए -0.0, लेकिन वह my_sind(x)मैच चाहिए sin(x)जब xहै +/-0.0। IOW: पिछले अभ्यास का पालन करें। इसके अलावा सवाल ही क्या करना है जब के बारे में अधिक है x != 0.0, चाहिए my_sind(x)कभी लौट -0.0के रूप में my_sind(180), आदि? हो सकता है कि आपके उत्तर / टिप्पणी से पता चलता हो - लेकिन मैंने ऐसा नहीं देखा है।
chux -

@chux यदि व्यवहार अपरिभाषित है, तो यह अपरिभाषित है। वह तो वैसे ही है जैसे C है। Plauger के बारे में चिंता नहीं की थी +0बनाम -0जब उन्होंने लिखा math.hबीस साल पहले। यह मेरे लिए स्पष्ट नहीं है कि अंतर के बारे में आपके झल्लाहट को क्या समस्या हल हो रही है।
बेन रडर्स 17:14 बजे

1
उम्मीद है कि आप देख सकते हैं कि sin(rad)किसी भी मूल्य के लिए अच्छी तरह से लागू किया गया है rad>0और किसी भी परिशुद्धता की उपज कभी नहीं होगी 0.0क्योंकि पीआई तर्कहीन है। [Ref] (www.csee.umbc.edu/~phatak/645/supl/Ng-ArgReduction.pdf) हालांकि my_sind(deg)एक सटीक 0.0(या तो + या ) पैदावार के हर गुणांक 180.00.0 के रूप में सही गणितीय परिणाम है। "कम से कम विस्मय का सिद्धांत" इन मामलों में 0.0 लौटने का सुझाव देता है। मेरा प्रश्न क्या -0.0कभी इन मामलों में वापस आना चाहिए ?
chux -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.