-
-
Notifications
You must be signed in to change notification settings - Fork 11.7k
Closed
Description
Reproducer
Consider:
! isoc_oddity.f90
module coddity
use iso_c_binding, only: c_double
implicit none
contains
subroutine c_add(a, b, c) bind(c, name="c_add")
real(c_double), intent(in) :: a, b
real(c_double), intent(out) :: c
print*, "a is", a
print*, "b is", b
c = a + b
end subroutine c_add
end module coddityWhich compiles fine but doesn't do what one might expect:
python -m numpy.f2py -c isoc_oddity.f90 -m buggy
python -c 'import buggy;res=buggy.coddity.c_add(1, 2); print(f"res: {res}, exp: 3, eq: {res==3}")'
a is 2.0000004731118679
b is 5.3049894774131808E-315
res: 1.0, exp: 3, eq: FalseClearly, c_double is not being interpreted correctly. This has an easy user-land fix though, adding an .f2py_f2cmap file to the directory (or passing a named file in via the command line) with the following:
# isoc_f2cmap
dict(
real=dict(c_double="double"),
)Will work correctly:
python -m numpy.f2py -c isoc_oddity.f90 -m buggy --f2cmap isoc_f2cmap
python -c 'import buggy;res=buggy.coddity.c_add(1, 2); print(f"res: {res}, exp: 3, eq: {res==3}")'
a is 1.0000000000000000
b is 2.0000000000000000
res: 3.0, exp: 3, eq: TrueSuggestion
This is definitely unexpected behavior, iso_c_binding values should be mapped correctly by default, or atleast loaded in when the iso_c_binding module is used.
rgommers