我试图在嵌入式C / C ++环境中进行一些简单的变量操作。出于某种原因,我总是因此而得到零。
这是代码
void Heater::setPower( int newpower )
{
printf("1 new power %d\n",newpower);
if(newpower != power)
power = newpower;
else
return;
printf("2 new power %d\n",power);
// Set Duty
long unsigned int newduty = 0;
// Protect from divide by zero
if(power <= 0)
{
printf("2.5 zeroed\n");
newduty = 0;
power = 0;
}
else
newduty = period*(power/100);
printf("3 setduty %lu period %lu\n", newduty, period);
setDuty(newduty);
}
这是我收到的输出
1 new power 76
2 new power 76
3 setduty 0 period 10000000
所以我知道收到的号码是76.我知道它已经超过了第一个障碍,第二个障碍。但不知何故,在简单的数学方程式中,它变为零。 “period”也是一个长的unsigned int,并在类def中声明,但是你可以看到输出是合适的。
为什么一直下降到零?缺什么?我是否需要为较大的数字包含一些特殊的东西,或者我可以在长的unsigned int上使用简单的运算符*和/?
我正在处理高数字(x <= 10,000,000),因为我正在使用内核级别pwm。
答案 0 :(得分:6)
您遇到的问题是power
是一个整数,所以当您/100
由于{0
的结果而导致period
结果时3}}。这意味着当您将其乘以0
时,整个结果为power
。
根据您的精度要求,将(power/100)*period
设为double可能就足够了,但要注意((power*period)/100)
通常会产生一个小数结果,因此将结果存储为double也可能是必需的。
如果你必须坚持使用整数power*period
这会给你一个相当准确的结果,因为0
变成一个很大的数字,然后除法使0
成为一个整数。使用整数除法,您放置括号可以是获得7600000
或{{1}}(在您的情况下)之间的差异。
答案 1 :(得分:0)
制作newduty and power as double
。因为整数类型它给出0