24

浮動小数点型は、16、32、64、または 128 ビットに収まるように、有効桁数と指数を別々のバイナリ ワードに格納することで数値を表します。

固定小数点型は、2 ワードの数値を格納します。1 つは整数部分を表し、もう 1 つは基数を超える部分を表し、負の指数、2^-1、2^-2、2^-3 などで表されます。

指数の意味でより広い範囲を持っているため、浮動小数点の方が優れていますが、特定の範囲に対してより精度の高い数値を格納したい場合はそうではありません。 .

性能的にはどれが一番性能が良いのか、それとも高速なケースがあるのか​​?

ビデオ ゲームのプログラミングでは、FPU によって高速になるため、またはパフォーマンスの低下がごくわずかであるという理由で、誰もが浮動小数点を使用しますか? それとも、独自の固定型を作成しますか?

C/C++ に固定型がないのはなぜですか?

4

8 に答える 8

8

その定義は、固定小数点実装の非常に限られたサブセットをカバーしています。

固定小数点では仮数のみが格納され、指数は事前に決定された定数であると言う方が正しいでしょう。2 進小数点が仮数内に収まる必要はなく、ワード境界に収まる必要もまったくありません。たとえば、次はすべて「固定小数点」です。

  • 2 -32でスケーリングされた 64 ビットの仮数(これは、質問に記載されている定義に適合します)
  • 2 -33でスケーリングされた 64 ビット仮数(現在、整数部分と小数部分はオクテット境界で分離できません)
  • 2 4でスケーリングされた 32 ビットの仮数(小数部はありません)
  • 2 -40でスケーリングされた 32 ビット仮数(現在は整数部分はありません)

GPU は、整数部分のない固定小数点を使用する傾向があります (通常、2 -32でスケーリングされた 32 ビットの仮数)。したがって、OpenGL や Direct3D などの API は、これらの値を保持できる浮動小数点型を使用することがよくあります。ただし、整数の仮数を操作する方が効率的な場合が多いため、これらの API では、この方法で座標 (テクスチャ空間、色空間など) を指定することもできます。

C++ には固定小数点型がないというあなたの主張については、私は同意しません。C++ の整数型はすべて固定小数点型です。多くの場合、指数はゼロであると想定されますが、これは必須ではなく、この方法で C++ に実装された固定小数点 DSP コードがかなりあります。

于 2010-09-11T21:51:17.540 に答える
5

コード レベルでは、固定小数点演算は暗黙の分母を持つ単純な整数演算です。

多くの単純な算術演算では、固定小数点演算と整数演算は本質的に同じです。ただし、中間値をより多くのビット数で表現し、丸めなければならない操作がいくつかあります。たとえば、2 つの 16 ビット固定小数点数を乗算するには、16 ビット固定小数点数に再正規化 (または飽和) する前に、結果を一時的に 32 ビットに格納する必要があります。

ソフトウェアがベクトル化を利用しない場合 (CPU ベースの SIMD や GPGPU など)、整数演算と固定小数点演算は FPU より高速です。ベクトル化を使用すると、ベクトル化の効率がより重要になるため、固定小数点と浮動小数点のパフォーマンスの違いは意味がありません。

sin一部のアーキテクチャでは、cosatan、、 などの特定の数学関数のハードウェア実装がsqrt浮動小数点型のみに提供されます。一部のアーキテクチャでは、ハードウェアの実装がまったく提供されていません。どちらの場合も、特殊な数学ソフトウェア ライブラリは、整数演算または固定小数点演算のみを使用してこれらの関数を提供する場合があります。多くの場合、そのようなライブラリは複数レベルの精度を提供します。たとえば、表現の完全な精度よりも低い N ビットの精度までしか正確でない回答などです。限定精度バージョンは、最高精度バージョンよりも高速な場合があります。

于 2010-09-11T22:13:25.517 に答える
4

固定小数点は、ターゲット プロセッサに FPU がないことが多い DSP および組み込みシステムで広く使用されており、固定小数点は整数 ALU を使用して合理的に効率的に実装できます。

パフォーマンスに関しては、ターゲット アーキテクチャとアプリケーションによって異なる可能性があります。明らかに、FPU がない場合、固定小数点はかなり高速になります。FPU がある場合は、アプリケーションにも依存します。たとえば、sqrt() や log() などの関数の実行は、アルゴリズムで実装するよりも、命令セットで直接サポートされている方がはるかに高速になります。

CまたはC++には組み込みの固定小数点型はありません。それら(または少なくともC)はシステムレベルの言語として想定されており、固定小数点の必要性はドメイン固有であり、おそらく汎用プロセッサには通常、固定小数点に対するハードウェアの直接サポートはありません。

C++ では、適切な演算子のオーバーロードと関連する数学関数を使用して固定小数点データ型クラスを定義すると、この欠点を簡単に克服できます。ただし、この問題には良い解決策と悪い解決策があります。良い例は http://www.drdobbs.com/cpp/207000448 にあります。その記事のコードへのリンクは壊れていますが、私はftp://66.77.27.238/sourcecode/ddj/2008/0804.zipまで追跡しました。

