我对此非常困惑......以下是我的代码摘录..
float m = 0.0, c = 0.0;
printf("toprightx = %d bottomrightx = %d toprighty = %d bottomrighty = %d\n",
toprightx, bottomrightx, toprighty, bottomrighty);
// find m and c for symmetry line
if (toprightx == bottomrightx) {
m = (-toprighty + bottomrighty);
}
else {
m = (-toprighty + bottomrighty) / (toprightx - bottomrightx);
}
c = -toprighty - (m * toprightx);
printf("m = %f and c = %f\n", m, c);
这是输出:
toprightx = 241 bottomrightx = 279 toprighty = 174 bottomrighty = 321
m = -3.000000 and c = 549.000000
为什么输出舍入m和c?我已将它们声明为浮点数,因此我不明白为什么代码返回整数。 m的正确值应为-3.8684。
(请注意,toprightx,bottomrightx,toprighty,bottomrighty已在代码中进一步声明为整数。)
答案 0 :(得分:14)
请注意,toprightx,bottomrightx,toprighty,bottomrighty已经 在代码中进一步声明为整数。
有你的答案。仅涉及整数的计算在整数数学中执行,包括除法。然后将结果分配给浮点数并不重要。
要解决这个问题,要么将至少一个x / y值声明为float,要么将其转换为浮动计算。
答案 1 :(得分:7)
您正在此行执行整数除法:
(-toprighty + bottomrighty) / (toprightx - bottomrightx);
由于topright,bottomrighty,toprightx和bottomrightx都是整数,因此该等式的结果也将是整数。等式计算完整数后,您将其分配给浮点数。它相当于:
float m = -3;
你可以这样做:
(-toprighty + bottomrighty + 0.0) / (toprightx - bottomrightx);
答案 2 :(得分:5)
这是你的int
:
m = (-toprighty + bottomrighty) / (toprightx - bottomrightx);
^int ^int ^int ^int
所有这些操作都将使用整数除法(截断浮点)执行,然后转换为float
。请尝试改为:
m = float(-toprighty + bottomrighty) / (toprightx - bottomrightx);
答案 3 :(得分:3)
那是因为你在计算时只使用了int,所以C ++使用整数计算。只需将你的一个int变量强制转换为float,你就会很好。
将此语句m = (-toprighty + bottomrighty) / (toprightx - bottomrightx);
更改为m = (-toprighty + bottomrighty) / (float)(toprightx - bottomrightx);
即可。
答案 4 :(得分:2)
在要求混合算术之前,将toprightx,bottomrightx,toprighty,bottomrighty声明为浮点数或将它们转换为浮点数。
答案 5 :(得分:2)
将一个浮动转换为int(隐式地,正如你所做的那样)会截断那些不适合新类型的数据。
请注意,您的数据也未被舍入,它被截断。
答案 6 :(得分:1)
尝试将除数转换为浮点数,以强制除法使用浮点运算:
m = (-toprighty + bottomrighty) / (float)(toprightx - bottomrightx);