代码之家  ›  专栏  ›  技术社区  ›  Fyodor

在C中使用sin和cos计算数学表达式不正确?

  •  0
  • Fyodor  · 技术社区  · 12 月前

    为什么这个简单的程序

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        int res = (int)(-1 * sin(M_PI/2) + 1 * cos(M_PI/2));
        printf("-1 * %f + 1 * %f = %d\n", sin(M_PI/2), cos(M_PI/2), res);
        return 0;
    }
    

    给出以下不正确的输出?

    -1 * 1.000000 + 1 * 0.000000 = 0
    
    1 回复  |  直到 12 月前
        1
  •  3
  •   dbush    12 月前

    如果打印更多有效数字:

    double res = -1 * sin(M_PI/2) + 1 * cos(M_PI/2);
    printf("-1 * %.17f + 1 * %.17f = %.17f\n", sin(M_PI/2), cos(M_PI/2), res);
    

    您将看到问题:

    -1 * 1.00000000000000000 + 1 * 0.00000000000000006 = -0.99999999999999989
    

    在这种情况下,浮点的不精确性为调用提供了结果 cos 这并不完全是0。因此,您的最终结果略大于-1,并将该值转换为 int 将值截断为0,结果为0。