在编译时为任何浮点数找到最接近2的幂

时间:2017-01-18 13:27:40

标签: c

我需要将所有浮点数除以[-1,1]范围,除以最接近的次幂<2。代码需要是Q0.31定点,所以没有浮动。

例如,10.75将除以16,20.91乘32,1000.17乘1024等,一直到2 ^ 31。

我需要在编译时完成缩放。

例如:

#define PARAMETER1 10.0f // this could be changed in various builds
#define PARAMETER1_SCALE ( CALC_SCALE(PARAMETER1) )

#define float_to_fixed(x) ( (int)( (float)(x)*(float)0x80000000 ) )

int main()
{
    int par1 = float_to_fixed( PARAMETER1/PARAMETER1_SCALE );

    // use par1 here
    // ...
    // then descale using PARAMETER1_SCALE again      
}

是否有C宏CALC_SCALE会计算出来?

2 个答案:

答案 0 :(得分:3)

这个怎么样:

#include <math.h>

#define collapse(value) (value < 0 ? value / pow(2, ceil(log2(value * -1))) : value / pow(2, ceil(log2(value)))) 

int main() {
    cout << collapse(10.75) << endl;
    cout << collapse(20.91) << endl;
    cout << collapse(-1) << endl;
    cout << collapse(-2.5) << endl;
    cout << collapse(5.7) << endl;
}

输出是:

0.671875
0.653438
-1
-0.625
0.7125

答案 1 :(得分:0)

这样做:

#define CALC_SCALE ( x > 16 ? 32 : x > 8 ? 16 : x > 4 ? 8 : x > 2 ? 4 : x > 1 ? 2 : 1 )

在编译时:

int x = CALC_SCALE( 13 );

编译为:

int x = 16;

可以轻松更改以支持浮动。