Fortran第0版&x2B;0不等于0

Fortran第0版&x2B;0不等于0,fortran,Fortran,我决定在这里发帖,因为我的fortran90代码遇到了一个非常奇怪的问题。 事实上,我声明了双精度变量,如下所示: double precision, dimension(-1:20,-1:20) :: a,b,c 然后我将所有变量初始化为零 a(:,:) = 0.d0 b(:,:) = 0.d0 c(:,:) = 0.d0 最后我做了计算 a(1:17,2:18) = a(1:17,2:18) + b(1:17,2:18) + 0.5d0*c(1:17,2:18) 我检查了每个变量,在计

我决定在这里发帖,因为我的fortran90代码遇到了一个非常奇怪的问题。 事实上,我声明了双精度变量,如下所示:

double precision, dimension(-1:20,-1:20) :: a,b,c
然后我将所有变量初始化为零

a(:,:) = 0.d0
b(:,:) = 0.d0
c(:,:) = 0.d0
最后我做了计算

a(1:17,2:18) = a(1:17,2:18) + b(1:17,2:18) + 0.5d0*c(1:17,2:18)
我检查了每个变量,在计算之前它们都等于零,但是我得到

abs(maxval(a(1:17,2)) - minval(a(1:17,2))) = 4.336808689942018E-019
这毫无意义,但我不知道问题出在哪里,有人能帮我解决这个问题吗

问候


附言:我使用ifort时有以下选项:“-O3-xHost-vec-report0-implicitnone-warn truncated\u source-warn argument\u checking-warn unused-warn declarations-warn alignments-warn ignore\u loc-warn usage-check nobounds-ftz”

我在MS Visual Studio 2005(英特尔Fortran 11.0.3452.2005)上运行了您的代码片段得到了0.000000000000000E+000。在GNU Fortran 4.9.0上得到了相同的结果

不确定这对你的情况是否有影响,但我建议你使用DABS而不是ABS


Fausto

或的可能副本:如果您可以将其转换为显示问题的可复制/粘贴可编译示例,这将非常有用。但我不能使用推断程序进行复制。最好使用泛型内在函数,然后让编译器决定如何处理操作。同意Joel的观点,泛型
abs
是更好的样式。我认为这是个人的策略/品味问题,但是我从来没有让编译器来决定我编写的程序语句的更好之处。有时这也是一个好主意:如果我使用双精度内在函数并得到一个错误,这表明我在某个地方搞砸了,我的代码需要一些修补。这不是编译器关于什么更好的自由决定!本质的通用解析遵循标准中定义的语言规则。我认为错误捕获的论点是可疑的,不精确的赋值通常会被编译器警告捕获,使用泛型名称不仅被我认为是更好的风格,而且被权威人士认为是更好的风格,比如克莱曼和斯派克特的《伟大风格指南》。