gpt4 book ai didi

matlab - 函数返回具有相同参数的不同答案

转载 作者:行者123 更新时间:2023-12-03 23:43:00 25 4
gpt4 key购买 nike

我正在从 MATLAB 过渡到 Fortran,遇到了各种我从 MATLAB 没想到的奇怪行为。这是一个让我感到困惑的问题:

Program pruebanormal

double precision :: g01eaf, x, y

character :: T*1

integer :: Iffail

Iffail = 0

T = 'L'

x = 0.0

y = g01eaf('L',0.0,Iffail)

write(*,*) 'y = ',y

end program pruebanormal

我有一个相当简单的程序,我试图在其中找到标准 N(0,1) 变量(应为 0.5)的 x=0 处的 pdf。 g01eaf() 是为我执行此操作的 NAG 库函数。我正在使用 gfortran 进行编译。

保留程序的其余部分不变,这取决于我在 g01eaf() 中编写参数的方式,我得到不同的答案:

a) g01eaf(T,x,Iffail)

b) g01eaf(T,0.0,Iffail)

c) g01eaf(T,x,0)

现在,在 MATLAB 下,无论哪种方式我都会得到相同(正确)的答案:y = 0.500000。然而,在 Fortran 下,我得到:

a) y = 0.500000

b) y = 1.000000

c) Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0 0xB766C163
#1 0xB766C800
#2 0xB77763FF
#3 0x804982E in g01eafn_
Violación de segmento (`core' generado)

我不知道 (b) 中的答案,甚至不知道 (c) 是什么意思。

最佳答案

对于“错误结果”的快速回答是在

y = g01eaf('L',0.0,Iffail)

你传递的实变量类型不同于

double precision x
x = 0.0 ! x is still double precision.
y = g01eaf('L',x,Iffail)

函数 g01eaf 可能需要 double :你应该非常仔细地阅读 NAG 的文档。

y = g01eaf('L', 0d0, Iffail)

现在详细说明。

您不希望这些问题经常发生。您希望确保接口(interface)可用于对 g01eaf 的函数调用。然后,您的编译器会提示将默认类型的实数传递给函数。

假设你有一个最新版本的库,你想做类似的事情

use nag_library, only : g01eaf, nag_wp
implicit none

integer Iffail
real(kind=nag_wp) y
y = g01eaf('L', 0._nag_wp, Iffail)

end

同样,请参阅文档。无论是对于库,还是对于模块的意义等。

对于旧版本,应该仍然有一个模块可用,但它可能被称为不同的东西,并且 nag_wp 可能没有定义(这意味着你必须仔细选择种类)。

该模块也会导致提示Iffail需要能够设置,所以必须是一个变量,而不是0。这解释了 (c)。

关于matlab - 函数返回具有相同参数的不同答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23946154/

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