2010-08-14 15 views
21

प्रत्येक समय मैं Math.Round/Floor/Ceiling का उपयोग करता हूं, मैं हमेशा int (या शायद long आवश्यक होने पर) कास्ट करता हूं। अगर वे हमेशा एक पूर्णांक लौट रहे हैं तो वे double क्यों लौटते हैं।क्यों नहीं गणित। राउंड/मंजिल/छत लंबी या int वापसी?

उत्तर

27

परिणाम एक int (या एक लंबे) में फिट नहीं हो सकता है। एक डबल की सीमा बहुत अधिक है। डबल की

लगभग रेंज: ± 5.0 × 10 -324 ± 1.7 × 10

(Source)

+0

उन्होंने कहा या सवाल में लंबे समय तक। – bwawok

+3

बिंदु एक ही रहता है।एक 'डबल' 9 223372036854775807 से बड़ा हो सकता है। – dan04

+1

मुझे लगा कि यह कारण होगा लेकिन बस यह सुनिश्चित करना चाहता था। स्पष्ट रूप से एक पूर्णांक के लिए गोल * लंबे समय से बड़ा * * अधिकांश अनुप्रयोगों के लिए दुर्लभ है *, माइक्रोसॉफ्ट को अभी भी इसे गणितीय रूप से समझने के लिए लागू करना था। धन्यवाद! – TheCloudlessSky

-2

कोई डॉक्स कि मैं मिल सकता है पर दिए गए कारण है। मेरा सबसे अच्छा अनुमान यह है कि यदि आप युगल के साथ काम कर रहे हैं, तो संभावना है कि आप युगल पर डबल ऑपरेशन करने के लिए कोई भी ऑपरेशन चाहते हैं। एक int को डालने के लिए इसे गोल करने के लिए भाषा डिजाइनर द्वारा कम आम तौर पर गोलाकार और डबल के रूप में माना जाता है।

आप अपनी खुद की विधि है कि कोड के बारे में 2 लाइनों, और ढेर अतिप्रवाह पर कोई प्रश्न पोस्ट करने से बहुत कम काम में आप के लिए एक पूर्णांक के लिए यह डाली ...

+2

निश्चित रूप से अपने आप को लिखना मुश्किल है, लेकिन मार्क का जवाब अंतर्दृष्टि प्रदान करता है। StackOverflow हमेशा 'कैसे' के बारे में नहीं है, मुझे इसे 'क्यों' के लिए पसंद है :) – si618

+3

-1 - मुझे पता है * कैसे *, मैं सोच रहा हूं * क्यों *। आपका जवाब भी समझ में नहीं आता है। – TheCloudlessSky

8

मैं मार्क के जवाब से सहमत लिख सकता है कि परिणाम long में फिट नहीं हो सकता है, लेकिन आप सोच सकते हैं: क्या होगा यदि सी # में long प्रकार लंबा था? ठीक है, यहाँ क्या अजगर में क्या होता है के साथ यह आर्बिटरी-लंबाई पूर्णांकों है:

>>> round(1.23e45) 
1229999999999999973814869011019624571608236032 

अंक के अधिकांश फ्लोटिंग प्वाइंट त्रुटि गोलाई से 'शोर' कर रहे हैं। शायद Round/Floor/Ceiling के लिए प्रेरणा का हिस्सा सी # में double लौटने पर झूठी परिशुद्धता के भ्रम से बचने के लिए था।

एक वैकल्पिक स्पष्टीकरण यह है कि .NET Math मॉड्यूल सी में लिखे गए कोड का उपयोग करता है, जिसमें floor और ceil रिटर्न फ़्लोटिंग-पॉइंट प्रकार लौटाते हैं।

2

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

क्या यह सच है, या क्या मुझे कुछ याद आ रहा है? आईईईई फ्लोटिंग पॉइंट मानक में पूर्णांक के सटीक प्रतिनिधित्व के बारे में कुछ है, लेकिन मुझे यकीन नहीं है कि यह कास्ट सुरक्षित है या नहीं।

मैं फ़ंक्शन में रेंज जांच कर रहा हूं (अगर इसे ओवरफ़्लो से बचने के लिए आवश्यक है) और एक लंबा लौटाएं। अपने निजी कोड के लिए, मैं रेंज जांच को छोड़ सकता हूं। मैं यह कर दिया गया है:

long int_floor(double x) 
{ 
    double remainder; 
    long truncate; 
    truncate = (long) x;  // rounds down if + x, up if negative x 
    remainder = x - truncate; // normally + for + x, - for - x 
    //....Adjust down (toward -infinity) for negative x, negative remainder 
    if (remainder < 0 && x < 0) 
     return truncate - 1; 
    else 
     return truncate; 
} 

प्रतिलेख नकारात्मक और सकारात्मक संख्या के लिए अलग अलग विचार के साथ ceil() और round() लिए मौजूद हैं।

+0

यदि कोई चाहता है कि फ़्लोटिंग-पॉइंट वैल्यू को उन चीज़ों पर मैप करना है जो कोड को दिए जा सकते हैं जिन्हें 'इंट 32' या' इंट 64 'की आवश्यकता होती है, जिसमें राउंड-टू-नजदीकी-यहां तक ​​कि या राउंड-ओर का उपयोग करके सीधे मैपिंग करने के तरीके हैं -निवेशी-अनंत मददगार होगा। – supercat

+0

फ्लोट पर एक राउंड-टू-इंटीजर ऑपरेशन एक गोलाकार त्रुटि नहीं बना सकता जो वर्तमान में मौजूद नहीं था, क्योंकि एक आंशिक भाग के साथ सबसे बड़ी संख्या के ऊपर पूर्णांक सटीक रूप से प्रतिनिधित्व योग्य है। – supercat

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