c++ - 将 32 位 float 映射到 32 位整数

标签 c++ c floating-point

有没有办法将 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/

相关文章:

c - dladdr 不返回函数名

C++静态分配双端队列实现

c++ - 使用 Qt 的 QGraphicsScene/QGraphicsView 进行 2D 游戏

c - 如果++(前/后)有更高的优先级,为什么先评估&&?

C正确访问数组

floating-point - 维护大量 float 的总数

c++ - ^ =在c/c++中是什么意思?

c# - 在Windows中访问其他一些特定于应用程序的卷

Python 中的 C# BitConverter.ToSingle 等价物

python - 如何正确舍入半 float ?