2012-05-29 37 views
10

मान लें कि t, a, b सभी डबल (IEEE Std 754) चर रहे हैं, और a के दोनों मूल्यों, bNaN नहीं हैं (लेकिन Inf हो सकता है)। t = a - b के बाद, क्या मेरे पास a == b + t आवश्यक है?आईईईई स्टडी 754 फ़्लोटिंग-प्वाइंट: चलो टी: = ए - बी, क्या मानक गारंटी है कि एक == बी + टी?

+0

मेरा मानना ​​है कि एक अंडरफ्लो के परिणाम को अपरिभाषित किया जाएगा, और इसी तरह दूसरी अभिव्यक्ति में अतिप्रवाह होगा, तो नहीं। अगर कोई इसकी पुष्टि कर सकता है, तो यह अच्छा होगा। – chris

+0

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

+3

सी कार्यान्वयन में आईईईई 754 के अनुरूप, किसी भी फ़्लोटिंग पॉइंट अंकगणित के लिए कोई यूबी नहीं है। सभी परिणाम कड़ाई से परिभाषित हैं। –

उत्तर

25

बिलकुल नहीं। एक स्पष्ट मामला a=DBL_MAX, b=-DBL_MAX है। फिर t=INFINITY, इसलिए b+t भी INFINITY है।

और क्या आश्चर्य हो सकता है कि ऐसे मामले हैं जहां यह किसी भी अतिप्रवाह के बिना होता है। असल में, वे सभी रूप हैं जहां a-b अचूक है। उदाहरण के लिए, यदि aDBL_EPSILON/4 और b-1 है, a-b 1 है (डिफ़ॉल्ट गोलाई मोड कल्पना करते हुए) है, और a-b+b तो 0.

है कारण मैं इस दूसरे उदाहरण का उल्लेख है कि इस विहित मजबूर कर का तरीका है है आईईईई अंकगणितीय में एक विशेष परिशुद्धता के लिए गोल। उदाहरण के लिए, यदि आपके पास श्रेणी [0,1) में कोई संख्या है और इसे परिशुद्धता के 4 बिट तक घुमाने के लिए मजबूर करना चाहते हैं, तो आप 0x1p49 जोड़ देंगे और फिर घटाएंगे।

+1

2 उदाहरण के रूप में यह Inf और न ही NaN उठाना नहीं है महान है। बहुत बहुत धन्यवाद। – updogliu

+1

आप '0x1p49' लगातार स्पष्ट करने के लिए चाहते हो सकता है, पिछली बार जब मैंने देखा हेक्स अंक 0 से एफ के लिए भाग गया;) – MSalters

+8

@MSalters: के रूप में सी मानक में परिभाषित" 0x1p49 ", हेक्साडेसिमल फ्लोटिंग प्वाइंट है। प्रारूप "0x" "पी" ,, एक वैकल्पिक अवधि सहित जहां हेक्साडेसिमल अंक है, और वैकल्पिक रूप से एक संकेत सहित एक दशमलव अंक है। एक्सपोनेंट के लिए आधार दो है, इसलिए 0x1p49 2 ** 49 है। 0x1p -4 1/16 होगा, और 0x1.23p8 होगा (1 + 2/16 + 3/256) * 2 ** 8 = 291 हेक्साडेसिमल फ्लोटिंग प्वाइंट एक प्रारूप मानव और compilers कन्वर्ट करने के लिए आसान है कि प्रदान करता है मुद्दों को गोल किए बिना बाइनरी फ़्लोटिंग-पॉइंट एन्कोडिंग से और उसके लिए। –

1

पहला ऑपरेशन करने की प्रक्रिया में, परिणाम के कम अंत से बिट्स खो गए थे। तो एक सवाल यह है कि, दूसरा ऑपरेशन वास्तव में उन हानियों को पुन: उत्पन्न करेगा? मैंने पूरी तरह से सोचा नहीं है।

लेकिन, निश्चित रूप से, पहला ऑपरेशन +/- अनंतता तक बह गया हो सकता है, दूसरी तुलना असमान की तुलना में हो सकता है।

(और, बेशक, सामान्य स्थिति फ्लोटिंग प्वाइंट मूल्यों के लिए == का उपयोग करने में लगभग हमेशा एक बग है।) जब तैरता का उपयोग कर

+1

बस एक गिनती तर्क से, दूसरा ऑपरेशन जो खो गया था उसे वापस नहीं ला सकता है। यदि ऐसा हो सकता है, तो आप 't' में बिट्स की संख्या से' t' में जानकारी के अधिक बिट्स संग्रहीत करेंगे ... –

+0

@R - हां। सहजता से कोई जानता है कि यह आपके काम के कारण काम नहीं करेगा, लेकिन उदाहरणों को ढूंढना एक गूढ़ नियम के लिए अपील करने से बेहतर "सबूत" है, इससे कोई फर्क नहीं पड़ता कि कितना वैध है। –

-3

तुम कुछ भी गारंटी नहीं है। यदि एक्सपोनेंट दोनों संख्याओं के लिए अलग है, तो अंकगणितीय ऑपरेशन का परिणाम फ्लोट में पूरी तरह से प्रतिनिधित्व योग्य नहीं हो सकता है।

इस कोड पर विचार करें:

float a = 0.003f; 
float b = 10000000.0f; 
float t = a - b; 
float x = b + t; 

विजुअल स्टूडियो 2010 पर चल रहा है, आप t==-10000000.0f मिलता है, और इसलिए x==0

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

यह भी वीडर हो जाता है क्योंकि विभिन्न फ़्लोटिंग पॉइंट कार्यान्वयन एक ही ऑपरेशन के लिए अलग-अलग परिणाम लौटा सकते हैं।

+5

मुझे कभी भी "अंतर के पूर्ण मूल्य की तुलना" पसंद नहीं आया। त्रुटियों पर सीमाएं प्राप्त करना संभव है ([प्रत्येक कंप्यूटर वैज्ञानिक को फ़्लोटिंग-पॉइंट अंकगणितीय के बारे में क्या पता होना चाहिए] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) एक अच्छा है शुरू करें) और किसी को इस बारे में सोचना चाहिए कि किसी व्यक्ति को मनमाने ढंग से बाध्य करने से पहले तुलना के साथ क्या करने की कोशिश कर रहा है। –

+8

आईईईई -754 फ्लोट्स का उपयोग करते समय बहुत सी चीजें हैं जिनकी गारंटी है। यह उनमें से एक नहीं होता है। –

+0

आईईईई फ्लोट्स का उपयोग करते समय बहुत सारी गारंटीएं होती हैं, और ऐसे समय होते हैं जब समानता की तुलना करना उचित नहीं है, बल्कि आवश्यक है। फ़्लोटिंग-पॉइंट गणित निश्चित रूप से मुश्किल है, लेकिन यह यादृच्छिक या दुर्भावनापूर्ण नहीं है। फ्लोटिंग-पॉइंट समानता के परीक्षण के दौरान मेरे ब्लॉग से यहां एक उदाहरण दिया गया है: https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ –