Cara mengatur nilai presisi ganda di Fortran

10

Baru-baru ini, saya mengalami masalah aneh dengan FORTRAN95. Saya menginisialisasi variabel X dan Y sebagai berikut:

X=1.0
Y=0.1

Kemudian saya menambahkannya bersama dan mencetak hasilnya:

1.10000000149012

Setelah memeriksa variabel, sepertinya 0,1 tidak terwakili dalam presisi ganda dengan akurasi penuh. Apakah ada cara untuk menghindari hal ini?

Paul
sumber

Jawaban:

21

Cara lain untuk melakukan ini adalah pertama-tama secara eksplisit menentukan presisi yang Anda inginkan dalam variabel menggunakan intrinsik SELECTED_REAL_KIND dan kemudian gunakan ini untuk menentukan dan menginisialisasi variabel. Sesuatu seperti:

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

Keuntungan yang bagus untuk melakukannya dengan cara ini adalah Anda dapat menyimpan definisi dpdalam sebuah modul, kemudian USEmodul itu jika diperlukan. Sekarang jika Anda ingin mengubah ketepatan program Anda, Anda hanya perlu mengubah definisi dpdi satu tempat itu daripada mencari dan mengganti semua huruf D0s di akhir inisialisasi variabel Anda. (Ini juga mengapa saya merekomendasikan untuk tidak menggunakan 1.0D-1sintaks untuk mendefinisikan Y seperti yang disarankan. Ini berfungsi, tetapi membuatnya lebih sulit untuk menemukan dan mengubah semua instance di masa depan.)

Halaman ini di Fortran Wiki memberikan beberapa informasi tambahan yang bagus tentang SELECTED_REAL_KIND.

Barron
sumber
Itu benar, ini harus menjadi pendekatan standar.
Ondřej Čertík
Dan seberapa sering orang benar-benar harus mengubah ketepatan pada program mereka secara membabi buta tanpa melakukan prosedur demi prosedur dan pengujian? Alasan utama untuk menggunakan _dpskema ini adalah agar presisi didefinisikan secara jelas dengan cara yang portabel.
ja72
12

Anda mendeklarasikan variabel sebagai presisi ganda, tetapi Anda menginisialisasi mereka dengan nilai presisi tunggal.

Anda bisa menulis:

X=1.0d0
Y=1.0d-1

Jawaban Barron di bawah ini adalah cara lain untuk membuat presisi ganda literal, dengan keunggulan yang memungkinkan Anda untuk mengubah presisi variabel Anda di lain waktu.

Dan
sumber
1
Saya pikir orang harus menggunakan metode 1.0_dp yang dijelaskan dalam posting di bawah ini.
Ondřej Čertík
1
I second @ komentar OndřejČertík - jawaban Barron adalah yang terbaik.
OscarB