浮動小数点演算のライブラリ/パッケージはほとんどありません。浮動小数点表現のさまざまな不正確さを考えると、この増加した精度が固定小数点での作業の複雑さの価値があるかもしれないフィールドが少なくともいくつかない理由が問題になります。
たとえば、固定小数点固有値ソルバーを使用する上で大きな問題はありますか?彼らはどのくらい遅く/速く、不正確/正確でしょうか?
浮動小数点演算のライブラリ/パッケージはほとんどありません。浮動小数点表現のさまざまな不正確さを考えると、この増加した精度が固定小数点での作業の複雑さの価値があるかもしれないフィールドが少なくともいくつかない理由が問題になります。
たとえば、固定小数点固有値ソルバーを使用する上で大きな問題はありますか?彼らはどのくらい遅く/速く、不正確/正確でしょうか?
回答:
特定の状況では、固定小数点演算の使用が適切な場合があります。一般に、科学計算では(少なくともほとんどの人がそれを考えるという意味で)、遭遇する大きなダイナミックレンジを表現する必要があるため、適切ではありません。あなたは例として固有値問題に言及しますが、科学では非常にしばしば、行列の最小固有値に興味があります(たとえば、量子システムの基底状態の計算に)。固定小数点を使用する場合、小さな固有値の精度は、大きな固有値に比べて一般にかなり低下します。行列に大きな比率で変化するエントリが含まれている場合、小さな固有値は実際の精度では完全に表現できない場合があります。これは数値の表現に関する問題です。これらの引数は、中間計算の方法に関係なく保持されます。スケーリングを計算して計算結果に適用することもできますが、これで浮動小数点が発明されました。要素が適切に動作するが、固有値の動作が非常に悪い行列(ウィルキンソン行列、または完全に整数のエントリを持つ行列です。これらの例は見た目ほど病理的ではなく、科学の最先端での多くの問題は非常に不十分に動作する行列に関係しているため、このコンテキストで固定小数点を使用することはBad Idea(TM)です。
結果の大きさがわかっていて、指数のビットを無駄にしたくないと主張するかもしれないので、中間体について話しましょう。固定小数点を使用すると、より高い精度で作業するために本当に苦労しない限り、一般に壊滅的なキャンセルと丸めの影響が悪化します。パフォーマンスのペナルティは非常に大きくなるため、同じ仮数ビット幅で浮動小数点表現を使用すると、より高速で正確になると推測します。
固定小数点が当てはまる可能性のある領域の1つは、幾何学計算の特定の領域です。特に、正確な演算が必要な場合、またはすべての数値のダイナミックレンジを事前に知っている場合は、固定小数点を使用すると、表現のすべてのビットを利用できます。たとえば、2本の線の交点を計算し、2本の線の端点が何らかの方法で正規化されて単位正方形に収まるとします。この場合、交点は、同等の浮動小数点数を使用するよりもビット数の高い精度で表すことができます(指数のビットが無駄になります)。さて、この計算に必要な中間数をより高い精度で計算する必要があるか、少なくとも非常に注意深く(2つの数値の積を別の数値で割るときのように、非常に注意する必要があります)。この点で、固定小数点は計算の観点からよりも表現の観点からより有利であり、アルゴリズム出力のダイナミックレンジに明確な上限と下限を設定できる場合、これは一般的に言えることです。。これはめったに起こりません。
私は、浮動小数点表現が粗雑または不正確であると考えていました(なぜ指数にビットを無駄にするのですか?)。しかし、時間が経つにつれ、それが実数の可能な限り最良の表現の1つであることに気付きました。自然界のものは対数スケールで表示されるため、実際のデータは広範囲の指数にまたがります。また、可能な限り最高の相対精度を達成するには、対数スケールで作業する必要があり、指数の追跡がより自然になります。「自然な」表現に対する他の唯一の候補は、対称レベルインデックスです。ただし、その表現では足し算と引き算がはるかに遅く、IEEE 754のハードウェアサポートが欠如しています。浮動小数点標準には、非常に多くの検討が行われました。、数値線形代数の柱による。彼は数字の「正しい」表現が何であるかを知っていると思います。
正確な演算/固定小数点演算がほとんど使用されない理由の例として、次のことを考慮してください。
有限要素法では、科学計算で使用されている他のほとんどすべての方法と同様に、現実世界の近似にすぎない線形または非線形システムに到達します。たとえば、FEMでは、解く線形システムは元の偏微分方程式の近似にすぎません(それ自体は、実世界の近似にすぎない場合があります)。では、なぜ近似に過ぎないものを解決するために多大な努力を払う必要があるのでしょうか。
今日使用しているアルゴリズムのほとんどは、本質的に反復型です。ニュートン法、共役勾配など。問題の解に対する反復近似の精度が十分であると確信できる場合は、これらの反復を終了します。つまり、正確なソリューションが得られる前に終了します。以前と同様に、近似のみを計算していることがわかっているのに、反復スキームに正確な算術を使用するのはなぜですか?
float
ます。
正しい丸めのためにこのライブラリーCRlibmを見ると、一般に、アルゴリズムは正確であることが証明されなければならない(正当な証明がある)ことがドキュメントに表示されます。どうして?関数の結果の安定性と収束の速度には、「万能」の答えはありません。要するに、「無料の昼食はありません」-あなたの推論が正しいことを証明するために努力しなければなりません。これは、基礎となるハードウェアではなく、モデル化されている関数の動作によるものです(整数ユニットまたは浮動小数点ユニットのどちらを使用するかにかかわらず、どちらも、オーバーフロー/アンダーフロー、非正規数などの「問題」があります)。整数への収束を探している場合、結果を見つけるために使用されるアルゴリズムは必ずしも非常に安定しているとは限りません。
Eigenは、それぞれ異なるプロパティを持つ行列を解くためのさまざまなアルゴリズムを備えたC ++ライブラリです。 このページには、行列の解決に使用されるさまざまなアルゴリズムの速度と精度のトレードオフについて説明する表が含まれています。アイゲン図書館はあなたが望むことをできると思います。:-)
数学で高精度の算術が役立つ場所のいくつかの素晴らしい例については、Jonathan BorweinとDavid Baileyによる本「Mathematics by Experiment」をご覧ください。まだ読んでいないこの続編もあります。