2009-04-17 14 views
17

क्या मैं एक फ़्लोटिंग-पॉइंट नंबर को एक पूर्णांक से तुलना कर सकता हूं?क्या मैं तुलना कर सकता हूं और सी में एक पूर्णांक में एक फ़्लोटिंग-पॉइंट नंबर जोड़ सकता हूं?

क्या फ्लोट कोड में पूर्णांक की तुलना करेगा?

float f;  // f has a saved predetermined floating-point value to it 
if (f >=100){__asm__reset...etc} 

इसके अलावा, हो सकता है मैं ...

float f; 
int x = 100; 
x+=f; 

मैं एक स्थिति मूल्य एक्स कि एक PWM नियंत्रित करता है समायोजित करने के लिए चल बिन्दु मूल्य एक दृष्टिकोण संदर्भ प्रणाली से प्राप्त का उपयोग करना पड़ रवैये के लिए सही करने के लिए संकेत।

उत्तर

18

पहला व्यक्ति ठीक काम करेगा। 100 को एक फ्लोट में परिवर्तित कर दिया जाएगा, और आईईई 754 लगभग 2 तक फ्लोट के रूप में सभी पूर्णांक का प्रतिनिधित्व कर सकता है।

दूसरा वाला भी काम करेगा लेकिन पहले एक पूर्णांक में परिवर्तित हो जाएगा, इसलिए आप सटीकता खो देंगे (अगर आप पूर्णांक में फ्लोट कर रहे हैं तो यह अपरिहार्य है)।

+0

धन्यवाद, तो इसका मतलब है कि अगर f = 1.0162 यह int f == 1 होगा, तो मुझे इसे स्केल करना होगा, f * = 1000; तो सटीक बनाए रखने के लिए int f == 1016? – sevenboarder

+0

आप फ्लोट के रूप में बिल्कुल सभी पूर्णांक का प्रतिनिधित्व नहीं कर सकते हैं। फ्लोट के 24-बिट मंटिसा के साथ नहीं। यदि यह दोगुना था, हाँ, लेकिन फ्लोट नहीं :) – Joey

+0

@ जोहान्स, आप सही हैं, मैं हाल ही में एक प्रश्न को गलत याद कर रहा हूं, जिसे ठीक करने के लिए अपडेट किया गया है। – paxdiablo

0

हाँ, यह ठीक काम करेगा। विशेष रूप से, int रूपांतरण के प्रयोजनों के लिए फ्लोट में परिवर्तित हो जाएगा। दूसरे में आपको int में डालने की आवश्यकता होगी लेकिन यह अन्यथा ठीक होना चाहिए।

1

एलएचएस परिशुद्धता, परिभाषित करता है तो यदि आपका एलएचएस int है और आरएचएस फ्लोट है, तो इसके परिणामस्वरूप परिशुद्धता का नुकसान होता है।

साथ ही इससे संबंधित CFAQ

0

हाँ एफपी पर एक नज़र डालें, और कभी कभी यह कि वास्तव में आप क्या उम्मीद करेंगे।

जैसा कि अन्य ने इंगित किया है, उदाहरण के लिए, 1.0 == 1 काम करेगा, क्योंकि पूर्णांक 1 प्रकार की तुलना में double (float पर) कास्ट नहीं है।

हालांकि, अन्य तुलना नहीं हो सकती है।

1

हां, आप उनकी तुलना कर सकते हैं, आप उन पर गणित कर सकते हैं जिनके लिए बहुत अधिक सम्मान किए बिना, जो ज्यादातर मामलों में है। लेकिन केवल सबसे अधिक। बड़ा बगबू यह है कि आप f<i आदि की जांच कर सकते हैं लेकिन f==i की जांच नहीं करनी चाहिए। एक पूर्णांक और एक फ्लोट जो मूल्य में समान होना चाहिए, वह समान रूप से समान नहीं है।

2

क्या आप एक फ्लोट और एक पूर्णांक की तुलना कर सकते हैं, निश्चित रूप से। लेकिन जिस समस्या में आप भाग लेंगे वह सटीक है। अधिकांश सी/सी ++ कार्यान्वयन पर, फ्लोट और int के आकार (4 बाइट्स) और जंगली रूप से अलग सटीक स्तर होते हैं। न तो प्रकार दूसरे प्रकार के सभी मूल्यों को पकड़ सकता है। चूंकि एक प्रकार को अन्य प्रकार में परिशुद्धता के नुकसान के बिना परिवर्तित नहीं किया जा सकता है और प्रकार की तुलना मूल रूप से नहीं की जा सकती है, किसी अन्य प्रकार पर विचार किए बिना तुलना करने से कुछ परिदृश्यों में सटीक हानि होगी।

