7

Cでdoubleデータ型を算術ビットシフトしようとしています。これが正しい方法であるかどうか疑問に思っていました:

注: firdelay[ ][ ] は main で double firdelay[8][12] として宣言されています。

void function1(double firdelay[][12]) {
    int * shiftptr;

    // Cast address of element of 2D matrix (type double) to integer pointer
    *shiftptr = (int *) (&firdelay[0][5]); 

    // Dereference integer pointer and shift right by 12 bits
    *shiftptr >>= 12; 
}
4

6 に答える 6

6

浮動小数点データ型をビット単位でシフトしても、探している結果は得られません。

Simulinkでは、ShiftArithmeticブロックは整数データ型のビットシフトのみを実行します。浮動小数点型をフィードすると、入力信号が除算2^Nされます。ここで、Nは、マスクダイアログボックスで指定されたシフトするビット数です。

編集:
浮動小数点演算を実行する機能がないため、オプションは次のとおりです。

  • 浮動小数点単精度数のレイアウトを理解し、除算を実現するためにビット単位で操作する方法を理解します。
  • 移植するアルゴリズムを変換して、浮動小数点ではなく固定小数点データ型を使用します

オプション2をお勧めします。1よりもはるかに簡単です。

于 2011-08-10T18:24:04.597 に答える
4

浮動小数点データ型(intとして再解釈される)をビットシフトすると、ぎこちないものになります(理由については、ここでバイナリ表現の図を参照してください)。

2の累乗で乗算/除算する場合は、明示的に行う必要があります。

于 2011-08-10T18:17:43.933 に答える
1

表現が不十分で非常に不明確なドキュメンテーションによると、Simulink の「ビット シフト」は浮動小数点値に対して 2 つの引数を取り、浮動小数点値を 2 倍して引数の差にする効果があるようです。

を使用ldexp(double_number, bits_to_pseudo_shift)して、この動作を取得できます。関数ldexpは にあり<math.h>ます。

于 2011-08-10T18:30:20.293 に答える
0

これを行う正しい方法はありません。の両方のオペランドは<<、何らかの整数型でなければなりません。

あなたがしているのは、doubleオブジェクトをオブジェクトであるかのように解釈 (「タイプパニング」) し、結果の値intをシフトすることです。とがたまたま同じサイズだったとしても、これが役に立つことはほとんどありませんint。(たとえそれが便利だとしても、符号付きの値よりも符号なしの値をシフトする方が理にかなっています)。doubleint

于 2011-08-10T18:19:04.273 に答える