2013-05-10 5 views
5

Say I haben folgendes Programm:Verbessern Präzision auf Variablen durch ganzzahlige Quotienten definiert

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

Das Programm derp0.6666666865348815917 Ausgänge, die eindeutig nicht mehr als 18 Ziffern der Präzision sind. Wenn ich jedoch a=2.0 und mit der gleichen Methode und definieren, dann definieren c=a/b ich bekomme eine Ausgabe von 0.666666666666666666685, was gut ist. Wie definiere ich einfach eine Variable als Quotient von ganzen Zahlen und habe sie alle Stellen der Genauigkeit, die ich will, von selected_real_kind?

Antwort

8

Versuchen: real (kind = ikind) :: a = 2.0_ikind/3.0_ikind

Der Grund dafür ist, während die LHS hohe Präzision, die RHS in Ihrem Code Beispiel 2.0/3.0, nicht der Fall. Fortran führt diese Berechnung in einfacher Genauigkeit durch und weist das Ergebnis dann der LHS zu. Die RHS-Seite wird nicht mit höherer Genauigkeit berechnet, da die LHS eine hohe Genauigkeit aufweist. digits_kind ist die Art der Angabe des Typs einer Konstanten digits.

+0

Perfekt, danke. Es ist irgendwie käsig, dass Sie das manuell tun müssen, aber ich kann damit leben. –

+4

Es ist eine grundlegende Sache in Fortran, dass RHS ohne Berücksichtigung von LHS bewertet und dann zugewiesen wird. Es gibt mehr Situationen, in denen dies entscheidend ist. –

+0

Bewertung RHS ohne Rücksicht auf die Präzision der LHS ist kaum für Fortran. Wenn du a = 2/3 machst, würdest du eine Float-Operation erwarten (vielleicht ist Interger-Arithmetik das, was du meinst). Was für Fortran (vielleicht) einzigartig ist, ist die Standardeinstellung für die einfache Genauigkeit. Zu schlecht gibt es keine Standardmethode, um den Standard festzulegen. – agentp

Verwandte Themen