সি ++ 03 স্ট্যান্ডার্ডটি স্ট্যান্ডার্ড সি লাইব্রেরিটির জন্য সি 90 স্ট্যান্ডার্ডের উপর নির্ভর করে যা সি ++ 03 স্টাডেন্টের আচ্ছাদিত (সি ++3 এর নিকটতম প্রকাশ্যে উপলব্ধ খসড়া স্ট্যান্ডার্ডটি এন 1804 ) বিভাগের 1.2
আদর্শ রেফারেন্স :
আইএসও / আইসিসি 9899: 1990 এর ধারা 7 এবং আইএসও / আইসিসি 9899 / এমডি 1: 1995 এর ধারা 7 এ বর্ণিত গ্রন্থাগারটির পরবর্তীকালে স্ট্যান্ডার্ড সি লাইব্রেরি নামে পরিচিত। 1)
আমরা যদি সিপ্রেফারেন্সের উপর রাউন্ড, লাউন্ড, ললাউন্ডের জন্য সি ডকুমেন্টেশনে যাই আমরা দেখতে পারি যে বৃত্তাকার এবং সম্পর্কিত ফাংশনগুলি C99 এর অংশ এবং সুতরাং সি ++ 03 বা তার আগে পাওয়া যাবে না।
সি ++ ১১-এ এই পরিবর্তনগুলি যেহেতু সি ++ 11 সি স্ট্যান্ডার্ড লাইব্রেরির জন্য সি 99 খসড়া স্ট্যান্ডার্ডের উপর নির্ভর করে এবং তাই স্ট্যান্ড :: গোল করে এবং অবিচ্ছেদ্য ফেরতের প্রকারের জন্য স্ট্যান্ড :: লাউন্ড, স্ট্যান্ড :: লাউন্ড :
#include <iostream>
#include <cmath>
int main()
{
std::cout << std::round( 0.4 ) << " " << std::lround( 0.4 ) << " " << std::llround( 0.4 ) << std::endl ;
std::cout << std::round( 0.5 ) << " " << std::lround( 0.5 ) << " " << std::llround( 0.5 ) << std::endl ;
std::cout << std::round( 0.6 ) << " " << std::lround( 0.6 ) << " " << std::llround( 0.6 ) << std::endl ;
}
সি 99 এর থেকে অন্য বিকল্পটি হবে স্ট্যান্ড :: ট্রাঙ্ক যা:
আর্গুমেন্টের চেয়ে নিকটতম পূর্ণসংখ্যার পরিমাপ বৃহত্তর নয়।
#include <iostream>
#include <cmath>
int main()
{
std::cout << std::trunc( 0.4 ) << std::endl ;
std::cout << std::trunc( 0.9 ) << std::endl ;
std::cout << std::trunc( 1.1 ) << std::endl ;
}
আপনার যদি নন সি ++ ১১ টি অ্যাপ্লিকেশন সমর্থন করতে হয় তবে আপনার সেরা বাজি হ'ল বুস্ট রাউন্ড, বেহাল, লাউন্ড, লাউন্ডাউন্ড বা বুস্ট ট্রাঙ্ক ব্যবহার করা ।
আপনার নিজের সংস্করণটি বৃত্তাকারে ঘূর্ণন করা শক্ত
নিজের ঘূর্ণায়মান সম্ভবত এটির চেয়ে কঠোর প্রচেষ্টাটির মতো নয়: নিকটতম পূর্ণসংখ্যার দিকে গোলাকার ভাসা, অংশ 1 , নিকটতম পূর্ণসংখ্যার কাছে রাউন্ডিং ফ্লোট, অংশ 2 এবং নিকটতম পূর্ণসংখ্যার কাছে রাউন্ডিং ফ্লোট, অংশ 3 ব্যাখ্যা করুন:
উদাহরণস্বরূপ একটি সাধারণ রোল আপনার প্রয়োগটি ব্যবহার করে std::floor
যুক্ত করা 0.5
সমস্ত ইনপুটগুলিতে কাজ করে না:
double myround(double d)
{
return std::floor(d + 0.5);
}
এটির জন্য একটি ইনপুট ব্যর্থ হবে 0.49999999999999994
এটির , ( এটি সরাসরি দেখুন )।
আর একটি সাধারণ বাস্তবায়নের মধ্যে একটি অবিচ্ছেদ্য প্রকারে ভাসমান পয়েন্ট টাইপ করা জড়িত, যা অবিচ্ছেদ্য অংশটিকে গন্তব্য প্রকারের মধ্যে প্রতিনিধিত্ব করা যায় না এমন ক্ষেত্রে অনির্ধারিত আচরণের আবেদন করতে পারে। আমরা এটি খসড়া সি ++ স্ট্যান্ডার্ড বিভাগ থেকে ভাসমান-ইন্টিগ্রাল রূপান্তরগুলি থেকে দেখতে পারি4.9
যা ( জোর আমার ):
ভাসমান বিন্দু প্রকারের একটি অগ্রগতি পূর্ণসংখ্যার প্রকারে রূপান্তরিত হতে পারে। রূপান্তর কাটা; অর্থাৎ, ভগ্নাংশ অংশ বাতিল করা হয়।যদি কাটা মানটি গন্তব্যের ধরণে প্রতিনিধিত্ব না করা যায় তবে আচরণটি অপরিজ্ঞাত। [...]
উদাহরণ স্বরূপ:
float myround(float f)
{
return static_cast<float>( static_cast<unsigned int>( f ) ) ;
}
প্রদত্ত std::numeric_limits<unsigned int>::max()
হল4294967295
নিম্নলিখিত কল:
myround( 4294967296.5f )
উপচে পড়বে, এটি সরাসরি দেখুন )।
আমরা দেখতে পাচ্ছি যে সি তে বৃত্তাকার () বাস্তবায়নের সংক্ষিপ্ত উপায়টির উত্তরটি দেখে এটি সত্যই কতটা কঠিন ? যা newlibs রেফারেন্সিং একক নির্ভুলতা ভাসমান রাউন্ডের সংস্করণ । এটি সহজ মনে হয় এমন কোনও কিছুর জন্য খুব দীর্ঘ ফাংশন। এটি অসম্ভব বলে মনে হচ্ছে যে ভাসমান পয়েন্ট বাস্তবায়নের অন্তরঙ্গ জ্ঞান ছাড়াই যে কেউ এই ফাংশনটি সঠিকভাবে প্রয়োগ করতে পারে:
float roundf(x)
{
int signbit;
__uint32_t w;
/* Most significant word, least significant word. */
int exponent_less_127;
GET_FLOAT_WORD(w, x);
/* Extract sign bit. */
signbit = w & 0x80000000;
/* Extract exponent field. */
exponent_less_127 = (int)((w & 0x7f800000) >> 23) - 127;
if (exponent_less_127 < 23)
{
if (exponent_less_127 < 0)
{
w &= 0x80000000;
if (exponent_less_127 == -1)
/* Result is +1.0 or -1.0. */
w |= ((__uint32_t)127 << 23);
}
else
{
unsigned int exponent_mask = 0x007fffff >> exponent_less_127;
if ((w & exponent_mask) == 0)
/* x has an integral value. */
return x;
w += 0x00400000 >> exponent_less_127;
w &= ~exponent_mask;
}
}
else
{
if (exponent_less_127 == 128)
/* x is NaN or infinite. */
return x + x;
else
return x;
}
SET_FLOAT_WORD(x, w);
return x;
}
অন্যদিকে যদি অন্য কোনও সমাধানের ব্যবহারযোগ্য না হয় তবে এটি সম্ভাব্যভাবে একটি বিকল্প হতে পারে কারণ এটি একটি ভাল পরীক্ষামূলক বাস্তবায়ন।
std::cout << std::fixed << std::setprecision(0) << -0.9
, উদাহরণস্বরূপ।