私は数字の範囲を持っています(0, 1]
これらの数値の自然対数を取り、8.8 固定小数点として保存したいと思います。
私のフォーラムは K*ln(x) + (1<<16)
しかし、私は最高の価値が何であるか分かりませんK
。
私の考えでは、x
2倍になるとln(x)
が増加するln(2)
ため、固定小数点の値は固定小数点で1増加する必要があります(つまり、256)
つまり、これは次のことを意味します。K = 256/ln(2)
これは理にかなっていますか?
私は数字の範囲を持っています(0, 1]
これらの数値の自然対数を取り、8.8 固定小数点として保存したいと思います。
私のフォーラムは K*ln(x) + (1<<16)
しかし、私は最高の価値が何であるか分かりませんK
。
私の考えでは、x
2倍になるとln(x)
が増加するln(2)
ため、固定小数点の値は固定小数点で1増加する必要があります(つまり、256)
つまり、これは次のことを意味します。K = 256/ln(2)
これは理にかなっていますか?
xが 0 に近づくと、ln( x ) は負の無限大に発散します。したがって、本質的に無限ドメインを有限範囲にマッピングしようとしています。
直線的に行うと、どこかで断ち切らなければなりません。カットオフを低すぎる値で選択すると、表現する数値の精度が無駄になります。カットオフを高くすることを選択した場合、あまりにも多くの値が範囲の最小要素に固定されます。ポイントの分布に関する知識がなければ、ここで適切なバランスを推測することは非常に困難です。
したがって、おそらく、提案した線形マップの代わりに非線形マップを適用できます。指数関数みたいなもの?つまり、実際には ln( x ) の代わりにxを格納することになります。[0,1) の値を 16 ビットであまり情報を失うことなく保存したい場合は、Q0.16、つまり小数部分のすべての数字を使用するだけです。(0,1] の場合は、1 − <em>x を格納するか、x = 1 の特殊なケースを実行して、代わりに 0 としてエンコードすることができます。Q8.8 の数値がある場合は、数値に 2 を掛けます。最初は8 = 256 ですが、ビット表現にアクセスできる場合、その乗算は時間の無駄になります。
対数を保存したい理由があったと思うので、この答えはあなたが望んでいたものではないかもしれません。ただし、根本的な問題を回避する簡単な方法は見当たらないので、アイデアのいくつかを再考する必要があるかもしれません。