你能用C语言对不匹配的数据类型进行算术运算吗?
我试图计算这个等式:你能用C语言对不匹配的数据类型进行算术运算吗?,c,math,C,Math,我试图计算这个等式: 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 = 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和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 ));
您正在进行整数除法,因此在将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 ));
除非你感到极度的受虐狂,否则把它们都改成双倍,去掉浮法的演员阵容,然后就完蛋了 如果你感到受虐狂,你可以在正确的地方进行单独的强制转换,但这将需要更多的工作,整数和浮点之间的转换可能也会使转换速度变慢
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 )));
除非你感到极度的受虐狂,否则把它们都改成双倍,去掉浮法的演员阵容,然后就完蛋了 如果你感到受虐狂,你可以在正确的地方进行单独的强制转换,但这将需要更多的工作,整数和浮点之间的转换可能也会使转换速度变慢
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 )));
计算的主要问题是,您正在计算整数类型除以整数类型,然后将其转换为浮点。这将产生整数四舍五入除法。分子和分母应为浮点型浮点型或双精度型,如下所示:
(float)( SUMx*SUMy - n*SUMxy ) / (float)( SUMx*SUMx - n*SUMxx )
给出了0.000391
然后,只要分子和分母中的整数运算符适合整数,一切都应该是好的。计算的主要问题是,您正在计算整数类型除以整数类型,然后将其转换为浮点。这将产生整数四舍五入除法。分子和分母应为浮点型浮点型或双精度型,如下所示:
(float)( SUMx*SUMy - n*SUMxy ) / (float)( SUMx*SUMx - n*SUMxx )
给出了0.000391
那么,只要分子和分母中的整数运算符适合整数,一切都应该是好的。hmmm
试试这样的
floatSUMx*SUMy-n*SUMxy/floatSUMx*SUMx-n*SUMxx
请记住,如果99/100都是整数,则会给您0。。。但是如果其中一个是十进制的,它就可以工作了。。。另外,我还没有检查以确保你没有滚动你的积分。。。就像Tomalak说的,你需要确保你在乘法中没有超过整数的大小,否则它会翻滚 hmmm
试试这样的
floatSUMx*SUMy-n*SUMxy/floatSUMx*SUMx-n*SUMxx
请记住,如果99/100都是整数,则会给您0。。。但是如果其中一个是十进制的,它就可以工作了。。。另外,我还没有检查以确保你没有滚动你的积分。。。就像Tomalak说的,你需要确保你在乘法中没有超过整数的大小,否则它会翻滚 您忘了指定程序设计运行的平台。int、long int和long long int的宽度取决于此…如果有帮助的话,我正在使用stdint.h..您忘记了指定程序设计运行的平台。int、long int和long-long int的宽度取决于此…如果有帮助,我使用stdint.h…除非有充分的理由,否则永远不要使用float。它几乎肯定会因为精度的损失而给你带来重大的错误。我同意你的看法。我只是尽可能地保持原始海报代码的相似性。我只是注意到我从计算器得到的答案.45434与从float-SUMx*SUMy-n*SUMxy/float-SUMx*n*SUMxx得到的答案.000391之间存在差异。我想这就是你们一直在谈论的错误损失……除非有充分的理由,否则不要使用float。它几乎肯定会因为精度的损失而给你带来重大的错误。我同意你的看法。我只是尽可能地保持原始海报代码的相似性。我只是注意到我从计算器得到的答案.45434与从float-SUMx*SUMy-n*SUMxy/float-SUMx*n*SUMxx得到的答案.000391之间存在差异。我想这就是你们一直在谈论的错误损失。。。