如何在MATLAB代码中保持非关联性
我有一个稍微简单的问题,但在将Fortran-90代码转录到MATLAB时,我无法重现正确的答案 以下MATLAB代码使用整数如何在MATLAB代码中保持非关联性,matlab,fortran,Matlab,Fortran,我有一个稍微简单的问题,但在将Fortran-90代码转录到MATLAB时,我无法重现正确的答案 以下MATLAB代码使用整数i0=842739021913初始化。这是Fortran-90代码的一部分,由更通用的整数随机数生成器例程组成 i0 = 842739021913 ; function x_tdrand = tdrand ia = int32(513) ; ib = int32(29741096258473) ; it = int32(140737488355328) ;
i0=842739021913
初始化。这是Fortran-90代码的一部分,由更通用的整数随机数生成器例程组成
i0 = 842739021913 ;
function x_tdrand = tdrand
ia = int32(513) ; ib = int32(29741096258473) ; it = int32(140737488355328) ;
t = 1.40737488355328e14 ;
i0 = ia*i0+ib ;
i0 = i0-(i0/it)*it ;
x_tdrand = i0/t ;
end
第二次计算i0
(即i0=i0-(i0/it)*it
)应在Fortran-90中给出i0=39853749433858
(见下文),但使用MATLAB我显然得到零。
感谢您对如何正确复制Fortran代码的任何建议
SUBROUTINE TDRAND(X)
USE module_GENERAL, ONLY: I0
IMPLICIT NONE
INTEGER(8) :: IA, IB, IT
DOUBLE PRECISION :: X, T
DATA IA, IB, IT /513, 29741096258473, 140737488355328/
DATA T /1.40737488355328D14/
I0=IA*I0+IB
I0=I0-(I0/IT)*IT
X=DBLE(I0)/T
RETURN
END SUBROUTINE TDRAND
int32
对于您来说可能太小了,因为您的所有Fortran整数(可能)都是64位的。试试int64
。可能调查i也提供了。@HighPerformanceMark-是的,int64完成了这个任务。非常感谢。很少有人警告,那些大的文本在fortran代码中应该有一个\u8
。@agentp-谢谢你的提示。想详细说明一下吗?我应该更仔细地定义大数吗?是的,定义为29741096258473_8
,尽管命名常量比仅定义文字8要好。