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

  • To ' ma rację, powinno to być podejście standardowe.
  • A jak często ludzie naprawdę muszą na ślepo zmieniać precyzję swoich programów bez przechodzenia przez procedurę i testowania? Głównym powodem korzystania ze schematu _dp jest to, aby precyzja była wyraźnie zdefiniowane w przenośny sposób.

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *