7

floatを1つで表す必要がある状況がありcharます。この「ミニフロート」が表す必要のある範囲は0〜10e-7であるため、スペースを節約するために、数値は+ ve、指数は-veであると常に想定できます。

私が考えた表現は、3ビットの指数と5ビットの仮数(1つの暗黙のビット)で、指数は基数10、つまりx = man * 10^expです。

フロートからミニフロートに変換するにはfrexp、を使用し、いくつかの数学を使用して基数2から基数10に変換する予定です。

これは賢明なアプローチですか?または、これを達成するためのより良い方法はありますか?

4

4 に答える 4

9

実際に値を浮動小数点にする必要がありますか(つまり、値がスケーリングするときにほぼ一定の精度を持つ必要がありますか)?これらの値をどうしますか?

はるかに単純な(そしてより効率的な)アイデアは、8ビットを1e-7の暗黙のスケールを持つ符号なし固定小数点数として解釈することです。すなわち:

float toFloat(uint8_t x) {
    return x / 255.0e7;
}

uint8_t fromFloat(float x) {
    if (x < 0) return 0;
    if (x > 1e-7) return 255;
    return 255.0e7 * x; // this truncates; add 0.5 to round instead
}
于 2012-08-13T13:29:02.330 に答える
4

それがあなたの目的に役立つのであれば、ストレージまたは送信フォーマットなどのフォーマットを使用することは合理的です。つまり、小さなスペースにデータを記録するためです。この形式の丸め誤差がニーズに対して大きすぎないこと、範囲が適切であることなどを確認する必要があります。

通常のハードウェアでは低速になるため、これは計算に適した形式ではありません。

あなたがどのような基本変換を行うのかわかりません。にIEEE-754浮動小数点数があるfloat場合、8ビット形式との間で変換する作業は、より狭い形式に移行するときに仮数(分数)を丸め、指数バイアスを調整する作業の1つです。さらに、特殊なケース(非正規化数、オーバーフロー、NaN)の処理。これには、10進数ではなく、2進数の算術が含まれます。

余談ですが、浮動小数点数の小数部の適切な用語は「分数」または「仮数」(IEEE-754標準で使用される用語)であることに注意してください。「仮数」は、対数の小数部分です。

于 2012-08-13T13:25:09.893 に答える
4

別の方法は、独自の基準で選択する256フロート(またはダブル)の静的配列を使用することです。

次に、変換unsigned char-> float/doubleは簡単です...

float / double-> unsigned charの変換は、もう少し複雑です(静的配列で最も近いfloatを見つけます)。単純な二分探索アルゴリズムとの比較には約8のコストがかかりますが、静的配列の値を選択した方法によっては、より良い結果が得られる場合があります。

もちろん、操作はネイティブのfloat/doubleを使用して実行されます。

于 2012-08-13T14:49:26.290 に答える
1

5仮数ビットは、最小ステップサイズ0.25で1.00から9.00までの32の異なる状況を提供します

1.00 1.25 1.50 1.75 2.00 .... 8.75 9.00

3つの指数は8つの異なる状況を与えることができます10^0(これは1です)10 ^ -2 10 ^ -3 10 ^-4....最後に10^-7

小数部の誤差は0.25です。計算でこのエラーを補正できる場合は、これを使用できます。

于 2012-08-13T13:33:43.677 に答える