为什么sin ^ 2(a)+ cos ^ 2(a)的整数类型转换返回0而不是1?

时间:2017-05-28 09:01:39

标签: c trigonometry sine cosine typecasting-operator

当我打印sin(theta)* sin(theta)+ cos(theta)* cos(theta)时,它的出现等于1.000000。但是,当我将相同的表达式转换为int时,结果为0。

 #include< stdio.h >
 #include< math.h >
 #define PI acos(-1)
 int main()
 {
     float theta;
     printf("Theta : ");
     scanf("%f",&theta);
     theta=theta*PI/180;
     printf("%f\n",sin(theta)*sin(theta)+cos(theta)*cos(theta));
     printf("%d\n",(int)(sin(theta)*sin(theta)+cos(theta)*cos(theta)));
     return 0;
 }

1 个答案:

答案 0 :(得分:4)

当您将浮点数转换为整数时,它会丢弃小数点后的所有数字。由于仅使用有限数量的位来表示数字这一事实导致的舍入误差,因此1.0000实际上可能接近于0.99999999999999。所有浮点数都受此问题的影响。因此,在处理浮点数时,永远不要期望得到确切的答案。

您的显示将结果四舍五入为1.00000。但是,当0.999999被转换为int时,它会丢弃小数,因此它最终为0.

您可以使用round()roundf()功能确保它按预期舍入。 (reference)

 #include< stdio.h >
 #include< math.h >
 #define PI acos(-1)

 int main()
 {
     float theta;
     printf("Theta : ");
     scanf("%f",&theta);
     theta=theta*PI/180;

     float resultf  = sin(theta)*sin(theta)+cos(theta)*cos(theta);
     int   resulti  = roundf(resultf);
     printf("%f\n",resultf);
     printf("%d\n",resulti);
     return 0;
 }