最近、FORTRAN95で奇妙な問題が発生しました。変数XとYを次のように初期化しました。
X=1.0 Y=0.1
後でそれらを合計して結果を出力します:
1.10000000149012
変数を調べた後、 0.1は完全な精度で倍精度で表されていないようです。これを回避する方法はありますか?
回答
これを行う別の方法は、最初に SELECTED_REAL_KIND 組み込み関数を使用して変数に必要な精度を明示的に指定し、次にこれを使用して変数を定義および初期化することです。 :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
この方法の利点は、dp
の定義をに保存できることです。モジュール、次に必要に応じてそのモジュールをUSE
します。精度を変更したい場合はプログラムの場合、すべてのD0
を検索して置き換えるのではなく、その1つの場所でdp
の定義を変更するだけで済みます。変数の初期化が終了します。 (これが、提案どおりにYを定義するために1.0D-1
構文を使用しないことをお勧めする理由でもあります。これは機能しますが、将来すべてのインスタンスを見つけて変更するのが難しくなります。)
Fortran Wikiのこのページには、SELECTED_REAL_KIND
に関するいくつかの優れた追加情報が記載されています。
コメント
回答
変数を倍精度として宣言しましたが、単精度値。
次のように記述できます:
X=1.0d0 Y=1.0d-1
バロンズ答え以下は、リテラルの倍精度を作成する別の方法です。後で変数の精度を変更できるという利点があります。
コメント
- 以下の投稿で説明されている1.0_dpメソッドを使用する必要があると思います。
- 2番目の@OndřejČertí k 'のコメント-Barron 'の答えが最良です。
_dp
スキームを使用する主な理由は、精度が明確になるようにするためです。移植可能な方法で定義されています。