繁体   English   中英

将32位浮点映射到32位整数

[英]Map a 32 bit float to a 32 bit integer

有没有办法将浮点数映射到整数或无符号整数,以便除NaN外,保留顺序?

所以如果a和b是浮点数,而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位,你可以使用它。


有趣的事实:本书继续使用它(注意,不是我提供的确切代码,因为我剥离了float-to-int部分)来比较浮点值和容差:

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无分支版本提出了相同的想法,但你必须购买这本书。 :)

只是为了消除潜在的慢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();
}

请注意,与其他解决方案不同,这会错误地处理0-0 作为浮点数,它们比较相等,但在映射到整数后,它们分别变为0-1 作为数字行中的单个打嗝,我不认为没有分支指令就可以轻松处理这种情况。

当然,这假设是两个补码算术, float是IEEE 754单个,相同的字节顺序和浮点数和整数的相同地址空间等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM