11

はい、IEEE-754 の半精度標準については知っています。また、この分野で行われた作業についても知っています。簡単に言えば、単純な浮動小数点数 ( 52.1、または など1.25) をわずか 2 バイトで保存しようとしています。

JavaC#でいくつかの実装を試しましたが、別の数値をデコードして入力値を台無しにします。フィードを入力し32.1、エンコード - デコード後に32.0985.

入力値を台無しにすることなく、浮動小数点数をわずか 16 ビットで格納できる方法はありますか?

どうもありがとう。

4

6 に答える 6

11

3桁をBCDに格納し、残りの4ビットを小数点位置に使用できます。

52.1 = 521 * 10 ^ -1 => 0x1521
1.25 = 125 * 10 ^ -2 => 0x2125

これにより、0.0000000000000001から999の範囲が得られます。もちろん、小数点のオフセットを追加して、たとえば0.0000000001から999000000の範囲を取得することもできます。


小数点の配置に使用される4ビットと、値に使用される残りのビットの単純な実装。エラーチェックなしで、徹底的にチェックされていません。!=( doubleを比較するために使用する場合、一部の値で精度の問題が発生する可能性があります。)

public static short Encode(double value) {
  int cnt = 0;
  while (value != Math.Floor(value)) {
    value *= 10.0;
    cnt++;
  }
  return (short)((cnt << 12) + (int)value);
}

public static double Decode(short value) {
  int cnt = value >> 12;
  double result = value & 0xfff;
  while (cnt > 0) {
    result /= 10.0;
    cnt--;
  }
  return result;
}

例:

Console.WriteLine(Encode(52.1));
Console.WriteLine(Decode(4617));

出力:

4617
52.1
于 2012-05-02T13:43:08.460 に答える
7

C# にはそのための機能が組み込まれていませんが、固定小数点アプローチを試すことができます。

8,8 固定小数点の例 (コンマの前に 8、後に 8):

float value = 123.45;
ushort fixedIntValue = (ushort)(value * 256);

このように、番号は次のように保存されます: XXXXXXXXX,XXXXXXXX

これを使用してフロートを再度取得できます。

float value = fixedIntValue / 256f;
于 2012-05-02T13:40:26.607 に答える
5

またはを単に使用するだけでなく、そのようなマイクロ最適化が必要ですfloatdouble?

shorta を保存して、たとえば、実際の数を作るために 100 で割ったことを理解することで、より良いサービスが提供されるでしょうか? (たとえば、52.1 と 1.25 の例は 5210 と 125 として格納できます) これが最適なソリューションであると思います。

実際の浮動小数点数を使用するように設定している場合は、デコードされた数値を取得して、有効桁数 x (例では 3) に丸めることができます。これにより、通常、最初に使用したのと同じ数値が返されます (はい、それは意図的にあいまいです - オリジナルを保存しない限り、オリジナルを取得することは保証できません)。

于 2012-05-02T13:40:32.313 に答える
4

問題は、バイナリ浮動小数点型32.1で正確に表現できないことです。

単精度では、最も近い表現可能な値は32.099998です。半精度では、明らかに32.0985です。

10進浮動小数点型を検討することもできますが、このソリューションは半精度に固有のものではありません。

于 2012-05-02T13:38:42.670 に答える
1

NaNと無限大を含まない、4,278,190,080個の32ビット浮動小数点値があります。2バイトの16ビットには65,536個の値があります。明らかに、すべての浮動小数点値を2バイトで一意にエンコードすることは不可能です。

どれをエンコードしますか?

符号と指数の単一の値(たとえば、8を除く4から8までのすべての浮動小数点値)の場合でも、8,388,608の浮動小数点値があるため、それらを2バイトでエンコードすることもできません。

エンコードする値の小さなサブセットに制限する必要があります。あなたがそれをしたら、人々はそれらをどのようにエンコードするかについての提案をするかもしれません。あなたが解決しようとしている実際の問題は何ですか?

于 2012-05-02T20:49:21.807 に答える
1

あなたの例から、あなたは3桁と小数点を保存したいと思います。11個のシンボルの「アルファベット」を4ビットコードにエンコードし、4x4ビットを2バイトに格納するだけです。

于 2012-05-02T13:39:06.063 に答える