Compiler construction 在FORTRAN中从“real”到“double precision”的转换是否应该受到编译器的影响?
我有一个需要在服务器上运行的FORTRAN代码。我注意到两台机器的结果有点不同。通过研究,我了解到差异是从返回Compiler construction 在FORTRAN中从“real”到“double precision”的转换是否应该受到编译器的影响?,compiler-construction,casting,fortran,intel-fortran,Compiler Construction,Casting,Fortran,Intel Fortran,我有一个需要在服务器上运行的FORTRAN代码。我注意到两台机器的结果有点不同。通过研究,我了解到差异是从返回实数值的函数上升到双精度变量的函数。在本地计算机上,我使用旧编译器(gnu f95 4.1.2),在远程计算机上,我使用ifort 对于由不同编译器编译的同一程序,您应该期望它们之间的差异很小。有限精度算法不遵守我们期望的实数规则。因此,如果编译器更改操作顺序,结果可能会略有不同 这就是说,gfortran 4.1非常陈旧,已经过时。我不会使用早于4.3的gfortran版本。我强烈建议
实数
值的函数上升到双精度
变量的函数。在本地计算机上,我使用旧编译器(gnu f95 4.1.2),在远程计算机上,我使用ifort 对于由不同编译器编译的同一程序,您应该期望它们之间的差异很小。有限精度算法不遵守我们期望的实数规则。因此,如果编译器更改操作顺序,结果可能会略有不同
这就是说,gfortran 4.1非常陈旧,已经过时。我不会使用早于4.3的gfortran版本。我强烈建议升级。您应该期望由不同编译器编译的同一程序之间的差异很小。有限精度算法不遵守我们期望的实数规则。因此,如果编译器更改操作顺序,结果可能会略有不同
这就是说,gfortran 4.1非常陈旧,已经过时。我不会使用早于4.3的gfortran版本。我强烈建议升级。请注意,实际值可能是32位浮点数,而双精度是64位。我怀疑结果的差异是由于两个编译器在传递
real
值时填充double precision
变量中额外位的方式不同所致。但是,Fortranreal
的默认大小取决于编译器,可以通过编译器选项进行设置,因此请检查您的文档和编译选项
double precision
现在已被弃用,但需要提供比默认的real
更高的精度,尽管连续的Fortran标准没有说明要提供多高的精度。大多数计算机上的大多数编译器对于双精度
默认为64位是合理的,但您可能不想将抵押权押在合理的预期上。请注意,您的实际值可能是32位浮点数,而双精度是64位。我怀疑结果的差异是由于两个编译器在传递real
值时填充double precision
变量中额外位的方式不同所致。但是,Fortranreal
的默认大小取决于编译器,可以通过编译器选项进行设置,因此请检查您的文档和编译选项
double precision
现在已被弃用,但需要提供比默认的real
更高的精度,尽管连续的Fortran标准没有说明要提供多高的精度。大多数计算机上的大多数编译器对于双精度
默认为64位是合理的,但您可能不想把抵押权押在合理的预期上。谢谢。简而言之,我无法升级它。我得到的数字(例如)是-8.442167043685913E-003,而不是-8.442166328430176E-003。这种差异是否如您所描述的那样小?如果在分配给双精度变量之前,以单精度进行计算,那么这种差异是合理的。它只在小数点后第6位上有所不同,这是单精度的所有要求。如果以双精度完成,它比典型的更大,但仍然可能,这取决于…谢谢。简而言之,我无法升级它。我得到的数字(例如)是-8.442167043685913E-003,而不是-8.442166328430176E-003。这种差异是否如您所描述的那样小?如果在分配给双精度变量之前,以单精度进行计算,那么这种差异是合理的。它只在小数点后第6位上有所不同,这是单精度的所有要求。如果以双精度完成,它比典型的要大,但仍然有可能,这取决于…现在不推荐使用双精度?我应该用什么来代替呢?我倾向于用那种。这些天内在模块iso\u fortran\u env
中定义的参数(例如real64
,int32
)。如果您的编译器尚未提供此功能,请查看函数selected\u real\u kind
及其使用方法。现在不推荐使用双精度?我应该用什么来代替呢?我倾向于用那种。这些天内在模块iso\u fortran\u env
中定义的参数(例如real64
,int32
)。如果您的编译器尚未提供此功能,请查看函数selected\u real\u kind
及其使用方法。