我正在尝试计算这个等式:
int n = 89;
int SUMx = 347762, SUMy = 4898, SUMxy = 19671265;
long long SUMxx = 1370329156;
printf("(float)(( SUMx*SUMy - n*SUMxy ) / ( SUMx*SUMx - n*SUMxx ) = %f \n", (float)(( SUMx*SUMy - n*SUMxy ) / ( SUMx*SUMx - n*SUMxx )));
SUMxx曾经是int,但是做了n * SUMxx溢出,所以我将它改为long long。现在它只是给我一个0.000000的答案,我希望它是0.0464。
我如何做到这一点?我需要将其他数据类型更改为long long吗?
谢谢:)
答案 0 :(得分:5)
你正在进行整数除法,因此在将它转换为float之前,0和1之间的任何内容都将被截断。在进行算术运算之前,将其中一个值转换为double(或float),这样就可以使用浮点运算
int n = 89;
int SUMx = 347762, SUMy = 4898, SUMxy = 19671265;
long long SUMxx = 1370329156;
printf("(float)(( SUMx*SUMy - n*SUMxy ) / ( SUMx*SUMx - n*SUMxx ) = %f \n",
( SUMx*SUMy - n*SUMxy ) / (float)( SUMx*SUMx - n*SUMxx ));
答案 1 :(得分:1)
除非你感到非常自虐,否则将它们全部改为double
,摆脱对float
的阉割,并完成它。
如果你感觉受虐狂,你可以在恰当的位置做个别演员,但这会更有效,整数和浮点之间的转换也可能会让它变得更慢。
double n = 89;
double SUMx = 347762, SUMy = 4898, SUMxy = 19671265;
double SUMxx = 1370329156;
printf("(( SUMx*SUMy - n*SUMxy ) / ( SUMx*SUMx - n*SUMxx ) = %f \n", (( SUMx*SUMy - n*SUMxy ) / ( SUMx*SUMx - n*SUMxx )));
答案 2 :(得分:1)
计算的主要问题是计算整数类型除以整数类型然后将其转换为浮点数。这将产生整数舍入除法。分子和分母应该是浮点类型(浮点数或双精度),如下所示:
(float)( SUMx*SUMy - n*SUMxy ) / (float)( SUMx*SUMx - n*SUMxx )
给出0.000391。
然后只要分子和分母中的整数运算符适合int的内部,一切都应该是好的。
答案 3 :(得分:1)
尝试这样的事情......
(((float)(SUMx * SUMy - n * SUMxy)/(float)(SUMx * SUMx - n * SUMxx)));
请记住,99/100如果两个都是整数将给你0 ...但如果其中一个是十进制它将工作...我也没有检查,以确保你没有翻身你的彗星...就像Tomalak说你需要确保你在这些乘法中不会超过你的int的大小,否则它会翻身......