以下で浮動小数点演算に目を向けますが、最初にあなたの誤解に対処させてください。write ステートメントでリスト指定の書式設定を使用するということは、変数を書き出すためにコンパイラによって選択された書式が、コンパイラの選択であることを意味します。言語標準では義務付けられていません。2 番目*
の in を使用するwrite(*,*)
と、変数の値を必要に応じて書き出すようにコンパイラに指示します。したがって、あなたが持っているのは、算術に何か問題があるという証拠ではなく、 と の間に違いがあるという証拠gfortran
ですifort
。あなたの書き込みステートメントを次のように変更すると
write(*,'(f21.18)') a
次に、Intel Fortran プログラムが次のように記述します。
0.900000000000000022
コンソールに。
SO には、浮動小数点演算の詳細に慣れていないことから生じる質問が散らばっているので、論文を書くつもりはありません。あなたの質問に関連するいくつかの観察だけです。
IEEE-754 の 64 ビット浮動小数点数 (これはおそらく宣言で得られるものですreal(kind=8)
) は、約 16 桁の有用な情報しか提供しません。実際には、それらは 2 進数であり、ある基数と別の基数の桁数の間に簡単な対応がないため、実際には 10 進数で 15.95 桁であり、多くのユーザーはこれを切り捨てて、浮動小数点の 15 番目の有効数字の後に何も見ません。ポイント番号の 10 進数表現。ifort
そのため、との両方gfortran
が末尾2
の s で誤解を招いています。
IEEE-754 では、fp 数値の形式だけでなく、丸めと算術演算の規則もいくつか定義されています。これらの算術演算 (平方根も指定されていると思います) のみを使用し、丸めモードと丸め操作に注意して慎重に作成されたプログラムは、2 つの異なるプロセッサで同じ結果を生成するはずです。もちろん、基本的な算術演算に限定された有用な数値プログラムは多くありません。
2003 年の標準 Fortran には、組み込みモジュールと呼ばれるモジュールが含まれており、ieee_arithmetic
これにより、プログラマーは、それが実行されているハードウェアの基礎となる IEEE-754 機能に直接アクセスできますが、ハードウェアがそのような機能を備えている必要はないことに注意してください。ieee_arithmetic
と呼ばれる別の組み込みモジュールを使用するとieee_exceptions
、ハードウェアが必要なサポートを提供する場合、 と の両方でコンパイルし、実行するとすべての fp 番号の最後のビットに同じ結果を生成するプログラムを作成できるはずgfortran
ですifort
。
また、使用しているコンパイラの最適化オプションと数値演算オプションに慣れる必要があります。ほとんどのコンパイラには、意味のあるオプションがありますsacrifice IEEE compliance for speed
(ifort
私はそれだと思いますfp-model
)。一般に、操作を IEEE-754 に準拠させると、プログラムが遅くなります。