2

まず、私が解決しようとしている問題は、範囲内で常に均一に分布したままの値をより適切に表現することです。

0.0 <= x < 1.0

これの動機は、このデータを格納するために使用されるバイト数を削減しようとすることです (アプリケーションはメモリと I/O 帯域幅に大きく依存しています)。現在、32 ビットの浮動小数点表現が使用されていますが、16 ビットの浮動小数点では精度が不十分であることが証明されています。

私の最初の考えは、データを 16 ビット整数で保存して、単純にスキームを使用することです。

x/(2^16 - 1) [x is an unsigned short]

アルゴリズムをほぼ同じに保ち、同じ浮動小数点ハードウェア演算の使用を (少なくとも最初は) 維持するために、理想的には、この小数表現を浮動小数点表現に変換し続け、演算を実行してから、ストレージ用に分数表現に変換し直します。

明らかに、これら 2 つのまったく異なる不正確な表現の間を行ったり来たりすると、精度が失われますが、このアプリケーションでは、これは許容できるトレードオフであると思われます。

私は、良い出発点を与えるかもしれない現在そこにあるものを見て、いくつかの調査を行いました. 重要な記事「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」( http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html )を読んで、他のいくつかの記事に目を向けました。 「Beyond Floating Point」( home.ccil.org/~cowan/temp/p319-clenshaw.pdf ) はその一例です。

これらの要件を満たす可能性のある他の場所で人々が使用した表現の他の例を誰かに教えてもらえますか?

私は、表現の正確さにおける潜在的な利益 (現在、この特定の範囲を使用することによって浮動小数点形式の多くを浪費している) が、分数表現から浮動小数点表現に移行するために 2 回丸めるという要件によって完全に上回ってしまうのではないかと懸念しています。指さしてまた戻る。その場合、このアプローチから利益を得るために、この分数表現を直接使用して演算を行うことが必要になる場合があります。この点に関するアドバイスは役に立ちますか?

4

3 に答える 3

1

1/x はあなたの範囲でひどく分布していませんか? 1/2 1/3 1/4 .. 1/2 を超える数を表現したくないですか?

この種のことは、スペースを節約するためにデータをエンコードするために Netcdf でかなり頻繁に行われます。

const double scale = 1.0/65536;
unsigned short x;

x の数値は実際には x*scale です

スケールとオフセットを使用したより一般的なアプローチについては、NetCDF の例を参照してください: http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/tutorial/NetcdfDataset.html

于 2013-11-10T13:38:38.010 に答える
0

このページの「パックされたデータ値」セクションをご覧ください。

https://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html#Packed%20Data%20Values

于 2015-10-19T21:37:44.237 に答える