【概要】
マイクロチップ社の提供している浮動小数用算術ライブラリの使い方の
説明をします。
マイクロチップ社の四則演算のある浮動小数算術ライブラリは、AN575と
なりますので、これをベースにして説明していきます。
このAN575にはPIC16用とPIC17用の関数がそれぞれ含まれていますが
ここでは、PIC16シリーズ用で説明していきます。
【内蔵関数】
AN575に含まれているPIC16シリーズ用算術関数は下記となっています。
関数名 機能 24ビット用 FLO1624 16ビット整数を24ビット浮動小数に変換 NRM2424 24ビット浮動小数の正規化 NRM3224 24ビット浮動小数を32ビットに正規化 FLO2424 24ビット整数を24ビット浮動小数に変換 INT2416 24ビット浮動小数を16ビット整数に変換 INT2424 24ビット浮動小数を24ビット整数に変換 FPA24 24ビット浮動小数 加算 FPS24 24ビット浮動小数 減算 FPM24 24ビット浮動小数 乗算 FPD24 24ビット浮動小数 除算 32ビット用 FLO2432 24ビット整数を32ビット浮動小数に変換 NRM3232 32ビット浮動小数の正規化 FLO3232 32ビット整数を32ビット浮動小数に変換 NRM4032 40ビット浮動小数を32ビットに正規化 INT3224 32ビット浮動小数を24ビット整数に変換 INT3232 32ビット浮動小数を32ビット整数に変換 FPA32 32ビット浮動小数 加算 FPS32 32ビット浮動小数 減算 FPM32 32ビット浮動小数 乗算 FPD32 32ビット浮動小数 除算
【使用変数領域と表現】
本ライブラリでは浮動小数を下記フォーマットで表現しています。
(1) 24ビットの場合
下記のような3バイトでメモリに格納されます。引数エリアとして2つが
確保されていて、この2数との間の演算となり、結果はA側に格納されます。
指数部 仮数部上位 仮数部下位
形式 xxxx xxxx s.xxx xxxx xxxx xxxx
引数A AEXP AARGB0 AARGB1
引数B BEXP BARGB0 BARGB1
(2) 32ビットの場合
下記のような4バイトでメモリに格納されます。 引数エリアとして2つが
確保されていて、この2数との間の演算となり、結果はA側に格納されます。
指数部 仮数部上位 仮数部中位 仮数部下位
形式 xxxx xxxx s.xxx xxxx xxxx xxxx xxxx xxxx
引数A AEXP AARGB0 AARGB1 AARGB2
引数B BEXP BARGB0 BARGB1 BARGB2
【基本的な使い方】
この浮動小数の算術ライブラリを使うときには、次のようにします。
例えば、24ビット浮動小数を使うものとし、y = ax+b の計算をするものと
します。ここで、x、yは16ビットの整数値とし、a,bが実数で小数点が
付いた定数であるものとします。
《例題》 y=1.54x + 150 の計算をする。ただしx、yは16ビット整数
この例題では次のように関数を使います。
・16ビット整数xを引数Aにセット(AARGB0とAARGB1に保存)
↓
・16ビット整数xを浮動小数に変換 引数Aに保存 → CALL FLO1624
↓
・1.54という定数を引数Bにセット
↓
・1.54×xを計算 結果は引数Aに保存 → CALL FPM24
↓
・定数150を引数Bにセット
↓
・y=1.54x+150を計算 結果yは引数Aに保存 → CALL FPA24
↓
・yを16ビットバイナリに変換 結果yは引数Aに保存 → CALL INT2416
(AARGB0とAARGB1に格納されている)
これで上記の式の計算をすることができます。
【簡単に浮動小数を求める】
定数や式の計算結果の整数値から浮動小数を、簡単に求めるには、C言語を
使います。
ちょっと反則技ではありますが、どうしてもアセンブラで書かなければならない
とき、ちょっとCコンパイラの力を借りると簡単に浮動小数が求められます。
アセンブラで定数を浮動小数で設定しなければならないとき、Cコンパイラで
求めてから、アセンブラで記述すれば簡単に定数が記述できます。
まず下記のようなプログラムを作成しコンパイルします。そして下図のように
ブレークポイントをプログラムの繰り返し部に設定してからシミュレーションで
実行します。
こうすると1回の実行毎にプログラムは停止しますから、そのときのFile Register
の内容をみれば、浮動小数値がわかります。
このプログラムのFile Registerは下図のように配置されますので
ここに表示された値から個々の数値に対する浮動小数を求めることができます。