क्या C (++) प्रोग्राम में सबसे छोटे ऋणात्मक मान (जैसे नकारात्मक अनंत का उपयोग करने के लिए) का प्रतिनिधित्व करने के लिए एक मानक और / या पोर्टेबल तरीका है?
फ्लोट में DBL_MIN.h सबसे छोटी पॉजिटिव संख्या है।
क्या C (++) प्रोग्राम में सबसे छोटे ऋणात्मक मान (जैसे नकारात्मक अनंत का उपयोग करने के लिए) का प्रतिनिधित्व करने के लिए एक मानक और / या पोर्टेबल तरीका है?
फ्लोट में DBL_MIN.h सबसे छोटी पॉजिटिव संख्या है।
जवाबों:
-DBL_MAX
एएनएसआई सी में , जिसे फ्लोट में परिभाषित किया गया है।
-DBL_MAX
बिल्कुल प्रतिनिधित्व करने की आवश्यकता है, इसलिए यदि एफपी हार्डवेयर इसके लिए सक्षम नहीं है, तो कार्यान्वयन को बस इसके चारों ओर काम करना होगा। 5.2.4.2.2 में फ्लोटिंग-पॉइंट मॉडल देखें। फ़्लोटिंग प्रकार के लक्षण <फ़्लोट.एच> सी 2 के सी 99 (तब से कहीं और ले जाया जा सकता है)।
DBL_MAX
वास्तव में (1 - b ^ −p) b ^ e_max है, जो वास्तव में प्रतिनिधित्व योग्य है, सबसे नकारात्मक परिमित मूल्य बिल्कुल है - (1 - b ^ Andp) b ^ e_max, और चूँकि ऐसा बिल्कुल होता है -DBL_MAX
, इसलिए DBL_MAX
किसी भी गोलाई में त्रुटियों का परिचय नहीं दिया जा सकता है ।
फ़्लोटिंग पॉइंट नंबर (IEEE 754) सममित हैं, इसलिए यदि आप सबसे बड़ा मान ( DBL_MAX
या numeric_limits<double>::max()
) का प्रतिनिधित्व कर सकते हैं, तो बस एक ऋण चिह्न का संकेत दें।
और फिर अच्छा तरीका है:
double f;
(*((long long*)&f))= ~(1LL<<52);
सी में, का उपयोग करें
#include <float.h>
const double lowest_double = -DBL_MAX;
C ++ पूर्व -11 में, उपयोग करें
#include <limits>
const double lowest_double = -std::numeric_limits<double>::max();
C ++ 11 और बाद में, का उपयोग करें
#include <limits>
constexpr double lowest_double = std::numeric_limits<double>::lowest();
min()
C ++ 11 से पहले फ़ंक्शन उपलब्ध नहीं था ? या कि एक अलग मूल्य से है -max()
? en.cppreference.com/w/cpp/types/numeric_limits
min
आपको परिमाण में सबसे छोटा सकारात्मक मान और परिमाण lowest
में सबसे बड़ा ऋणात्मक मान प्राप्त होता है। हाँ, यह भयानक है। C ++ मानक पुस्तकालय की शानदार दुनिया में आपका स्वागत है :-P
।
float.h
। limits.h
पूर्णांक के लिए है
इसे इस्तेमाल करे:
-1 * numeric_limits<double>::max()
संदर्भ: numeric_limits
यह वर्ग प्रत्येक मौलिक प्रकारों के लिए विशिष्ट है, जिसके सदस्य वापस लौटते हैं या उन विभिन्न मूल्यों पर सेट होते हैं जो उस प्रकार के गुणों को परिभाषित करते हैं जो उस विशिष्ट प्लेटफ़ॉर्म में हैं जिसमें वह संकलित करता है।
-numeric_limits<double>::max()
?
-1 * ...
इसे थोड़ा स्पष्ट करने के लिए उपयोग करें।
क्या आप वास्तविक अनंत या न्यूनतम परिमित मूल्य की तलाश कर रहे हैं? यदि पूर्व, का उपयोग करें
-numeric_limits<double>::infinity()
जो केवल अगर काम करता है
numeric_limits<double>::has_infinity
अन्यथा, आपको उपयोग करना चाहिए
numeric_limits<double>::lowest()
जो C ++ 11 में पेश किया गया था।
यदि lowest()
उपलब्ध नहीं है, तो आप वापस आ सकते हैं
-numeric_limits<double>::max()
जो lowest()
सिद्धांत से भिन्न हो सकता है , लेकिन सामान्य रूप से व्यवहार में नहीं आता है।
-numeric_limits<double>::max()
भले ही यह व्यवहार में काम करता है सिद्धांत में पूरी तरह से पोर्टेबल नहीं है।
C ++ 11 से आप उपयोग कर सकते हैं numeric_limits<double>::lowest()
। मानक के अनुसार, यह वही देता है जो आप खोज रहे हैं:
एक परिमित मूल्य x ऐसा है कि जहाँ कोई अन्य परिमित मूल्य y नहीं है
y < x
।
जिसमें सभी विशेषज्ञता के लिए सार्थकis_bounded != false
।
इसके लिए कई जवाब दिए जा रहे हैं -std::numeric_limits<double>::max()
।
सौभाग्य से, वे ज्यादातर मामलों में अच्छा काम करेंगे। फ़्लोटिंग पॉइंट एन्कोडिंग योजनाएं एक मंटिसा और एक घातांक में एक संख्या को विघटित करती हैं और उनमें से अधिकांश (जैसे लोकप्रिय IEEE-754 ) एक अलग साइन बिट का उपयोग करती हैं, जो मंटिसा से संबंधित नहीं है। यह केवल साइन को फ़्लिप करके सबसे छोटे ऋणात्मक में सबसे बड़े सकारात्मक को बदलने की अनुमति देता है:
मानक किसी भी फ्लोटिंग पॉइंट मानक को लागू नहीं करता है।
मैं सहमत हूं कि मेरा तर्क थोड़ा सा सिद्धांतवादी है, लेकिन मान लीजिए कि कुछ एक्सटेंट्रिक कंपाइलर निर्माता एक क्रांतिकारी एन्कोडिंग योजना का उपयोग करेंगे जिसमें एक दो के पूरक के कुछ रूपों में एन्कोड किया गया मंटिसा है । दो के पूरक एन्कोडिंग सममित नहीं हैं। उदाहरण के लिए एक हस्ताक्षरित 8 बिट चार के लिए अधिकतम सकारात्मक 127 है, लेकिन न्यूनतम नकारात्मक -128 है। तो हम कल्पना कर सकते हैं कि कुछ फ्लोटिंग पॉइंट एन्कोडिंग समान असममित व्यवहार दिखाते हैं।
मुझे उस तरह की किसी भी एन्कोडिंग योजना के बारे में पता नहीं है, लेकिन मुद्दा यह है कि मानक यह गारंटी नहीं देता है कि साइन फ़्लिप करने से इच्छित परिणाम प्राप्त होता है । तो इस लोकप्रिय उत्तर (क्षमा करें दोस्तों!) को पूरी तरह से पोर्टेबल मानक समाधान के रूप में नहीं माना जा सकता है! / * कम से कम ऐसा नहीं है यदि आपने दावा नहीं किया है कि numeric_limits<double>::is_iec559
यह सच है / /
मूल प्रश्न अनंत की चिंता करता है। तो, क्यों नहीं उपयोग करें
#define Infinity ((double)(42 / 0.0))
IEEE परिभाषा के अनुसार? आप निश्चित रूप से इसे नकार सकते हैं।
numeric_limits<double>::has_infinity && ! numeric_limits<double>::traps
क्या C (++) प्रोग्राम में सबसे छोटे ऋणात्मक मान (जैसे नकारात्मक अनंत का उपयोग करने के लिए) का प्रतिनिधित्व करने के लिए एक मानक और / या पोर्टेबल तरीका है?
C दृष्टिकोण।
कई कार्यान्वयन +/- शिशुओं का समर्थन करते हैं, इसलिए सबसे नकारात्मक double
मूल्य है -INFINITY
।
#include <math.h>
double most_negative = -INFINITY;
क्या कोई मानक और / या पोर्टेबल तरीका है ....?
अब हमें अन्य मामलों पर भी विचार करने की आवश्यकता है:
बस -DBL_MAX
।
मुझे उम्मीद है कि इस मामले में, ओपी पसंद करेगा -DBL_MAX
।
DBL_MAX
।यह एक असामान्य मामला है, ओपी की चिंता के बाहर होने की संभावना है। जब वांछित सीमा / पूर्वता प्राप्त करने के लिए फ्लोटिंग पॉइंटdouble
की एक जोड़ी के रूप में एन्कोड किया जाता है , ( डबल-डबल देखें ) वहाँ एक अधिकतम सामान्य और शायद एक अधिक डी-सामान्य मौजूद है। मैंने बहस देखी है कि दोनों में से सबसे बड़ी सामान्य को देखें । double
DBL_MAX
सौभाग्य से इस युग्मित दृष्टिकोण में आमतौर पर एक इनफिनिटी शामिल होती है, इसलिए सबसे नकारात्मक मूल्य बना रहता है -INFINITY
।
अधिक पोर्टेबिलिटी के लिए, कोड मार्ग से नीचे जा सकता है
// HUGE_VAL is designed to be infinity or DBL_MAX (when infinites are not implemented)
// .. yet is problematic with unsigned infinity.
double most_negative1 = -HUGE_VAL;
// Fairly portable, unless system does not understand "INF"
double most_negative2 = strtod("-INF", (char **) NULL);
// Pragmatic
double most_negative3 = strtod("-1.0e999999999", (char **) NULL);
// Somewhat time-consuming
double most_negative4 = pow(-DBL_MAX, 0xFFFF /* odd value */);
// My suggestion
double most_negative5 = (-DBL_MAX)*DBL_MAX;
यदि आपके पास फ्लोट अपवाद सक्षम नहीं है (जिसे आपको imho नहीं करना चाहिए), तो आप बस कह सकते हैं:
double neg_inf = -1/0.0;
इससे नकारात्मक अनंतता पैदा होती है। यदि आपको फ्लोट की आवश्यकता है, तो आप या तो परिणाम डाल सकते हैं
float neg_inf = (float)-1/0.0;
या एकल परिशुद्धता अंकगणित का उपयोग करें
float neg_inf = -1.0f/0.0f;
परिणाम हमेशा समान होता है, दोनों एकल और दोहरे परिशुद्धता में नकारात्मक अनंतता का एक ही प्रतिनिधित्व होता है, और वे एक-दूसरे में परिवर्तित होते हैं जैसा कि आप उम्मीद करेंगे।
-INFINITY
neg_inf
एक स्थिर मूल्य के लिए इनिशियलाइज़ किया गया है । संकलक inf
मूल्य की गणना का ध्यान रखेगा । और जब आप इसे अधिकतम कंप्यूटिंग के लिए अशक्त मान के रूप में उपयोग करते हैं, तो पहला पुनरावृत्ति आम तौर पर इसे एक बड़े मूल्य के साथ अधिलेखित कर देगा। यानी प्रदर्शन शायद ही एक समस्या है। और ओपी विशेष रूप से "उदासीनता का उपयोग करने के लिए उदासीनता" के बारे में पूछता है, और -inf
वास्तव में इसका एकमात्र सही उत्तर है। आपने एक सही और उपयोगी उत्तर दिया है।