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であることを知っています。私はそれが最初のハードルと2番目のハードルを超えていることを知っています。しかし、どういうわけか、単純な数学の方程式では、それはゼロになります。「period」も長いunsignedintであり、クラスdefで宣言されていますが、出力が適切であることがわかります。

なぜこれが一貫してゼロに落ちるのですか?何が欠けている?大きな数のために特別なものを含める必要がありますか、それとも単純な演算子*および/を長いunsigned intなどで使用できませんか?

カーネルレベルのpwmを使用しているため、高い数値(x <= 10,000,000)を処理しています。

4

2 に答える 2

6

あなたが抱えている問題はそれpowerが整数であるということです、それであなたが実際にあなたが整数除算の規則による/100結果で終わるとき。これは、これにを掛けると、結果全体が。になることを意味します。0period0

power精度の要件によっては、doubleを作成するだけで十分な場合がありますが(power/100)*period、通常は小数の結果が生成されるため、結果をdoubleに格納する必要がある場合もあることに注意してください。

If you have to stick with integers just do ((power*period)/100) this will give you a reasonably accurate result since power*period becomes a large number before the division makes anything a 0. With integer division, where you put the brackets can be the difference between getting a 0 or 7600000 (in your case).

于 2012-10-20T13:34:18.597 に答える
0

make newduty and power as double. because of integer type it giving 0

于 2012-10-20T13:36:18.950 に答える