2013-05-10 9 views
5

Powiedz, mam następujący program:poprawić precyzję w zmiennych zdefiniowanych przez całkowitą ilorazu

program derp 
    implicit none 
    integer, parameter :: ikind = selected_real_kind(18) 
    real (kind = ikind) :: a = 2.0/3.0 
    print*, a 
end program derp 

programu derp wyjścia 0.6666666865348815917, który nie jest wyraźnie 18 cyfr precyzji. Jeśli jednak zdefiniuję a=2.0 i b=3.0 przy użyciu tej samej metody i , wówczas zdefiniuj c=a/b otrzymam wynik o wartości 0.666666666666666666685, co jest dobre. Jak mogę po prostu zdefiniować zmienną jako iloraz liczb całkowitych i czy przechowuję wszystkie cyfry precyzji, które chcę od selected_real_kind?

Odpowiedz

8

Spróbuj: real (kind = ikind) :: a = 2.0_ikind/3.0_ikind

Powodem jest natomiast LHS jest wysoka precyzja, RHS w przykładzie kodu, 2.0/3.0, nie jest. Fortran wykonuje to obliczenie z pojedynczą precyzją, a następnie przypisuje wynik do LHS. Strona RHS nie jest obliczana z większą precyzją, ponieważ LHS ma wysoką precyzję. digits_kind to sposób określania typu stałej digits.

+0

Doskonale, dzięki. To trochę kiepskie, że musisz to zrobić ręcznie, ale mogę z tym żyć. –

+4

Podstawową rzeczą w Fortranie jest to, że RHS jest oceniane bez uwzględnienia LHS, a następnie przypisane. Jest więcej sytuacji, w których jest to kluczowe. –

+0

Ocena RHS bez względu na precyzję LHS nie jest niczym wyjątkowym dla fortranu. Jeśli wykonasz a = 2/3, spodziewałbyś się operacji na float (być może chodziło o arytmetykę intergerów). To, co jest wyjątkowe (być może) dla fortranu, jest domyślne dla pojedynczej precyzji. Na zły nie ma standardowego sposobu ustawienia domyślnego. – agentp

Powiązane problemy