2017-01-18 7 views
-7

浮動小数点数を[-1,1]の範囲にするには、の2のべき乗であるの2のべき乗で除算する必要があります。コードはQ0.31固定小数点である必要があります。コンパイル時に浮動小数点の最も近い2乗を求める

たとえば、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はありますか?

+1

CまたはC++?マクロ、関数、または任意の? –

+0

https://graphics.stanford.edu/~seander/bithacks.html#IntegerLogFloat –

+4

なぜマクロ(関数ではない)ですか? (CまたはC++タグも削除します) – Borgleader

答えて

0

これはそれを行います。

int x = CALC_SCALE(13); 
:コンパイル時に

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

をこれは簡単に山車をサポートするように変更することができます

int x = 16; 

がにコンパイルされます。

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 
関連する問題