सटीक हानि से बचने के लिए आप क्या कर सकते हैं दोनों प्रकारों को एक प्रकार में परिवर्तित करना है जिसमें फ्लोट और इंट के सभी मूल्यों का प्रतिनिधित्व करने के लिए पर्याप्त सटीकता है। पर सिस्टम, डबल बस यही करेगा।तो आमतौर पर निम्नलिखित एक गैर हानिपूर्ण तुलना करता है

float f = getSomeFloat(); 
int i = getSomeInt(); 
if ((double)i == (double)f) { 
    ... 
} 
+3

मुझे लगता है कि आप चाहते हैं "> =" (मूल प्रश्न से मिलान करने के लिए) और "==" नहीं। फ्लोटिंग-पॉइंट नंबरों की सटीक समानता के लिए परीक्षण लगभग हमेशा एक बुरा विचार है। WECSSKAFPA लिंक के लिए –

10

जब से तुम चल बिन्दु संख्या की बारीकियों के साथ अपरिचित के रूप में अपने आप को पहचान की है, मैं डेविड गोल्डबर्ग द्वारा इस बेहतरीन कागज का उल्लेख करेंगे: What Every Computer Scientist Should Know About Floating-Point Arithmetic (reprint पर रवि)।

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

सटीकता के बारे में उठाए गए अंक निश्चित रूप से मान्य हैं। एक IEEE float प्रभावी रूप से केवल 24 बिट परिशुद्धता है, जो 32-बिट पूर्णांक से कम है। इंटरमीडिएट गणनाओं के लिए double का उपयोग float या int पर रूपांतरण के लिए सभी गोल और सटीक हानि को धक्का देगा।

+0

+1, जिसने मुझे सर्फिंग से बचाया। :) – unwind

+0

मैंने कागज को एक स्कीम दिया, मैं इसे बाद में बंद कर सकता हूं ...हाहा – sevenboarder

+0

यह गणित पर थोड़ा भारी है ... लेकिन आप सभी सबूतों को छोड़कर महत्वपूर्ण बिंदु प्राप्त कर सकते हैं। बड़ा महत्वपूर्ण मुद्दा यह है कि यह हमेशा आसान नहीं होता है ... – RBerteig

8

मिश्रित-मोड अंकगणितीय (विभिन्न प्रकारों और/या आकारों के संचालन के बीच अंकगणित) कानूनी लेकिन नाजुक है। ऑपरेटरों को एक आम प्रतिनिधित्व में बदलने के लिए सी मानक प्रकार पदोन्नति के लिए नियम परिभाषित करता है। स्वचालित प्रकार पदोन्नति संकलक को मिश्रित-मोड संचालन के लिए कुछ समझदार करने की अनुमति देती है, लेकिन "समझदार" का अर्थ "सही" नहीं है।

वास्तव में यह जानने के लिए कि व्यवहार सही है या नहीं, आपको पहले प्रचार के नियमों को समझना चाहिए और फिर डेटा प्रकारों के प्रतिनिधित्व को समझना चाहिए। बहुत सामान्य शब्दों में:

  • कम प्रकार अब प्रकार (floatdouble को, shortint करने, आदि)
  • पूर्णांक प्रकार फ्लोटिंग प्वाइंट प्रकार में बदल दिए जाते
  • पर हस्ताक्षर किए/अहस्ताक्षरित में बदल रही हैं डेटा हानि से बचने के पक्ष में रूपांतरण (चाहे हस्ताक्षरित को हस्ताक्षरित या इसके विपरीत, संबंधित प्रकार के आकार पर निर्भर करता है)

चाहे कोड x > y (जहां x और y के विभिन्न प्रकार हैं) सही है या गलत x और y मानों पर निर्भर करता है। मेरे अनुभव में अंतर्निहित प्रकार रूपांतरणों को प्रतिबंधित करने (कोडिंग मानक के माध्यम से) सामान्य अभ्यास है। प्रोग्रामर को संदर्भ पर विचार करना चाहिए और आवश्यक रूप से आवश्यक किसी भी प्रकार के रूपांतरण करना चाहिए।

0

इसके बारे में, नोटेशन 1.0 डबल प्रकार का है, इसलिए तुलना पहले बताए गए पदोन्नति नियमों के प्रकार से दोगुनी हो जाती है। 1. एफ या 1.0 एफ प्रकार की फ्लोट है और तुलना फ्लोट में की गई होगी। और यह भी काम करता क्योंकि हमने कहा कि 2^23 पहले पूर्णांक एक फ्लोट में प्रतिनिधित्व योग्य हैं।

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

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