Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你能用C语言对不匹配的数据类型进行算术运算吗?_C_Math - Fatal编程技术网

你能用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之间存在差异。我想这就是你们一直在谈论的错误损失。。。