असल में, मैं float16
प्रकार को लागू करना चाहता हूं। लेकिन यह सवाल यह नहीं है कि इसे कैसे किया जाए, लेकिन इसके बजाय चीजों को कैसे सेट अप करें ताकि मेरा नया फ्लोट 16 प्रकार फ्लोट, डबल और सभी पूर्णांक प्रकारों के साथ उचित तरीके से व्यवहार कर सके।सी ++ 11 में, मैं एक अंकगणितीय प्रकार को कैसे कार्यान्वित कर सकता हूं जो बिल्टिन प्रकारों के पदानुक्रम में फिट बैठता है?
मुझे अपने float16
प्रकार के लिए समान रूप से फ़्लोट या डबल के रूप में परिवर्तित करने के लिए क्या चाहिए। उदाहरण के लिए, इसे इन दोनों प्रकारों में निहित रूप से डालना चाहिए। इसमें std :: common_type (http://en.cppreference.com/w/cpp/types/common_type) भी इसके लिए समान रूप से व्यवहार करना चाहिए क्योंकि यह std :: common_types अन्य फ्लोट प्रकारों के लिए व्यवहार करता है। इसका मतलब है कि std::common_type<my_float16, float>::type = float
, std::common_type<my_float16, double>::type = double
, और std::common_type<my_float16, T>::type = my_float16
जहां T
कोई पूर्णांक प्रकार है।
इस काम को करने के लिए मुझे किस रचनाकार और कलाकार ऑपरेटरों को लिखने की आवश्यकता है? किसी भी सहायता की सराहना की जाएगी!
मेरा other recent question संबंधित हो सकता है।
संपादित करें: ठीक है, मैंने एंटोन की तरह एक न्यूनतम उदाहरण बनाया है। यह
struct float16 {
explicit operator int() {
return 0;
}
operator float() {
return 0.0f;
}
};
यह फ्लोट और फ्लोट 16 के लिए सही सामान्य प्रकार है, लेकिन int और float16 के लिए सामान्य प्रकार अभी भी int है। मझे यह समझ में नहीं आता कि।
अपने प्रश्न का उत्तर देने का प्रयास करने के बाद मुझे एक [GCC में अच्छी बग] मिली है (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66615) जो पूरे विचार को बहुत खतरनाक बना सकता है –
मई मैं पूछता हूं कि किसी को कभी 16 बिट्स फ्लोट की आवश्यकता क्यों होगी? क्या यह सिर्फ एक अभ्यास है? – DarioP
इसे आधा परिशुद्धता कहा जाता है, और ग्राफिक्स और अन्य चीजों में अनुप्रयोग हैं - https://en.wikipedia.org/wiki/Half-precision_floating-point_format देखें। मैं एक फ्लोट 128 प्रकार को भी कार्यान्वित करना चाहता हूं, जिस पर एक ही प्रश्न लागू होता है। – user2333829