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
相关产品推荐
相关产品推荐

