C++ 将32位浮点映射为32位整数

C++ 将32位浮点映射为32位整数,c++,c,floating-point,C++,C,Floating Point,是否有一种方法可以将浮点映射到整数或无符号整数,以便除了NaN之外,保持顺序 如果a和b是浮点数,F是映射函数 a31; 返回i^-sgn和数值_限制::max(); } 请注意,与其他解决方案不同,这会错误地处理0和-0。当浮点数比较时,它们相等,但映射到整数后,它们分别变为0和-1。作为数字行中的一个小故障,我认为如果没有分支指令,处理这种情况是不容易的 当然,这假设两个的补码运算,float是IEEE 754单,相同的尾数和相同的地址空间,用于float和int等。Yes,我想我以前见过

是否有一种方法可以将浮点映射到整数或无符号整数,以便除了NaN之外,保持顺序

如果a和b是浮点数,F是映射函数

aa==b意味着F(a)==F(b)

Hm,在游戏编程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;
}

如果浮点数的整数表示在某个范围内,则将浮点数与true进行比较。(他使用1000作为一个很好的默认值。)一个称为
LomontCompare
的无分支版本提出了同样的想法,但你必须为此购买这本书。:)

只是为了从其他答案中消除潜在的慢速
if

int32_t float_to_int( float f ) {
    int32_t i = reinterpret_cast< int32_t& >( f );
    uint32_t sgn = static_cast< uint32_t >( i ) >> 31;

    return i ^ -sgn & numeric_limits<int32_t>::max();
}
int32\u t float\u到\u int(float f){
int32_t i=重新解释铸件(f);
uint32\u t sgn=静态铸造(i)>>31;
返回i^-sgn和数值_限制::max();
}
请注意,与其他解决方案不同,这会错误地处理
0
-0
。当浮点数比较时,它们相等,但映射到整数后,它们分别变为
0
-1
。作为数字行中的一个小故障,我认为如果没有分支指令,处理这种情况是不容易的


当然,这假设两个的补码运算,
float
是IEEE 754单,相同的尾数和相同的地址空间,用于float和int等。

Yes,我想我以前见过这样一个映射-它非常聪明-我只是希望我能记得我在哪里见过它…我可以问一下这样一个映射的用例吗?+1这里有一个很好的相关链接:啊,现在我明白了,
INT\u MIN
=>
INT\u MIN-INT\u MIN
。谢谢
int32_t float_to_int( float f ) {
    int32_t i = reinterpret_cast< int32_t& >( f );
    uint32_t sgn = static_cast< uint32_t >( i ) >> 31;

    return i ^ -sgn & numeric_limits<int32_t>::max();
}