हम्म, बस खेल प्रोग्रामिंग रत्न 6 में DawsonCompare
दिनचर्या से बाहर है, यह एक सामान्य सा कलाकारों निशानी फ्लिप के बाद है (के बाद से नकारात्मक तैरता विपरीत तो नकारात्मक पूर्णांक आदेश)। मैं उस विचार को उधार लेगा।
आपके पास:
// utility
template <typename R, typename T>
R& bit_cast(T& pX)
{
return reinterpret_cast<R&>(pX);
}
// int32_t defined in <boost/cstdint.hpp>.
boost::int32_t float_to_int_bits(float pX)
{
boost::int32_t x = bit_cast<boost::int32_t>(pX);
if (x < 0)
x = 0x80000000 - x;
return x;
}
आप अपने int
है 32 बिट गारंटी ले सकते हैं, तो आप बस का उपयोग कर सकते हैं।
मज़ेदार तथ्य: पुस्तक (, टिप्पणी, सटीक कोड मैं उपस्थित साथ नहीं के बाद से मैं नाव-टू-पूर्णांक भाग बाहर छीन) इस का उपयोग करने के सहिष्णुता के साथ चल बिन्दु मानों की तुलना करने पर चला जाता है:
bool DawsonCompare(float pX, float pY, int pDiff)
{
int x = float_to_int_bits(pX);
int y = float_to_int_bits(pY);
int diff = x - y;
return abs(diff) < pDiff;
}
यह तुलना पूरी तरह से तैरती है यदि उनके पूर्णांक प्रतिनिधित्व एक निश्चित सीमा के भीतर हैं। (वह 1000 को एक अच्छे डिफ़ॉल्ट के रूप में उपयोग करता है।) LomontCompare
नामक शाखा-कम संस्करण को एक ही विचार के साथ प्रस्तुत किया जाता है, लेकिन आपको इसके लिए पुस्तक खरीदनी होगी। :)
हाँ, मुझे लगता है कि मैंने पहले इस तरह के एक मानचित्रण देखा है - यह था काफी चालाक - मैं बस चाहता हूं कि मुझे याद आए * जहां * मैंने इसे देखा ... –
क्या मैं इस तरह के मैपिंग के लिए आपके उपयोग के मामले से पूछ सकता हूं? –
+1 महान प्रश्न –