1

固定小数点変換ルーチンを作成しようとしています。2 つの値といくつかのフラグを 8 バイトのパケットに収める必要があるため、値ごとに 3 バイトしかありません。

私のコードは次のようになります。

typedef struct
{
    signed short m;
    unsigned char f;
} Q16_8;

Q16_8 toQ(double d)
{
    Q16_8 q;
    q.m = (signed short)d;
    q.f = (unsigned char)(d * 256.0);
    return q;
}

double toDouble(const Q16_8 q)
{
    return q.m + q.f / 256.0;
}

私のテストの結果は次のようになります。列 1 は浮動小数点、2 は固定小数点、3 は差です。

-2.000000 -2.000000 0.000000
-1.750000 -0.750000 -1.000000
-1.500000 -0.500000 -1.000000
-1.250000 -0.250000 -1.000000
-1.000000 -1.000000 0.000000
-0.750000 0.250000 -1.000000
-0.500000 0.500000 -1.000000
-0.250000 0.750000 -1.000000
0.000000 0.000000 0.000000
0.250000 0.250000 0.000000
0.500000 0.500000 0.000000
0.750000 0.750000 0.000000
1.000000 1.000000 0.000000
1.250000 1.250000 0.000000
1.500000 1.500000 0.000000
1.750000 1.750000 0.000000

私は何を間違っていますか?

4

2 に答える 2

2

代わりにこれを試してください:

#include <stdio.h>

typedef struct
{
    signed short m;
    unsigned char f;
} Q16_8;

Q16_8 toQ(double d)
{
    Q16_8 q;
    long x = d * 256;
    q.m = x >> 8; // this assumes >> to be an arithmetic shift
    q.f = x & 0xFF; // this assumes signed ints to be 2's complement
    return q;
}

double toDouble(Q16_8 q)
{
    long x = ((long)q.m << 8) + q.f;
    return x / 256.0;
}

int main(void)
{
  int i;
  for (i = -2*4; i <= +2*4; i++)
  {
    double d = i / 4.0;
    Q16_8 q = toQ(d);
    double d2 = toDouble(q);
    printf("toDouble(toQ(%f)) = %f\n", d, d2);
  }
  return 0;
}

出力 ( ideone ):

toDouble(toQ(-2.000000)) = -2.000000
toDouble(toQ(-1.750000)) = -1.750000
toDouble(toQ(-1.500000)) = -1.500000
toDouble(toQ(-1.250000)) = -1.250000
toDouble(toQ(-1.000000)) = -1.000000
toDouble(toQ(-0.750000)) = -0.750000
toDouble(toQ(-0.500000)) = -0.500000
toDouble(toQ(-0.250000)) = -0.250000
toDouble(toQ(0.000000)) = 0.000000
toDouble(toQ(0.250000)) = 0.250000
toDouble(toQ(0.500000)) = 0.500000
toDouble(toQ(0.750000)) = 0.750000
toDouble(toQ(1.000000)) = 1.000000
toDouble(toQ(1.250000)) = 1.250000
toDouble(toQ(1.500000)) = 1.500000
toDouble(toQ(1.750000)) = 1.750000
toDouble(toQ(2.000000)) = 2.000000
于 2013-04-02T23:23:44.507 に答える
1

d = -1.75例として、次の 2 つの事実の結果を考えてみましょう。

  • mになります-1
  • fポジティブにしかなれません…
于 2013-04-02T22:30:10.203 に答える