【发布时间】:2018-01-26 08:46:24
【问题描述】:
考虑代码,
PROGRAM TRIG_TEST
IMPLICIT NONE
DOUBLE PRECISION, PARAMETER :: PI=4.D0*DATAN(1.0D)
print *, sin(PI/2.0), cos(PI/2.0)
END PROGRAM TRIG_TEST
使用gfortran 输出编译,
1.0000000000000000 6.1232339957367660E-017
我知道常见的浮点问题,但是否有原因 sin 函数完全相同为 1,但 cos 函数不完全相同为零?
【问题讨论】:
-
您的编译器的
episilon(1d0)的值是多少? -
值是~2.2e-16?
-
听起来很有道理。假设
sin和cos都精确到7E-017之内。这将为您提供cos的答案。1-7E-017等于1.[你说你理解“通常的浮点问题”。您是否需要对这方面进行解释,或者您是否称其为轻微疏忽?] -
您可以通过使用 PI = ACOS(-1.d0) 来避免 PI 定义中的乘法。像三角函数这样的内在函数不需要双精度特定版本。 ATAN 就足够了,就像您使用 sin 和 cos 而不是 dsin 和 dcos 一样。 Fortran 将根据参数链接正确的版本。同样要正式正确,您的文字应该是双精度的:print*, sin(PI/2.d0), cos(PI/2.d0)。
标签: floating-point fortran precision gfortran