Fortranで倍精度値を設定する方法


10

最近、FORTRAN95で奇妙な問題が発生しました。変数XとYを次のように初期化しました。

X=1.0
Y=0.1

後でそれらを一緒に追加して、結果を出力します。

1.10000000149012

変数を調べたところ、0.1は完全な精度の倍精度で表されていないようです。これを回避する方法はありますか?

回答:


21

これを行う別の方法は、最初にSELECTED_REAL_KIND組み込みを使用して変数に希望する精度を明示的に指定し、次にこれを使用して変数を定義および初期化することです。何かのようなもの:

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

この方法で実行することの優れた利点dpは、モジュールの定義をモジュールに保存し、USE必要に応じてそのモジュールを保存できることです。プログラムの精度を変更したい場合は、変数の初期化の最後にあるdpすべてのを検索して置き換えるD0のではなく、その1つの場所での定義を変更するだけで済みます。(これが、1.0D-1Yを定義するために構文を使用しないことをお勧めする理由でもあります。これは機能しますが、将来すべてのインスタンスを見つけて変更することが難しくなります。)

Fortran Wikiのこのページには、に関するいくつかの優れた追加情報が記載されていSELECTED_REAL_KINDます。


そうです、これは標準的なアプローチであるべきです。
オンドレジ・セティク

とにかく、手順と手順を踏まずにテストを行わずに、実際にプログラムの精度を盲目的に変更する必要がある頻度はどれくらいでしょうか。この_dp方式を使用する主な理由は、精度が移植可能な方法で明確に定義されるためです。
ja72 2012年

12

変数を倍精度として宣言しましたが、それらを単精度値で初期化しました。

あなたは書くことができたでしょう:

X=1.0d0
Y=1.0d-1

以下のバロンの答えは、リテラル倍精度を作成するもう1つの方法です。これにより、後で変数の精度を変更できるという利点があります。


1
以下の投稿で説明されている1.0_dpメソッドを使用する必要があると思います。
オンドレジ・セティク

1
@OndřejČertíkのコメントの2番目です-Barronの回答が最高です。
OscarB
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.