有没有办法将 float 映射到整数或无符号整数,以便除 NaN 之外的顺序保持不变?
所以如果a和b是 float ,F是映射函数,
a < b 意味着 F(a) < F(b) 和 a == b 意味着 F(a) == F(b)
最佳答案
嗯,就在 Game Programming Gems 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;
}
如果它们的整数表示在某个范围内,这会将 float 比较为真。 (他使用 1000 作为一个很好的默认值。)一个名为 LomontCompare
的无分支版本提出了相同的想法,但你必须为此购买这本书。 :)
关于c++ - 将 32 位 float 映射到 32 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2775854/