为什么这个简单的程序
#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
如果打印更多有效数字:
double res = (double)(-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。