現在、ほとんどの一般的な言語での実数の計算は、まだ浮動小数点演算を介して行われています。一方、タイプ2有効性(TTE)やドメイン理論などの理論は、実数の正確な計算を長い間約束していました。明らかに、浮動小数点の精度の問題は関連性で低下していません。なぜこれらの理論がより主流にならないのか、そしてなぜそれらのより顕著な実装がないのか?
たとえば、浮動小数点エラーをあまり気にしないアプリケーションのドメインはありますか?複雑さに関する重大な懸念事項はありますか?
現在、ほとんどの一般的な言語での実数の計算は、まだ浮動小数点演算を介して行われています。一方、タイプ2有効性(TTE)やドメイン理論などの理論は、実数の正確な計算を長い間約束していました。明らかに、浮動小数点の精度の問題は関連性で低下していません。なぜこれらの理論がより主流にならないのか、そしてなぜそれらのより顕著な実装がないのか?
たとえば、浮動小数点エラーをあまり気にしないアプリケーションのドメインはありますか?複雑さに関する重大な懸念事項はありますか?
回答:
私は実数計算で働いており、本当の答えを知っていればよかったです。しかし、私は推測することができます。それは社会学的な問題だと思います。
正確な実際の算術に取り組む人々のコミュニティは、ソフトウェアの開発に慣れていない理論家で構成されています。そのため、通常は実装タスクを学生に委任します(注目すべき例外はNorbertMüllerのiRRAMです)か、独自のおもちゃ実装を持っています。
必要なプログラミングモジョを持っている人には、必要な理論的背景がありません。強固な理論的基礎がなければ、正確な実際の計算を正しく設計することは困難です。たとえば、for
ループに多くの実数を追加するのは間違いです。精度の低下により許容できないパフォーマンスが得られるためです。たくさんの実数を追加したい場合は、部分和の大きさを考慮して、ツリーのような構造でそれを行う必要があります。全体で取得することは困難であるもう一つは、ということである<
と=
実数の合計ブール関数は、単純に(あなたが持つことができる存在しないとして=
、それのいずれかを返すfalse
か、それが発散し、<
二つの等しい実数が与えられたときに発散)。
最後に、正確な実際の算術演算のためにライブラリを実装する方法を知っているかどうかはまったく明確ではありません。それらは、いくつかのデータ型といくつかの関数を定義するだけの通常のライブラリではありません。多くの場合、正確な実算には特別な制御モードが必要です。たとえば、iRRAMはプログラムのメイン実行(文字通りハイジャックmain
)と標準入出力を引き継ぐため、精度が失われたときにプログラムを再実行できます。Haskellでの実際の算術ライブラリは、Staged
モナド(本質的にはReader
モナド)で発生します。ほとんどの人は実数が「単なる別のデータ型」であると期待していますが、それについては疑問があります。
一般に、人々は常に浮動小数点エラーを気にします。しかし、私はAndrejに同意せず、浮動小数点数が社会学上の理由から(ほとんどの場合)任意精度の実数よりも好ましいとは思いません。
実数の正確な計算に対する主な議論はパフォーマンスの 1つだと思います。つまり、精度よりもパフォーマンスが重要な場合は常に、浮動小数点数を使用する必要があります。
思い浮かぶアプリケーションは、計算流体力学を使用して車や飛行機の空力を設計することです。計算の小さな誤差は、多くの普及しているプロセッサに見られる専用の浮動小数点ユニットを使用する天文学的な利点で簡単に補われます。
特に、固定数のビットを使用して広範囲の実数を表す問題は、一見すると思えるほど簡単ではありません。数値シミュレーションでは、値は大きく変動する可能性があるため(乱流がある場合など)、固定小数点の計算は適切ではありません。
ハードウェアによって精度が固定されていない場合でも、任意の精度の数値を使用すると、浮動小数点の数値を使用するよりも桁違いに遅くなる可能性があります。実際、すてきな場合でも、すべての数値が合理的であるため、マトリックスの反転などの単純な操作は、分母を制御するのが難しい大きな結果になる可能性があります(例についてはこちらを参照)。多くの大規模な線形最適化パッケージは、この正確な問題のために適切な丸めモードで浮動小数点を使用して近似解を見つけます(たとえば、ここにあるプログラムの大部分を参照)。