1 整数演算の留意点

固定小数点(整数)演算にはいくつかの注意すべき点がある。

  • 浮動小数点数に比べ、固定小数点(整数)演算は変数の変動幅に細心の注意を払って、オーバーフローが起きないように設計しなければならない。
    しかも、固定小数点(整数)はなるべく大きな数値になるように設計して、計算誤差の最小化を図る必要があるので、オーバーフロー発生の危険性とのトレードオフとなる。
  • プロセッサによっては、オーバーフローを例外事象とせずに計算機上の上限値を設定して知らぬ顔を決め込むものもあり、それが設計で予定していない所で発生してもテストで発見できず、想定外のことが起こりうる危険性がある。
  • 固定小数点(整数)で定数コードを作成する場合、物理量が固定小数点(整数)に正しく変換されているか、それが正しくコーディングされているか、といったことが浮動小数点数で定数コードを作成する場合に比べて労力が多く、誤りが入り易い。
  • このように固定小数点(整数)演算にはいくつもの注意事項があり、設計段階で十分に確認しておくことが望まれる。
  • 変数の変動幅を設計するには、「ロケットの航法と誘導」の「ロケット搭載ソフトウェア開発事例紹介」に示した「数学的シミュレーション・プログラム(SSP)]の方式が有効である。
    変数の変動幅がオーバーフローするまで余裕があるかを、組込ソフトウェアを実行して確認するには[計算機シミュレーション・プログラム(ICS)]の方式が有効である。
  • 固定小数点演算パッケージ(模擬計算機)は上記のSSPとICSの両方を、ある程度兼ね備えたツールである。ただし、組込ソフトウェアは本物のコードではなく、模擬計算機のアセンブリー言語で記述する。

2 Java模擬計算機

(1) Java模擬計算機とは

Java模擬計算機は上記の固定小数点(整数)演算における留意点を解決すべく設計した。

  • 固定小数点演算パッケージ(模擬計算機)は定数と変数に属性(sf、cf) を持たせ、定数は物理量でそのままコーディングする。
      定数=(定数名、物理量、sf、cf)
      ここで、 sf:スケールファクタ
           cf:変換係数
  • 変数は実行時に変動範囲チェックができるように上下限値を設定する。
      変数=(変数名、sf、cf、下限値、上限値)
  • 計算機内部の整数から物理量への変換は下記のように行われる。
      物理量=(整数/2^15)× 2^sf × cf

(2) Java模擬計算機では次のようにコーディングする。

  • 変換係数cfは、組込ソフトウェアのコードとは別に下記のように定義して多くの場所で参照可能としても良いし、少なければ定数や変数を定義するコードに直接記述しても良い。
    public static final double cfVelocity = 3200.0/3579.0*pow15; //速度[rpm]
  • 組込ソフトウェアにおける定数定義のコーディング例
    /**
    * 速度スムージング係数
    * 係数 = 512[μsec] / 12[msec]
    * 係数は[velSmoCoef]*[2^-4]を掛ける。[2^-4]は右へ4ビットシフト
    */
    public static final FixedSingle velSmoCoef = new FixedSingle("velSmoCoef", 512.0/12000.0, -4, 1.0);
  • 組込ソフトウェアにおける変数定義のコーディング例
    /**
    * 速度スムージング積分値
    * 下限値=-3500.0[rpm]、上限値=3500.0[rpm]
    */
    public static FixedDouble velSmoInt = new FixedDouble("velSmoInt", 0, Cons.cfVelocity, -3500.0, 3500.0);
    /**
    * 速度指令
    * 下限値=-3500.0[rpm]、上限値=3500.0[rpm]
    */
    public static FixedSingle velCom = new FixedSingle("velCom", 0, Cons.cfVelocity, -3500.0, 3500.0);
  • 組込ソフトウェアにおける計算コードの例
    // 速度スムージング積分値={速度指令-速度スムージング積分値(上位)}*速度スムージング係数+速度スムージング積分値
    Ram.velSmoInt.store( Ram.velCom.subtract( Ram.velSmoInt.upper()).multiply( Cons.velSmoCoef).shift(-4).add( Ram.velSmoInt));


(3) 組込ソフトウェア実行時のエラー出力の例を示す。下半分はアプリからのテスト出力である。

  • 一番上のエラーメッセージ
    [アンダーフロー@shift : velContDiff*velContPropGain = c1fdc390 << 3]
    は、velContDiffとvelContPropGainの乗算後に左3ビットシフトすると、負の数から正の数に変化する、つまり負数の有効データ最上位"0"値のビットが左から脱落して誤った数値になることを示している。
  • @マークの後ろはエラー発生時の命令コードを、:の後ろは直近の計算式を示しているので、これを手がかりに場所を特定することができる。=の後ろは命令が演算対象とする数値を示している。
    数値の後ろには付加情報を示している。[<<3]は数値を3ビット左シフトすることを表している。
  • 出力例

3 Java開発環境

Java開発ツールEclipse

Javaはeclipseという開発環境が利用できる。インターネットからダウンロードして無料で利用できる。

Java開発ツールEclipse

4 開示する物

固定小数点演算パッケージ(模擬計算機)は、16ビットの単精度演算命令と32ビットの倍精度演算命令の2つのクラスで構成している。公開するのは2つのクラスの他、幾つかのファイルを参考として添付する。



周波数特性