3

この関数は、この計算を実行することになっているMAXIM の71M6511を使用するエネルギー メーター設計のサンプル コードから作成されます。

E = W * 6.6972*10^-13 * VMAX * IMAX (Wh)

VMAX = 600 (but it is stored in the code with a resolution of 0.1 making it 6000)
IMAX = 208 (also stored as 2080)

E はワットアワー単位のエネルギーです。

W は、エネルギー チップによって測定されたキロワット時の生の値です。計算は、エネルギー チップのドキュメント(77 ページ) で提供されている上記の式に基づいて、それを WattHour に変換し、符号付き 32 ビット整数として返します。

ここにコードがあります

#define ONE_MILLION (1000000L)
#WATTSCALE 1885L        // 6.6972E-12 * 2^48.

 static U32 Whr (U08x *w)
{                                             // 'w' is a 8-byte quantity.

U08 xdata x[13], y[12];                  // Need extra digit for divide.
    U32 xdata scale;
    U08 xdata t[4+4+1];

    scale = (U32) Vmax * (U32) Imax;          //scale=[Vmax*10E+01] * [Imax*10E+01].
    multiply_8_4 (y, w,(U08x *)&scale);       // y = w * Vmax * Imax * 10E+02.
    scale = WATTSCALE;                        //[LSB * 2^48 * 10E+01]  (10E-03 Wh).
    multiply_8_4 (x + 1, y,(U08x *)&scale);   //[x*2^16] = [y/2^32]*[LSB * 2^48] (mWh)
                                              //..dropped low-order 4-bytes of 'y'.
    scale = ONE_MILLION;                      // Modulo ONE_MILLION.
    divide (x + 1, (U08x *) &scale, 10, 4, t);// x / 1,000,000;
    x[7] = 0;                                 //Clear high order of 4-byte result.
    return (* (U32x *) &x[7]);                // Return 32-bit answer (x % 1,000,000). 
}

Multiply_8_4() は、8 バイトのデータ (これは w が指すデータ) を 4 バイトのデータ (スケール) で乗算し、結果を別のバッファー (この場合はバッファー x) に配置する関数です。

単純な計算が (私の意見では) 2^48 と 2^32 などの掛け算と割り算でこのように複雑になったのはなぜだろうと思っています。

プログラマーの選択とは別に、これには特定の理由がありますか?

4

2 に答える 2

3

浮動小数点計算を行わない 8 ビット マイクロコントローラーを使用しているようです。彼らはまた、メモリからのデータのフェッチは、short や int ではなくバイトで行う方が効率的であると述べています。あなたが示すコードは、2進小数点の両側に十分なスペースを提供するためにスケーリングされた定数と値を使用して固定小数点乗算を実装し、オーバーフローが発生しないようにし、必要に応じて十分な精度を確保します。

于 2012-09-07T16:53:00.650 に答える
0

何らかの理由で、プログラマーは浮動小数点値ではなく整数で計算を選択した/実行しなければなりませんでした。そう:

  1. 彼は、1 未満の有効桁数が多すぎる値を操作することはできません。6.6972*10^-13 を整数として格納しようとすると、0 になります。したがって、6.6972*10^-13 に 2^48 を掛けると、1885.094214 が得られます。 … ドット以降の数字は切り捨てでも良いでしょう。

  2. いいえ

于 2012-09-07T16:56:51.023 に答える