You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中含sin、cos的数学表达式计算结果错误原因咨询

为什么这个C语言程序的输出和理论计算不符?

先看问题中的代码:

#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 * 1.000000 + 1 * 0.000000 = 0,原因出在两个核心点上:

1. 浮点数的精度误差

M_PI是C标准库提供的π的近似值,并非数学上的精确π值。基于这个近似值计算sin(M_PI/2)时,得到的结果并不是严格的1.0,而是一个非常接近1但略小于1的浮点数(比如实际可能是0.9999999999999999)。同理,cos(M_PI/2)的结果也不是严格的0,而是接近0的极小值。

2. 整数强制转换的向零取整规则

当把浮点数强制转换为int类型时,C语言会直接截断小数部分,采用向零取整的规则。计算-1 * sin(M_PI/2) + cos(M_PI/2)后,得到的结果是一个略大于-1的数值(比如-0.9999999999999999),这个值截断小数部分后就变成了0,而非理论上的-1。

验证方法

如果用更高精度的格式输出中间结果,就能看到真实的数值:

#include <stdio.h>
#include <math.h>

int main()
{
    double s = sin(M_PI/2);
    double c = cos(M_PI/2);
    printf("sin(M_PI/2) = %.16lf, cos(M_PI/2) = %.16lf\n", s, c);
    double temp = -1 * s + c;
    printf("temp = %.16lf, (int)temp = %d\n", temp, (int)temp);
    return 0;
}

运行后就能清楚看到s并非严格的1.0,temp也不是严格的-1,从而理解转换后得到0的原因。

内容的提问来源于stack exchange,提问作者Fyodor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:51:05