gpt4 book ai didi

floating-point - 使用错误类型的参数调用外部 Fortran 函数时会发生什么?

转载 作者:行者123 更新时间:2023-12-04 21:31:10 26 4
gpt4 key购买 nike

如果您在文件(而不是模块)中有一个独立的函数,并且您使用单精度调用它,而它需要一个 double 数:

main.f90 :

program main

call test(1.0)
end program main

测试.f90:
subroutine test(a)
double precision :: a
print *, "a", a
end subroutine

在这种情况下,编译器如何从单精度“转换”到 double ?
使用浮点格式,我希望这些位在强制转换期间保持不变,但要附加额外的零。那是:
1 = 0 01111111 00000000000000000000000 in single-precision

我希望最终值为 2^(-7):
0 01111111000 0000000000000000000000000000000000000000000000000000 in double precision

令人惊讶的是,使用 gfortran 6.4.0,最终值为 5.2635442471208903E-315。

最佳答案

编译器不进行强制转换。你写的不是Fortran。

在主程序中,子程序 test有一个隐式接口(interface)。本质上,编译器对此一无所知,只是它是一个子例程。您还告诉它它有一个(默认)实参数。

在引用子例程时提供正确类型和类型的参数是您的责任,而不是编译器的责任。你在那里失败了,所以你没有一个兼容的 Fortran 程序。 Fortran 编译器不欠您任何东西。

您将观察到的内容取决于 Fortran 处理器的实现细节。该子例程需要一个 double 参数,并且没有理由相信它还有其他任何东西。不管是copy-in/copy-out还是某个地址passing1,内存的解释都不会匹配。在 dummy 参数中,除了对应于实际参数的默认实数的字节之外的所有字节都是“垃圾”。

如果您在主程序中为子例程提供显式接口(interface),仍然不会进行强制转换,但编译器会注意到不匹配。同样,即使存在隐式接口(interface),某些编译器(可能具有某些编译标志)也会进行一些检查。

1 有关可能的引用传递的详细信息,请参阅 user5713492 的评论。

关于floating-point - 使用错误类型的参数调用外部 Fortran 函数时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51252364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com