Fortran'da çift kesinlik değerleri nasıl ayarlanır?


10

Son zamanlarda, FORTRAN95 ile garip bir sorunla karşılaştım. X ve Y değişkenlerini aşağıdaki gibi başlattım:

X=1.0
Y=0.1

Daha sonra bunları bir araya getirip sonucu yazdırıyorum:

1.10000000149012

Değişkenler incelendikten sonra, 0.1 tam hassasiyetle çift hassasiyetle temsil edilmemiş gibi görünüyor. Bundan kaçınmamın bir yolu var mı?

Yanıtlar:


21

Bunu yapmanın başka bir yolu da, önce SELECTED_REAL_KIND intrinsic'i kullanarak değişkente istediğiniz hassasiyeti açıkça belirtmek ve daha sonra bunu değişkenleri tanımlamak ve başlatmak için kullanmaktır. Gibi bir şey:

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

Bunu bu şekilde yapmanın güzel bir avantajı, dpmodülün tanımını , sonra USEda gerekli olduğunda bu modülde depolayabilmenizdir . Şimdi programınızın hassasiyetini değiştirmek isterseniz , değişken başlatmalarınızın sonundaki dptüm D0leri aramak ve değiştirmek yerine yalnızca o yerde tanımını değiştirmeniz gerekir. (Bu yüzden 1.0D-1Y'yi önerilen şekilde tanımlamak için sözdizimini kullanmamanızı tavsiye ederim . Çalışır, ancak gelecekteki tüm örnekleri bulmayı ve değiştirmeyi zorlaştırır.)

Fortran Wiki'deki bu sayfa hakkında iyi ek bilgiler vermektedir SELECTED_REAL_KIND.


Bu doğru, standart yaklaşım bu olmalı.
Ondřej Čertík

Ve insanlar ne kadar sıklıkla prosedüre göre prosedür ve test yapmadan programlarındaki hassasiyeti körü körüne değiştirmek zorundalar? Şemayı kullanmanın ana nedeni _dp, hassasiyetin taşınabilir bir şekilde açıkça tanımlanmasıdır.
ja72

12

Değişkenleri çift kesinlik olarak beyan ettiniz, ancak tek kesinlik değerleriyle başlattınız.

Yazmış olabilirsiniz:

X=1.0d0
Y=1.0d-1

Barron'un aşağıdaki yanıtı , değişkenlerinizin hassasiyetini daha sonra değiştirmenize izin vermesi avantajı ile gerçek bir çift hassasiyet yapmanın başka bir yoludur.


1
Ben bir aşağıdaki yazı açıklanan 1.0_dp yöntemini kullanmak gerektiğini düşünüyorum.
Ondřej Čertík

1
Ben ikinci @ OndřejČertík'in yorumu - Barron'un cevabı en iyisi.
OscarB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.