कहें कि मेरे पास [0, 1] की सीमा में एक फ्लोट है और मैं इसे एक हस्ताक्षरित बाइट में मात्राबद्ध और स्टोर करना चाहता हूं। एक नहीं brainer की तरह लगता है, लेकिन वास्तव में यह काफी जटिल है:इंटीजर रेंज में फ़्लोट रेंज को कनवर्ट/क्वांटिज़ करें
स्पष्ट समाधान इस तरह दिखता है:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f);
}
यह अब तक कि मैं 0 से 255 तक सभी नंबरों को मिल में काम करता है, लेकिन वितरण पूर्णांक का भी नहीं है। फ़ंक्शन केवल देता है यदि कोई 1.0f
है। अच्छा समाधान नहीं है।
अगर मैं उचित राउंडिंग करना मैं सिर्फ समस्या बदलाव:
unsigned char QuantizeFloat(float a)
{
return (unsigned char)(a * 255.0f + 0.5f);
}
यहाँ परिणाम 0
केवल किसी अन्य संख्या की तुलना में नाव दूरी के आधे को शामिल किया गया।
मैं फ़्लोटिंग पॉइंट रेंज के बराबर वितरण के साथ क्वांटिज़ेशन कैसे करूं? आदर्श रूप से मैं पूर्णांक वितरित यादृच्छिक फ्लोट को मापने पर पूर्णांक का बराबर वितरण प्राप्त करना चाहता हूं।
कोई विचार?
बीटीडब्ल्यू: मेरा कोड सी में भी समस्या है भाषा-अज्ञेयवादी। गैर-सी लोगों के लिए: बस मान लें कि float
से int
रूपांतरण फ़्लोट को कम करता है।
संपादित करें: जब से हम कुछ भ्रम की स्थिति यहाँ था: मैं एक मानचित्रण कि (0) सबसे छोटी अहस्ताक्षरित चार छोटी इनपुट नाव नक्शे, और मेरे रेंज (1.0f) के उच्चतम नाव उच्चतम अहस्ताक्षरित बाइट की जरूरत है (255)।
वाह - हाँ, बस हो गया! –
हां - (हस्ताक्षरित चार) (ए * 256.0 एफ) आपको 1.0 के अलावा प्रत्येक इनपुट मान के लिए बिल्कुल वही देता है जो आप चाहते हैं।सी में कोई अंतर्निहित न्यूनतम कार्य नहीं है, इसलिए यदि आप पहले से नहीं हैं तो आपको अपना खुद का लिखना होगा। –
जॉन, मैं एक ही परिणाम के साथ आया, बस एक्सेल स्प्रेडशीट से इसे सही तरीके से स्थानांतरित करने में सक्षम नहीं था। मैंने अपना शर्मनाक जवाब हटा दिया। – cdonner