C++数学问题和5/4*pi vs 5*pi/4

-6 c c++ math visual-studio visual-c++

#define M_PI acos(-1.0)

int main()
{
    double z1 = sin(M_PI / 2 + 3 * x) / (1 - sin(3 * x - M_PI));
    double z2 = 1 / tan(5 * M_PI / 4 + 3 * x / 2);  // line 14
    double z3 = 1 / tan(5 / 4 * M_PI + 3 * x / 2);  // line 15

    printf("%lf, %lf, %lf, z1, z2, z3);
}
Run Code Online (Sandbox Code Playgroud)

因此,正如您在14行和15行中看到的,我们有非常相似的表达式.那么为什么我们得到不同的结果呢?

Bat*_*eba 6

5 / 4 * M_PI被分组为(5 / 4) * M_PI5 / 4在整数运算进行评价的存在,这是1.

以另一种方式编写它会强制将其他系数转换为浮点.

(作为最后一点,#define M_PI acos(-1.0)任何常见的浮点方案(包括IEEE754)都不能保证华丽的定义能够在平台上的浮点类型允许的精度内恢复pi的数学值.最好用手写出来.)