Niedawno napotkałem dziwny problem z FORTRAN95. Zainicjowałem zmienne X i Y w następujący sposób:
X=1.0 Y=0.1
Później dodaję je do siebie i wypisuję wynik:
1.10000000149012
Po zbadaniu zmiennych, wygląda na to, że 0.1 nie jest reprezentowane z podwójną precyzją z pełną dokładnością. Czy jest jakiś sposób, aby tego uniknąć?
Odpowiedź
Innym sposobem, aby to zrobić, jest najpierw jawne określenie żądanej dokładności zmiennej za pomocą funkcji wewnętrznej SELECTED_REAL_KIND , a następnie użycie jej do zdefiniowania i zainicjowania zmiennych. Coś w rodzaju :
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15) REAL(dp) :: x x = 1.0_dp
Zaletą zrobienia tego w ten sposób jest to, że można przechowywać definicję dp
w moduł, a następnie USE
ten moduł tam, gdzie jest to potrzebne. Jeśli kiedykolwiek zechcesz zmienić dokładność programu, wystarczy zmienić definicję dp
w tym jednym miejscu, zamiast wyszukiwać i zastępować wszystkie D0
w koniec inicjalizacji zmiennych. (Z tego też powodu nie radzę używać składni 1.0D-1
do definiowania Y zgodnie z sugestią. Działa, ale utrudnia znajdowanie i zmienianie wszystkich wystąpień w przyszłości.)
Ta strona w Fortran Wiki zawiera przydatne dodatkowe informacje na temat SELECTED_REAL_KIND
.
Komentarze
Odpowiedź
Zadeklarowałeś zmienne jako podwójnej precyzji, ale zainicjowałeś je z wartości o pojedynczej precyzji.
Mogłeś napisać:
X=1.0d0 Y=1.0d-1
Barron „s odpowiedź poniżej znajduje się inny sposób na dosłowną podwójną precyzję, z tą zaletą, że umożliwia zmianę dokładności zmiennych w późniejszym czasie.
Komentarze
- Myślę, że należy użyć metody 1.0_dp opisanej w poniższym poście.
- I second @ OndřejČert í k ' komentarz – Odpowiedź Barrona ' jest najlepsza.
_dp
jest to, aby precyzja była wyraźnie zdefiniowane w przenośny sposób.