2012-12-12 19 views
5

संभव डुप्लिकेट लौटने पाप और क्योंकि कार्य:
getting value of sine 180 as 1.22465e-16गलत परिणाम

मैं वृत्त की परिधि पर एक बिंदु की गणना कर रहा हूँ। मेरे पास त्रिज्या और सर्कल का केंद्र बिंदु है। यहां आप कहेंगे, बड़ा सौदा, इसके लिए एक प्रत्यक्ष सूत्र है। हाँ, कोण

x = x + r*sin(angle) 
y = y + r*cos(angle) 

ठीक रेड में है, अब समस्या यहां भले ही मैं रेडियन में कोण गुजर रहा है। अभी तक मैं साथ

return degrees * M_PI/180; 

मैं ऐसा क्यों हो रहा है के रूप में यकीन नहीं है नीचे उल्लेख कोण

for 90 degree (rads = 1.5708) i get y axis = -4.3774e-08 
for 180 degree (rads = 3.14159) i get x axis = -8.74228e-08 
for 270 degree (rads = 4.71239) i get y axis = 1.19249e-08 
for 360 degree (rads = 6.28319) i get x asix = 1.74846e-07 

मैं रेडियंस में डिग्री परिवर्तित कर रहा हूँ के लिए सही जवाब मिल नहीं है। कुछ गंभीरता से गलत होना चाहिए।

यहाँ कोड रूपांतरण

के लिए प्रयोग किया जाता है
float angle = DegreesToRadians(90); 

float x = sin(angle); 
float y = cos(angle); 

किसी ने मुझे इस के साथ मदद कर सकते हैं?

+1

पोस्ट कोड कृपया। – pdriegen

+1

यह "उद्देश्य-सी" के साथ क्यों टैग किया गया है? –

उत्तर

8

M_PI रूप

#define M_PI  3.14159265358979323846264338327950288 

जो केवल लगभग (तर्कहीन) संख्या पाई है "math.h" में परिभाषित किया गया है। इसलिए

cos(M_PI/2), sin(M_PI), cos(3*M_PI/2), sin(2*M_PI) 

केवल लगभग शून्य कर रहे हैं। पीआई को float या double के रूप में बिल्कुल प्रदर्शित नहीं किया जा सकता है।

आपके आउटपुट से मुझे लगता है कि आपने float का उपयोग किया था। चूंकि float के महत्वपूर्ण अंकों की संख्या लगभग 7 है, और उस बिंदु पर sin() और cos() की ढलान (पहली व्युत्पन्न) +/- 1 है, तो मैं कहूंगा कि परिणाम उतने अच्छे हैं जितना आप उम्मीद कर सकते हैं। double के साथ काम करने से बेहतर परिणाम मिलेगा, लेकिन बिल्कुल शून्य नहीं होगा।

तो गंभीरता से गलत नहीं है, आप बस एक फ़्लोटिंग पॉइंट गणना के परिणाम की सटीक होने की उम्मीद नहीं कर सकते हैं।

+0

तो आप लोग क्या सुझाव देते हैं, फ्लोट का उपयोग नहीं करते हैं। मैं किस डेटा प्रकार का उपयोग करता हूं? चूंकि, जब मैं 45 डिग्री के लिए गणना करता हूं तो यह पूरी तरह से ठीक गणना करता है। सटीक परिणाम प्राप्त करने के लिए क्या किया जाना चाहिए? – Kunjal

+0

@ कुंजल: परिणाम * सटीक * फ़्लोटिंग पॉइंट परिशुद्धता के भीतर है। और त्रिकोणमितीय कार्यों के लिए फ़्लोटिंग पॉइंट का कोई विकल्प नहीं है। - यदि आप कुछ बिंदुओं को प्रदर्शित करना चाहते हैं तो यह कोई समस्या नहीं है, क्योंकि परिणाम वैसे भी पिक्सल तक गोल किया जाएगा। - अन्यथा आपको परिणामों के साथ और अधिक स्पष्ट रूप से बताना होगा, और परिणाम आपके लिए एक समस्या क्यों है। –

