1

32 ビット浮動小数点数を 24 ビット正規化値に変換する方法を教えてください。私が試したのは (units * (1 <<24) ですが、うまくいかないようです。これで私を助けてください。ありがとう。

4

2 に答える 2

0

もちろん、それは機能していません。 (1 << 24) は、0を正確に1で表すことができる 24 ビットの数値には大きすぎます。これを別の言い方をすれば、1 << 24実際には25 ビットの数値です。

(units * ((1 << 24) - 1))代わりに検討してください。

    (1 << 24) - 10で始まる符号なし 24 ビット整数が表すことができる最大値です。

これで、[ 0.0 - 1.0 ]の範囲の浮動小数点数は、実際には符号なし 24 ビット固定小数点整数にオーバーフローなしで収まります。

于 2013-12-23T20:40:00.623 に答える
0

正規化された固定小数点表現は、厳密に到達可能ではない、表現可能な最大値が 1 であることを意味します。したがって、1 は で表され1<<24ます。Q フォーマットも参照してください。
たとえば、Q24 は 24 の小数ビット、0 の整数ビット、符号なしを意味します。32 ビットの符号なし整数を使用して Q24 を管理する場合、残りの 8 ビットを使用して計算を容易にすることができます。
浮動小数点表現から固定小数点表現に変換する前に、常に元の値の範囲を定義する必要があります。例: 浮動小数点値は からの範囲の物理値である[0, 5)ため、範囲には 0 が含まれ、5 は含まれず、固定小数点値は 5 に正規化されます。

#include <string.h>
#include <stdio.h>

float length_flp = 4.5;     // Units: meters. Range: [0,5)
float time_flp = 1.2;       // Seconds. Range: [0,2)
float speed_flp = 1.2;      // m/sec. Range: [0,2.5)
unsigned uint32_t length_fixp;   // Meters. Representation: Q24 = 24 bit normalized to MAX_LENGTH=5
unsigned uint32_t time_fixp;     // Seconds. Representation: Q24 = 24 bit normalized to MAX_TIME=2
unsigned uint32_t speed_fixp;    // m/sec. Repr: Q24 = 24 bit normalized to MAX_SPEED=(MAX_LENGTH/MAX_TIME)=2.5

void main(void)
{
    printf("length_flp=%f m\n", length_flp);
    printf("time_flp=%f sec\n", time_flp);
    printf("speed_flp=%f m/sec\n\n", length_flp / time_flp);

    length_fixp = (length_flp / 5) * (1 << 24);
    time_fixp = (time_flp / 2) * (1 << 24);
    speed_fixp = (length_fixp / (time_fixp >> 12)) << 12;

    printf("length_fixp=%d m\n", length_fixp);
    printf("time_fixp=%d sec\n", time_fixp);
    printf("speed_fixp = %d msec [fixed-point] = %f msec\n", speed_fixp, (float)speed_fixp / (1 << 24) * 2.5);
}

正規化された表現の利点は、正規化された値間の操作が正規化された値を返すことです。ところで、オーバーフローを防ぎ、精度を保つために、演算 (除算、乗算など) ごとに汎用関数を定義する必要があります。ご覧のとおり、ちょっとしたトリックを使って を計算しspeed_fixpました。出力は

length_flp=4.500000 m
time_flp=1.200000 sec
speed_flp=3.750000 m/sec

length_fixp = 15099494 m [fixed-point]
time_fixp = 10066330 sec [fixed-point]
speed_fixp = 25169920 msec [fixed-point] = 3.750610 msec
于 2013-12-31T09:29:43.660 に答える