于 2010-09-11T21:54:54.330 に答える
1

浮動小数点演算と整数演算の違いは、考えている CPU によって異なります。Intel チップでは、クロックティックの違いは大きくありません。並列に動作できる複数の整数 ALU があるため、整数演算はさらに高速です。コンパイラは、特別なアドレス計算命令を使用して、単一の命令で加算/乗算を最適化することもできます。変換も操作としてカウントされるため、タイプを選択してそれに固執してください。

C++ では、固定小数点演算用に独自の型を作成できます。1 つの int を持つ struct として定義し、適切なオーバーロードをオーバーライドして、通常の動作に加えてコンマを正しい位置に戻すためのシフトを実行させます。

于 2010-09-11T21:51:42.783 に答える
1

この文脈で「精度」について議論するときは注意が必要です。

表現のビット数が同じ場合、最大固定小数点値は浮動小数点値よりも有効なビットが多くなります (浮動小数点形式では指数にいくつかのビットを与える必要があるため) - 非正規化された浮動小数点値 (固定小数点値は先行ゼロで仮数のほとんどを浪費するため)。

また、固定小数点数を分割する方法によっては、浮動小数点値はより小さな数値を表すことができる場合があります。つまり、「小さいがゼロではない」ことをより正確に表現できます。

等々。

于 2010-09-11T22:00:17.067 に答える
1

固定小数点よりも浮動小数点でアルゴリズムを実装する方が簡単であるため、使用する方が高速または低速であるため、ゲームでは浮動小数点を使用しません。その理由は計算速度に関係していると想定していますが、それは理由ではなく、プログラミングの容易さに関係しています。

たとえば、画面/ビューポートの幅を 0.0 から 1.0 に、画面の高さを 0.0 から 1.0 に定義できます。単語の深さ 0.0 ~ 1.0。等々。行列演算などにより、実装が本当に簡単になります。実際の画面サイズ (たとえば 800x400) で実際のピクセルを計算する必要があるところまで、すべての計算を行います。目から世界のオブジェクト上のポイントに光線を投影し、0 から 1 の数学を使用して画面を貫通する場所を計算し、x に 800 を掛け、y に 400 を掛けて、そのピクセルを配置します。

浮動小数点は指数と仮数を別々に保存せず、仮数は16ビット、32ビット、64ビットではなく、23ビットのように指数と符号の後に残る間抜けな数値です。

コアの浮動小数点演算は、追加のロジックと追加の手順が必要な固定小数点ロジックを使用します。定義上、リンゴとリンゴの固定小数点演算を比較すると、alu に入る途中でデータを操作する必要がなく、出る途中 (正規化) でデータを操作する必要がないため、安価です。IEEE とそのすべてのガベージを追加すると、さらに多くのロジック、クロック サイクルなどが追加されます (適切に署名された無限大、quiet および signalling nan、例外ハンドラーが有効になっている場合、同じ操作に対して異なる結果が得られます)。固定と浮動を並行して実行できる実際のシステムのコメントで誰かが指摘したように、一部またはすべてのプロセッサを利用して、そのようにいくつかのクロックを回復できます。フロートと固定の両方のクロックレートは、膨大な量のチップ領域を使用することで増加できますが、固定は安価なままです。

于 2013-02-12T06:09:47.013 に答える
0

それはあなたが取り組んでいるものに依存します。固定小数点を使用している場合、精度が失われます。小数点以下の桁数を選択する必要があります (常に十分であるとは限りません)。浮動小数点では、これについて心配する必要はありません。提供される精度は、ほとんどの場合、目の前のタスクに対して十分に優れているためです。標準形式の実装を使用して数値を表します。

長所と短所は、速度とリソースに帰着します。最新の 32 ビットおよび 64 ビット プラットフォームでは、固定小数点を使用する必要はまったくありません。ほとんどのシステムには、固定小数点演算用に最適化されるように配線された組み込みの FPU が付属しています。さらに、ほとんどの最新の CPU 組み込み関数には、ベクトル化とアンローリングによってベクトル ベースのメソッドを最適化するのに役立つ SIMD セットなどの操作が付属しています。したがって、固定小数点には下側しかありません。

組み込みシステムと小さなマイクロコントローラー (8 ビットと 16 ビット) では、FPU も拡張命令セットもない場合があります。その場合、固定小数点メソッドまたは非常に高速ではない限定された浮動小数点命令セットを使用せざるを得ない場合があります。したがって、これらの状況では、固定小数点がより良い、または唯一の選択肢になります。

于 2016-07-29T11:14:35.267 に答える
0

カバーされていない問題の 1 つは、答えは消費電力です。特定のハードウェア アーキテクチャに大きく依存しますが、通常、FPU は CPU で ALU よりもはるかに多くのエネルギーを消費するため、電力消費が重要なモバイル アプリケーションを対象とする場合は、アルゴリズムの固定小数点実装を検討する価値があります。

于 2013-12-31T15:41:41.600 に答える