通过替换所有的代码,我是否获得了更高的代码准确性:
real(dl) variable1
通过在每个Fortran90源文件的开头放置:
integer, parameter :: wp = selected_real_kind(15,307)
并声明如下变量:
real(wp) variable1
更新1
你说得对,一个简单的程序给出:
program main
implicit none
integer, parameter :: dl = KIND(1.d0)
integer, parameter :: wp = selected_real_kind(15,307)
real(kind=dl) :: dl_number
real(kind=wp) :: wp_number
write(*,*) 'epsilon for dl number', epsilon(dl_number)
write(*,*) 'precision for dl number', precision(dl_number)
write(*,*) 'epsilon for wp number', epsilon(wp_number)
write(*,*) 'precision for wp number', precision(wp_number)
stop
end
以及产出:
epsilon for dl number 2.2204460492503131E-016
precision for dl number 15
epsilon for wp number 2.2204460492503131E-016
precision for wp number 15
因此,没有必要使用wp = selected_real_kind(15,307)
而不是dl = KIND(1.d0)
。
发布于 2020-01-07 10:59:40
一般情况下没有。
有两个问题:
作为第一次诊断,无论如何,执行
write(*,*) 'dl =', dl
write(*,*) 'wp =', wp
看看它们是否真的是一样的。
然后,您可以获得有关以下类型的一些信息:
real(kind=dl) :: dl_number
real(kind=wp) :: wp_number
write(*,*) 'epsilon for dl number', epsilon(dl_number)
write(*,*) 'precision for dl number', precision(dl_number)
write(*,*) 'epsilon for wp number', epsilon(wp_number)
write(*,*) 'precision for wp number', precision(wp_number)
epsilon
返回该类型的最小可表示数字,precision
返回十进制精度。
无论如何,你应该知道你的计算和工作所需要的准确性。
正如albert和Ian所指出的,代码中还有很多地方需要检查数字表示的问题。
1.0/3.0
和1._wp/3._wp
值也将返回默认值(即单精度),例如real
函数。https://stackoverflow.com/questions/59626314
复制相似问题