1

我正在尝试在嵌入式 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。我知道它通过了第一个障碍和第二个障碍。但不知何故,在简单的数学方程中,它变成了零。“句点”也是一个 long unsigned int 并且在类 def 中声明,但您可以看到输出是合适的。

为什么这会一直下降到零?什么不见​​了?我是否需要为较大的数字添加一些特殊的东西,或者我不能在 long unsigned int 或其他东西上使用简单的运算符 * 和 /?

我正在处理大量数字(x<=10,000,000),因为我使用的是内核级 pwm。

4

2 回答 2

6

您遇到的问题power是整数,因此当您/100实际上0整数除法规则而得到结果时。这意味着当您将其乘以 时period,整个结果为0

根据您的精度要求,制作power双精度数可能就足够了,但是请注意,这(power/100)*period通常会产生小数结果,因此可能还需要将结果存储在双精度数中。

如果你必须坚持使用整数,那么这样做((power*period)/100)会给你一个相当准确的结果,因为power*period在除法之前变成一个很大的数 a 00使用整数除法,您放置括号的位置可能是获得或7600000(在您的情况下)之间的区别。

于 2012-10-20T13:34:18.597 回答
0

使newduty and power as double. 因为整数类型它给出 0

于 2012-10-20T13:36:18.950 回答