Question

The goal:

Have a function work with configurable working precision.

When I try this:

program vierkantsvergelijking
implicit none

integer, parameter :: dp = kind(0.d0)
integer, parameter :: sp = kind(0.0)

print *, algoritme1(-5771.,2.,dp)
contains

  function algoritme1(b,c,wp) result( solution)
    integer :: wp ! working precision
    real(kind=wp) :: b,c,D
    real(kind=wp), dimension(2) :: solution
    D = sqrt((b/2)**2 - c)
    solution(1) = -b/2 + D
    solution(2) = -b/2 - D
  end function algoritme1

end program

I get: Error: Type mismatch in argument 'b' at (1); passed REAL(4) to UNKNOWN

Why is this not working and how can I achieve my goal?

Was it helpful?

Solution

Yes, or rather no, that's not going to work, not no how. The Intel Fortran compiler complains, about this line:

real(kind=wp) :: b,c,D

that

A kind type parameter must be a compile-time constant.   [WP]

It makes the same complaint about real(kind=wp), dimension(2) :: solution too. This is a deep-rooted feature of Fortran.

To do what you want you will have to define a generic interface, along these lines

interface algoritme1
    procedure :: algoritme1_sp, algoritme1_dp
end interface

and write the code for both those procedures. The compiler can then determine which one is called by the function signature; presumably one would have sp arguments, the other dp arguments.

You might think that this all means that Fortran doesn't do generic procedures, I'll leave that question to the sophists and language nit-pickers. It would be worth your while to search around for generic programming in Fortran; even here on SO there are tricks and tips on how to better avoid writing multiple implementations of what the programmer believes (at odds with the compiler) to be the 'same' code.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top