2011-07-31 18 views
6

में कभी बराबर 0 हो सकता है यह देखते हुए कि पीआई/2 को फ्लोटिंग पॉइंट में सटीक रूप से प्रदर्शित नहीं किया जा सकता है, क्या यह मानना ​​सुरक्षित है कि कॉस (ए) सटीक शून्य कभी नहीं लौटा सकता है?क्या कॉस (ए) फ्लोटिंग पॉइंट

यदि यह मामला है, तो निम्न छद्म कोड ब्लॉक में प्रवेश करेंगे कभी नहीं (और यह सुरक्षित रूप से निकाला जा सकता है):

... 
y = h/cos(a); 
if (!isfinite(a)) 
{ 
    // handle infinite y 
} 
+0

कभी कभी प्रणाली यह मजबूर हो सकता है शून्य जब 'ए' aprox है। 'पीआई/2' के बराबर। – ja72

उत्तर

4

शून्य कई मानों में से एक है जिसे बिल्कुल प्रदर्शित किया जा सकता है। कई प्रणालियों में पाप और कॉस के सामान्य मूल्यों के लिए एक लुकअप टेबल होती है, इसलिए यह असंभव नहीं है कि बिल्कुल शून्य वापस किया जा सकता है।

if (Abs(cos(a)) < 0.0000001) 
{ 

} 
+2

"कई" में से एक? मुझे नहीं लगता कि मैं "कई" शब्द का उपयोग करूंगा (2^64 - 2^53)। –

+0

1/2, 1/4, 1/8, ..... –

+1

प्रत्येक परिमित फ़्लोटिंग-पॉइंट मान को फ़्लोटिंग-पॉइंट (चौंकाने वाला, मुझे पता है) में बिल्कुल प्रदर्शित किया जा सकता है। न केवल 1/2, 1/4, बल्कि 0.333333333333333314829616256247390992939472198486328125 और 3.141592653589790007373494518105871975421905517578125। –

0

नहीं, इसकी गारंटी नहीं किया जा सकता है, क्योंकि cos के साथ ही गणना की है एक त्रुटि, इसलिए इसका मान सटीक शून्य बहुत आसानी से हो सकता है।

7

शून्य, डबल परिशुद्धता मूल्य कि π/2 की एक सटीक एकाधिक के सबसे करीब आता है 6381956970095103 * 2^797 है के अलावा:

लेकिन अगर आप एक डेल्टा का उपयोग कर सुरक्षित हैं प्रभाग प्रदर्शन से पहले की तुलना,

(an odd integer) * π/2 + 2.983942503748063...e−19 

इस प्रकार, के लिए सभी डबल परिशुद्धता मूल्यों एक्स, हम बाध्य है: है, जो के बराबर है

|cos(x)| >= cos(2.983942503748063...e−19) 

ध्यान दें कि यह गणितीय रूप से सटीक मान पर बाध्य है, लाइब्रेरी फ़ंक्शन cos द्वारा दिए गए मान पर नहीं। एक अच्छी गुणवत्ता वाले गणित पुस्तकालय वाले मंच पर, यह बाध्य पर्याप्त रूप से अच्छा है कि हम कह सकते हैं कि cos(x) किसी भी डबल-परिशुद्धता x के लिए शून्य नहीं है। वास्तव में, यह पता चला है कि यह डबल करने के लिए अद्वितीय नहीं है; यह संपत्ति सभी आईईईई -754 मूल प्रकारों के लिए है, यदि cos ईमानदारी से गोलाकार है।

हालांकि, यह कहना नहीं है कि यह कभी ऐसे प्लेटफॉर्म पर नहीं हो सकता है जिसमें त्रिकोणमितीय तर्क में कमी का शानदार प्रदर्शन हो।

इससे भी अधिक महत्वपूर्ण बात, यह ध्यान रखें कि अपने उदाहरण में y अनंत बिना cos(a) जा रहा है शून्य हो सकता है महत्वपूर्ण है:

#include <math.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) { 
    double a = 0x1.6ac5b262ca1ffp+849; 
    double h = 0x1.0p1022; 
    printf("cos(a) = %g\n", cos(a)); 
    printf("h/cos(a) = %g\n", h/cos(a)); 
    return 0; 
} 

संकलन और चलाएँ:

scanon$ clang example.c && ./a.out 
cos(a) = -4.68717e-19 
h/cos(a) = -inf 
+0

मुझे यह बिल्कुल जवाब देना अच्छा लगेगा, और इसके बगल में सुराग देता है कि 0.0000001 जैसी सहिष्णुता पूरी तरह से मनमाने ढंग से क्यों लगता है, यह एक अतिप्रवाह को भी रोक नहीं पाएगा। अतिप्रवाह संरक्षण कुछ ऐसा होना चाहिए (abs (cos (x)) <1);) –

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