सबसे पहले, आप यह सुनिश्चित करें कि आप वास्तव में पर्याप्त रूप से कई अंक प्रिंट double
के सभी प्रदर्शनीय मान प्रदर्शित होते सुनिश्चित करने के लिए की जरूरत है। आप इस इस प्रकार है (इस के लिए सुनिश्चित करें कि आप #include <iomanip>
बनाने) कर सकते हैं:
std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::max_digits10) << getMax(a) << std::endl;
दूसरे, numeric_limits<>::min
इस के लिए उपयुक्त नहीं है। यदि आपका प्रारंभिक मान 1.0
है, तो आप numeric_limits<double>::epsilon
का उपयोग कर सकते हैं, जो 1.0
से सबसे छोटा अंतर है जो प्रतिनिधित्व योग्य है।
हालांकि, आपके कोड उदाहरण में, प्रारंभिक मान 32
है। Epsilon जरूरी नहीं है कि इसके लिए काम करते हैं। इस मामले में सही ईपीएसलॉन की गणना करना मुश्किल है।
#include <iostream>
#include <limits>
#include <iomanip>
#include <cmath>
double getMax(double a)
{
return std::nextafter(a,std::numeric_limits<double>::lowest());
}
int main()
{
double a = 32;
std::cout << std::scientific
<< std::setprecision(std::numeric_limits<double>::max_digits10)
<< getMax(a)
<< std::endl;
return 0;
}
मैं भी यह liveworkspace पर डाल दिया है:
हालांकि, अगर आप सी ++ 11 उपयोग कर सकते हैं (*), वहाँ cmath
शीर्षक में एक समारोह के लिए आप क्या std::nextafter
की आवश्यकता है वह यह है कि ।
व्याख्या करने के लिए:
double nextafter(double from, double to);
करने की दिशा में से की अगली प्रदर्शनीय मान देता है। तो मैंने यह सुनिश्चित करने के लिए निर्दिष्ट किया है कि आपको अगले प्रतिनिधित्व योग्य मान तर्क से कम मिलता है।
(*) नीचे टोनी डी की टिप्पणी देखें। आपके पास C++ 11 के बिना nextafter()
तक पहुंच हो सकती है।
नीचे दिए गए सभी ने कहा, 'getMax' खुले अंतराल के लिए समझ में नहीं आता है और ['getSup'] (http://en.wikipedia.org/wiki/Supremum) को 1 बिल्कुल वापस करना चाहिए। –