0

私は現在、算術演算にCUDAで整数の代わりに浮動小数点数を使用することについていくつかの研究を行っています。整数演算は浮動小数点演算に比べて非常に遅く、整数の代わりに浮動小数点数を使用するとパフォーマンスが向上する可能性があるため、この必要性が生じます。

私は小さな実験を行い、ループして変数に 1.0f を追加するだけの簡単なプログラムを作成しました.これは 16777216.0f まで機能することがわかりました..数値にさらに 1.0f を追加すると、数値は変更されません.. .だから私は、この数値が最大数であり、整数のみを含む演算子 +,-,* が正確な整数の結果、たとえば +/-0.0001 の精度をもたらす最大数であると思っていましたか?

よろしくダニエル

4

1 に答える 1

2

Jonathan Dursiは、コメントの中で浮動小数点を説明するためのいくつかの重要なリンクを指摘しました。

見てみると、16777216は2^24であることがわかります。浮動小数点(単精度)には、23ビットと暗黙の「1」があります(値が正規化されているため)。24ビットを使用すると、1.0 * 2^0から1.11..11b*2 ^ 23までの任意の整数を表すことができます(実際には、符号ビットが分離されているため負の数を取得し、特別なコーディングでゼロを取得します)。1.0 * 2 ^ 24として表すことができるため、追加の値(2 ^ 24)が得られます。

1を2^24に追加しようとするとすぐに、Jonathanが投稿したリンクで説明されている丸め誤差が発生することがわかります。

したがって、整数の場合、範囲を[-2 ^ 24,2^24]に制限する必要があります。それができない場合は、注意深くチェックするか、整数に制限する必要があります。

于 2012-11-01T17:36:37.810 に答える