use*_*919 2 floating-point precision fortran gfortran
考虑代码,
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
Run Code Online (Sandbox Code Playgroud)
编译gfortran输出,
1.0000000000000000 6.1232339957367660E-017
Run Code Online (Sandbox Code Playgroud)
我知道常见的浮点问题,但是函数sin完全相同 1 但cos函数不完全相同 0 是否有原因?
以下假设double是 IEEE 754 基本 64 位二进制格式。三角例程的常见实现不如格式支持的准确。然而,对于这个答案,让 \xe2\x80\x99s 假设它们返回尽可能准确的结果。
\xcf\x80 无法在 中精确表示double。最接近的可能值为 884279719003555 / 281474976710656 或 3.141592653589793115997963468544185161590576171875。让\xe2\x80\x99s 称之为p。
p /2的正弦约为 1 \xe2\x88\x92 1.8747\xe2\x80\xa210 \xe2\x88\x9233。两个值在double其两侧表示的两个值是1和0.9999999999999999988889776975374848445957636833191796875 其中最接近的是 1,因此最接近 sine 的可表示值p/2正是 1。
p /2的余弦约为 6.123233995736765886\xe2\x80\xa210 \xe2\x88\x9217。可表示的最接近的值double是 6.12323399573676603586882014729198302312846062338790031898128063403419218957424163818359375\xe2\x80\xa210 \xe2\x88\ x9217。
因此,您观察到的结果是最接近真实数学值的结果。
\n