这里有哪些地址@High性能标志的关切的工作例子的结果。
host system = (redacted)
compiler version = GCC version 5.1.0
compiler options = -fPIC -mmacosx-version-min=10.9.4 -mtune=core2 -Og -Wall -Wextra -Wconversion -Wpedantic -fmax-errors=5
execution command = ./a.out
Compare mesh points
1.57017982 1.57080817 1.57143652
1.57016802 1.57079625 1.57142460
Compare function values at these mesh points
1622.04211 -84420.7344 -1562.01758
1591.57471 13245402.0 -1591.65527
有在演示一个不好的编程习惯你发现:通过网移动通过添加步骤(+增量),而不是对其计数(K *增量)。这个问题很普遍,并带来严重后果(https://www.ima.umn.edu/~arnold/disasters/patriot.html)。
有关你的代码演示,网格的尺寸提高到了10K点。还示例函数从cos x
变为tan x
和我们检查在PI/2 = 1.57079633奇异点附近。虽然novitiate可能会发现网格值的差异不重要,但函数值的差异是显着的。
的代码如下所示 -
(13)= 1/8192网误差可以通过使用具有如2 ^(准确的二进制表示的增量减小)。编译命令是gfortran -Wall -Wextra -Wconversion -Og -pedantic -fmax-errors=5 demo.f95
。运行命令是./a.out
。
program demo
use iso_fortran_env
implicit none
real, parameter :: pi = acos (-1.0)
integer, parameter :: n = 10001
real, dimension (1 : n) :: x, y, z
real :: a = 0.0, b = 2 * pi
real :: increment
integer :: k, quarter, status
character (len = *), parameter :: c_options = compiler_options()
character (len = *), parameter :: c_version = compiler_version()
character (len = 255) :: host = " ", cmd = " "
! queries
call hostnm (host, status)
call get_command (cmd)
! write identifiers
write (*, '(/, "host system = ", g0 )') trim (host)
write (*, '( "compiler version = ", g0 )') c_version
write (*, '( "compiler options = ", g0 )') trim (c_options)
write (*, '( "execution command = ", g0, /)') trim (cmd)
increment = (b - a)/(n - 1)
quarter = n/4
! mesh accumulates errors
x (1) = 0.0
do k = 2, n
x (k) = x (k - 1) + increment
end do
y = tan (x)
print *, 'Compare mesh points'
print *, x (quarter : quarter + 2)
! better mesh
x (1) = 0.0
do k = 2, n
x (k) = (k - 1) * increment
end do
z = tan (x)
print *, x (quarter : quarter + 2)
print *, 'Compare function values at these mesh points'
print *, y (quarter : quarter + 2)
print *, z (quarter : quarter + 2)
end program demo
“一些错误”可以通过“一些解决方案”来解决。更加详细一些。 – DCoder
并具体说明您正在使用哪个版本的gfortran。 –