質問

フローティングポイントタイプは、16、32、64、または128ビットに収まるように、個別のバイナリ単語に個別にエクスペンを個別に保存することにより、数値を表します。

固定点タイプタイプは2つの単語を保存します。1つは整数部分を表し、もう1つは基数を過ぎた部分を表す、負の指数、2^-1、2^-2、2^-3などを表します。

フロートは、指数の意味でより広い範囲を持っているため、特定の範囲でより精度で数値を保存したい場合は優れています。たとえば、-16から16までの整数のみを使用するため、基数を超えて数字を保持するためにより多くのビットを使用して。

パフォーマンスの面では、どれが最高のパフォーマンスを持っているのか、それとも他のパフォーマンスよりも速い人がいますか?

ビデオゲームプログラミングでは、FPUが高速になるか、パフォーマンスの低下が無視できるか、独自の固定型を作成するため、誰もが浮動点を使用していますか?

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

役に立ちましたか?

解決

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

固定点では、マンティッサのみが保存され、指数は一定の決定されたa-prioriであると言う方が正しいでしょう。バイナリポイントがマンティッサ内に落ちる必要はなく、単語の境界に該当するという要件は間違いありません。たとえば、以下はすべて「固定点」です。

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

GPUは、整数部品のない固定点を使用する傾向があります(通常、32ビットMantissaが2で拡大します-32)。したがって、OpenGLやDirect3DなどのAPIは、これらの値を保持できるフローティングポイントタイプを使用することがよくあります。ただし、整数マンティッサの操作はしばしばより効率的であるため、これらのAPIはこの方法で調整(テクスチャ空間、色空間など)を指定することもできます。

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

他のヒント

コードレベルでは、固定点の算術は、暗黙の分母を備えた整数算術です。

多くの単純な算術演算では、固定点と整数操作は本質的に同じです。ただし、中間値をより多くのビットで表す必要がある操作がいくつかあります。たとえば、2つの16ビット固定点数を掛けるには、結果を32ビットに一時的に保存する必要があります。その後、繰り込み(または飽和)16ビット固定点に戻ります。

ソフトウェアがベクトル化(CPUベースのSIMDやGPGPUなど)を利用しない場合、整数と固定点のアリスメリックはFPUよりも速いです。ベクトル化を使用すると、ベクトル化の効率がさらに重要であるため、固定点とフローティングポイントのパフォーマンスの違いが論争になります。

一部のアーキテクチャは、特定の数学機能のハードウェア実装を提供します。 sin, cos, atan, sqrt, 、フローティングポイントタイプのみ。一部のアーキテクチャでは、ハードウェアの実装をまったく提供していません。どちらの場合も、専門の数学ソフトウェアライブラリは、整数または固定点の算術のみを使用して、これらの関数を提供できます。多くの場合、そのようなライブラリは、たとえば、最大Nビットの精度のみの正確な回答など、複数のレベルの精度を提供します。これは、表現の完全な精度よりも少ないです。限られた精度バージョンは、最高程度のバージョンよりも高速になる場合があります。

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

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

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

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

浮遊点と整数数学の間の違いは、あなたが念頭に置いているCPUに依存します。 Intelチップでは、時計ティックでは違いが大きくありません。 Int Mathは、並行して動作できる複数の整数ALUがあるため、まだ高速です。また、コンパイラは特別なアドレス計算手順を使用して、単一の命令で追加/乗算を最適化することも賢明です。コンバージョンも操作としてカウントされるため、タイプを選択してそれに固執してください。

C ++では、固定点数学のために独自のタイプを作成できます。 1つのINTでstructとして定義し、適切な過負荷をオーバーライドし、通常のことを行うことに加えて、コンマを正しい位置に戻すためにシフトを実行させます。

この文脈で「精度」を議論するときは、注意する必要があります。

表現内の同じ数のビットについて、最大固定点値は もっと フローティングポイント値よりも重要なビット(フローティングポイント形式が指数にビットを配る必要があるため)が、最小固定ポイント値には 少ない 非依存型の浮動小数点値よりも(固定点値は、主要なゼロでマンティッサの大部分を無駄にするため)。

また、固定点数を分割する方法に応じて、フローティングポイント値は表現できる場合があります 小さい 数字は、「小さながゼロではない」のより正確な表現を持っていることを意味します。

等々。

ゲームでフロートを使用しないでください。これは、固定点よりもフローティングポイントでアルゴリズムを実装する方が簡単であるため、それを使用するより速くまたは遅くなるためです。理由はコンピューティング速度に関係していると仮定していますが、それが理由ではなく、プログラミングの容易さに関係しています。

たとえば、画面/ビューポートの幅を0.0から1.0、画面0.0から1.0の高さとして定義できます。 0.0〜1.0という単語の深さ。等々。 Matrix Mathなどを実装しやすくします。すべての数学をそのようにして、実際の画面サイズ(800x400)で実際のピクセルを計算する必要があるポイントまで行います。光線を目から世界のオブジェクトのポイントに投影し、0から1の数学を使用して画面を貫通する場所で計算し、Xを800、Yタイム400、およびそのピクセルを置きます。

フローティングポイントは指数とマンティッサを個別に保存せず、マンティッサは間抜けな数字であり、指数とサインの後に残っているものは、16または32または64ビットではなく23ビットのようです。

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

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

それはあなたが取り組んでいるものに依存します。固定点を使用している場合、精度が失われます。小数点以下の場所の数を選択する必要があります(常に十分ではない場合があります)。フローティングポイントでは、提供される精度は手元のタスクに十分に良いため、これについて心配する必要はありません。

長所と短所はスピードとリソースになります。最新の32ビットおよび64ビットプラットフォームでは、固定点を使用する必要はありません。ほとんどのシステムには、固定点操作に最適化されるようにハードワイヤードされたFPUが組み込まれています。さらに、ほとんどの最新のCPU内因性には、ベクトル化と解散を介してベクトルベースのメソッドを最適化するのに役立つSIMDセットなどの操作が伴います。したがって、固定点には欠点のみが付属しています。

組み込みシステムと小さなマイクロコントローラー(8ビットおよび16ビット)では、FPUも拡張命令セットもない場合があります。その場合、固定点メソッドまたはそれほど速くない限られたフローティングポイント命令セットを使用することを余儀なくされる場合があります。したがって、これらの状況では、固定点はより良い、またはあなたの唯一の選択になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top