+0

एक सर्कल है और मुझे सर्कल की परिधि पर विभिन्न कोणों पर बटन रखने की आवश्यकता है। जब मैं अपने मूल प्रश्न में उल्लिखित सूत्र का उपयोग करता हूं, तो मुझे जो परिणाम मिलते हैं उन्हें छेड़छाड़ करने की आवश्यकता होगी। अगर मुझे सटीक परिणाम मिल सकते हैं, तो यह हमेशा CGPoint बनाने के लिए बेहतर होता है। मुझे आशा है कि चीजें स्पष्ट हैं। – Kunjal

0

सामान्य रूप से फ्लोट से निपटने पर किसी भी विशिष्ट संख्या के साथ परिणामों (बराबर) की तुलना करने की सलाह नहीं दी जाती है, यह 0, 1 या यहां तक ​​कि पीआई या ई हो सकती है। -8.74228e-08 निकटतम सभी गणना योग्य मामलों में 0 के रूप में माना जाने वाला पर्याप्त है। (यदि नहीं, तो आपके पास फ्लोट/डबल के साथ कोई महत्व मुद्दा है)

यदि आपको प्रोग्राम कोड में उनकी तुलना करने की आवश्यकता होती है, तो आपको मूल्यों को प्रतिस्थापित करना चाहिए और परिणाम < या> के साथ परिणाम की तुलना करना चाहिए छोटी संख्या। जैसे

if (sin(something*pi) < 0.0001f) ... 

बजाय

if (sin(something*pi) == 0) ... 
1

एक duplicate प्रश्न के लिए एक टिप्पणी जोड़ने के लिए ...

एक वैकल्पिक रेडियन के बजाय grads या डिग्री का उपयोग करना है, ताकि पूर्ण हलकों के गुणकों , साथ ही साथ प्रत्येक चतुर्भुज के गुणक पूर्णांक होते हैं और की साइन और कोसाइन भी तर्कों का बिल्कुल प्रतिनिधित्व किया जा सकता है।

इसके अलावा एक आश्चर्य होता है कि कैसे अच्छी तरह से गणित पुस्तकालयों के कुछ कार्यान्वयन अनुकरणीय के गुणकों संभाल है: तैरता में पाई का प्रतिनिधित्व के रूप में या डबल्स है बंद सही मूल्य से कुछ छोटी राशि डेल्टा से है, तो यह है कि एन इस प्रकार * (पीआई + -डेल्टा) एन * डेल्टा द्वारा वास्तविक मूल्य से बंद है। नतीजतन एक अच्छी तरह से लिखित पुस्तकालय पाप ((पीआई/2) + (2 * पीआई) * एन) एन के साथ बढ़ता है; खराब लिखित लाइब्रेरी के साथ, तर्क का मूल्यांकन मॉड्यूलो 2 * पीआई के सन्निकटन का मूल्यांकन किया जाता है, जो प्रत्येक एन के लिए बिल्कुल समान ऑफ़सेट देता है।

+0

प्रश्न जो आपने किया था वह जावा के लिए है। उद्देश्य-सी के लिए एक ही काम होगा? साथ ही, मुझे यकीन नहीं है कि क्या उद्देश्य-सी ग्रेड या डिग्री – Kunjal

+0

में गणना करने की अनुमति देता है फ़्लोटिंग पॉइंट अंकगणित कम या ज्यादा भाषा स्वतंत्र है - और सर्कल को पूर्णांक संख्याओं में विभाजित करने की कला भी है। उत्तरार्द्ध शायद सीमित मामलों में उपयोगी है और जहां ट्रायगोनोमेट्रिक फ़ंक्शंस लुकअप टेबल के साथ किया जाता है। –

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