प्रत्येक समय मैं Math.Round/Floor/Ceiling
का उपयोग करता हूं, मैं हमेशा int
(या शायद long
आवश्यक होने पर) कास्ट करता हूं। अगर वे हमेशा एक पूर्णांक लौट रहे हैं तो वे double
क्यों लौटते हैं।क्यों नहीं गणित। राउंड/मंजिल/छत लंबी या int वापसी?
उत्तर
परिणाम एक int (या एक लंबे) में फिट नहीं हो सकता है। एक डबल की सीमा बहुत अधिक है। डबल की
लगभग रेंज: ± 5.0 × 10 -324 ± 1.7 × 10
कोई डॉक्स कि मैं मिल सकता है पर दिए गए कारण है। मेरा सबसे अच्छा अनुमान यह है कि यदि आप युगल के साथ काम कर रहे हैं, तो संभावना है कि आप युगल पर डबल ऑपरेशन करने के लिए कोई भी ऑपरेशन चाहते हैं। एक int को डालने के लिए इसे गोल करने के लिए भाषा डिजाइनर द्वारा कम आम तौर पर गोलाकार और डबल के रूप में माना जाता है।
आप अपनी खुद की विधि है कि कोड के बारे में 2 लाइनों, और ढेर अतिप्रवाह पर कोई प्रश्न पोस्ट करने से बहुत कम काम में आप के लिए एक पूर्णांक के लिए यह डाली ...
निश्चित रूप से अपने आप को लिखना मुश्किल है, लेकिन मार्क का जवाब अंतर्दृष्टि प्रदान करता है। StackOverflow हमेशा 'कैसे' के बारे में नहीं है, मुझे इसे 'क्यों' के लिए पसंद है :) – si618
-1 - मुझे पता है * कैसे *, मैं सोच रहा हूं * क्यों *। आपका जवाब भी समझ में नहीं आता है। – TheCloudlessSky
मैं मार्क के जवाब से सहमत लिख सकता है कि परिणाम long
में फिट नहीं हो सकता है, लेकिन आप सोच सकते हैं: क्या होगा यदि सी # में long
प्रकार लंबा था? ठीक है, यहाँ क्या अजगर में क्या होता है के साथ यह आर्बिटरी-लंबाई पूर्णांकों है:
>>> round(1.23e45)
1229999999999999973814869011019624571608236032
अंक के अधिकांश फ्लोटिंग प्वाइंट त्रुटि गोलाई से 'शोर' कर रहे हैं। शायद Round
/Floor
/Ceiling
के लिए प्रेरणा का हिस्सा सी # में double
लौटने पर झूठी परिशुद्धता के भ्रम से बचने के लिए था।
एक वैकल्पिक स्पष्टीकरण यह है कि .NET Math
मॉड्यूल सी में लिखे गए कोड का उपयोग करता है, जिसमें floor और ceil रिटर्न फ़्लोटिंग-पॉइंट प्रकार लौटाते हैं।
रेंज तर्क अलग-अलग हैं, इनमें से कोई भी जवाब मुझे बताता है कि, मेरे लिए कोई फ़्लोटिंग पॉइंट नंबर लौटने के साथ एक मौलिक समस्या है जब आप वास्तव में एक सटीक पूर्णांक चाहते हैं। ऐसा लगता है कि गणना की गई फ्लोटिंग पॉइंट संख्या वांछित पूर्णांक से कम या उससे अधिक हो सकती है, इसलिए एक छोटे से गोल ऑफ त्रुटि से, इसलिए कास्ट ऑपरेशन एक त्रुटि से बंद कर सकता है। मुझे लगता है कि, कास्टिंग के बजाय, आपको 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()
लिए मौजूद हैं।
यदि कोई चाहता है कि फ़्लोटिंग-पॉइंट वैल्यू को उन चीज़ों पर मैप करना है जो कोड को दिए जा सकते हैं जिन्हें 'इंट 32' या' इंट 64 'की आवश्यकता होती है, जिसमें राउंड-टू-नजदीकी-यहां तक कि या राउंड-ओर का उपयोग करके सीधे मैपिंग करने के तरीके हैं -निवेशी-अनंत मददगार होगा। – supercat
फ्लोट पर एक राउंड-टू-इंटीजर ऑपरेशन एक गोलाकार त्रुटि नहीं बना सकता जो वर्तमान में मौजूद नहीं था, क्योंकि एक आंशिक भाग के साथ सबसे बड़ी संख्या के ऊपर पूर्णांक सटीक रूप से प्रतिनिधित्व योग्य है। – supercat
- 1. क्यों गणित। छत (डबल ए) सीधे int वापस नहीं?
- 2. सी ++ में डिफ़ॉल्ट 'हस्ताक्षरित लंबी int' द्वारा `int` है?
- 3. "वापसी list.sort()" वापसी क्यों नहीं करती है, सूची नहीं?
- 4. मैथ क्यों नहीं है। राउंड एक int वापस?
- 5. क्यों इस लंबी पूर्णांक अतिप्रवाह
- 6. दशमलव क्यों है। डाइवइड (int, int) काम, लेकिन नहीं (int/int)?
- 7. ग्रहण/जावा - आरस्ट्रिंग में मान। * वापसी int?
- 8. ctor अनुमति नहीं वापसी प्रकार
- 9. वापसी 0 वैकल्पिक क्यों है?
- 10. PHP में, "या मर()" काम क्यों करता है, लेकिन "या वापसी" नहीं करता है?
- 11. ऑडियोRecord.getMinBufferSize वापसी क्यों ERROR_BAD_VALUE (-2)?
- 12. क्यों HttpContext.Current.User.Identity.Name वापसी खाली
- 13. इनपुट स्ट्रीम। वापसी वापसी 0 या -1?
- 14. क्यों जावा कैलेंडर सेट (int वर्ष, int month, int date) सही तिथि नहीं लौटा रहा है?
- 15. सी या सी ++ वापसी स्थिति
- 16. गणित
- 17. अन्यथा या वापसी?
- 18. लूप या बाहरी लूप के लिए वापसी
- 19. लंबी या int की अपेक्षा करने वाली विधि को कैसे पास किया जाए?
- 20. यूंट या int
- 21. गणित
- 22. इंटेल एसएसई: 'फ्लोट` के बजाय `_mm_extract_ps` वापसी` int` क्यों करता है?
- 23. क्यों हास्केल की Prelude.read एक वापसी वापस नहीं करता है?
- 24. गणित
- 25. क्यों छवियाँ.मीडिया.इन्सर्ट इमेज वापसी शून्य
- 26. गणित
- 27. GetCurrentProcess वापसी -1 क्यों करता है?
- 28. गणित
- 29. File.mkdir या mkdirs झूठी वापसी - कारण?
- 30. वापसी नहीं के बराबर
उन्होंने कहा या सवाल में लंबे समय तक। – bwawok
बिंदु एक ही रहता है।एक 'डबल' 9 223372036854775807 से बड़ा हो सकता है। – dan04
मुझे लगा कि यह कारण होगा लेकिन बस यह सुनिश्चित करना चाहता था। स्पष्ट रूप से एक पूर्णांक के लिए गोल * लंबे समय से बड़ा * * अधिकांश अनुप्रयोगों के लिए दुर्लभ है *, माइक्रोसॉफ्ट को अभी भी इसे गणितीय रूप से समझने के लिए लागू करना था। धन्यवाद! – TheCloudlessSky