浮動小数点演算浮動小数点演算プログラムの作成 プ...
TRANSCRIPT
一般に技術計算などでは非常に大きな数や小さな数を扱
います.整数演算ではけた落ちを起こします.そのため浮
動小数点数の演算(以下,浮動小数点演算)が必要になり
ます.
最近のパソコン向けCPUでは,浮動小数点演算命令が
用意されており,ハードウェアによって実行されるのが普
通です.しかし,組み込み向けCPUではソフトウェアで
実現する場合がかなりの部分を占めます.
C言語の場合,Float(4バイト)精度でよいケースでも演
算はDouble(8バイト)で行い,結果をFloatに変換してい
ます.そのため実行時間が長くなります(V850のCコンパ
イラではFloatのみのサポート).ここではFloatとDouble
のそれぞれについて,個別にプログラムを作成しておき,
必要に応じて使い分けられるようにします.
筆者は過去にZ80と 8086の浮動小数点演算プログラム
を作成しましたが,ターゲット・マシンに絞って作成した
ために汎用性がありませんでした.
今回紹介するプログラムは,効率が多少低下しますが,
汎用性のあるものです.プログラムは主にC言語で作成
し,演算や変換など,よく使用する部分はターゲット・マ
シンの特徴を生かしたアセンブリ言語で作成します.ター
ゲット・マシンはNECのV850およびルネサステクノロ
ジのSH-2とし,それぞれ本誌2006年 6月号と2007年 5月
号の付属基板で動作させるものとします.
1.浮動小数点演算の実際
今回作成した浮動小数点演算プログラムのデータ構造は
図1の通りです.
146 Mar. 2008
佐海 慎三�
組み込み機器であっても制御用途などでは浮動小数点演算が必要になる場合が多い.しかし,多くの組み込み向けCPUには浮動小数点演算命令がなく,ソフトウェアで実装する必要がある.ここでは,実際に浮動小数点演算プログラムを実装し,その中身について解説する.ここで解説するソース・ファイルは本誌のWebサイト(http:www.cqpub.co.jp/interface/)からダウンロードできる. (編集部)�
本誌2006年6月号/2007年5月号付属マイコン基板で動作する�
浮動小数点演算プログラムの作成�浮動小数点演算プログラムの作成�
SH-2/V850マイコン基板向け�浮動小数演算プログラムの作成�
関連データ�
KEYWORD――浮動小数点演算,Float,Double,V850,SH-2
図1 浮動小数点演算プログラムのデータ構造
31 30 - - - 24 23 22 - - - 16 15 - - - - 8 7 - - - - 0 (Intel系,V850) ( 7 6 - - - 0 15 14 - - - 8 23 - - - - 16 31 - - - - 24) (Motorola系,SH-2)
Float
Double
31(7):仮数部符号(0:+1:-)�30~23(6~0,15):指数部(0~0xff バイアス:0x7f)�22~ 0(14~8,16~31):仮数部〔23(15)ビットは常に1〕�
(a)Floatの場合�
63 62 - 56 55 - 52 51 - 48 47 - - 40 39 - - 32 31 - - 24 23 - - 16 15 - - 8 7 - - 0 ( Intel系 )( 7 6 - 0 15 - 12 11 - 8 23 - - 16 31 - - 24 39 - - 32 47 - - 40 55 - - 48 63 - - 56 ) (Motorola系)
63(7):仮数部符号(0:+1:-)�62~52(6~0,15~12):指数部(0~0x7ff バイアス:0x3ff)�51~ 0(11~8,16~63):仮数部〔52(12)ビットは常に1〕�
(b)Doubleの場合�
4+7
0
0 1 0 0 0 0 0 0
0+6
9
1 0 0 1
4 0
0 1 0 0 0 0 0 0
0 0
0 0 0 0 0 0 0 0
0 0
0 0 0 0 0 0 0 0
1 9
0 0 0 1 1 0 0 1
0 4
0 0 0 0 0 1 0 0
0 0
0 0 0 0 0 0 0 0
0 1
0 0 0 0 0 0 0 1
9 2
1 0 0 1 0 0 1 0
2+5
1
0 0 1 0 0 0 0 1
2 1
0 0 1 0 0 0 0 1
1 F
0 0 0 1 1 1 1 1
0 0 0 0
図3 Doubleの場合の演算方法
以降の説明は,Intel 系やV850 の構成に従って行いま
す.Motorola 系や SH-2 については,ロー・バイトとハ
イ・バイトを逆にして読んでください.
演算の実行は,指数部と仮数部を分離して行います.
Floatの場合を図2に示します.23ビット右にシフトし
て指数部を分離します.仮数部は0x7fffff とANDをとり,
0x800000とORをとって分離します.さらに仮数部は演算
時にけた落ちが起きないように5ビット左にシフトします.
演算時はこの仮数を用います.
Double の場合を図3に示します.指数部は上位2バイ
トをとり,4ビット右へシフトしてから分離します.仮数
部は 0xfffffffffffff と ANDをとり,0x10000000000000 と
ORをとって分離します.さらに仮数部は演算時にけた落
ちが生じないように4ビット左にシフトします.演算時は
この仮数を用います.
2.ライブラリ一覧
機能別のライブラリを表1~表5(稿末)に示します.パ
ソコン(PC)によるシミュレーションを可能とするために,
すべてのプログラムをC言語のみで実行可能にしました.
V850とSH-2では効率が悪いので,演算の主要部はそれぞ
れの機械語で作成したプログラムを使用します.対応は一
覧表で確認できます.
浮動小数点数の型式は4または8バイトの文字列として
扱います.フォーマットはパソコンなどで使用される浮動
小数点数のタイプのフォーマットと同じです.
ここで若干説明します.浮動小数点数を文字列に変換す
る d_toaと f_toaで nを指定しますが,nは表示けた数で
す.n>0なら固定小数点による表示,n<0なら浮動小数点
による表示になります.データ移動 d_movと f_movでは,
*xに *yを移動します(*yは変化しない).
演算は *x=*x+*y,*x=*x-*y,*x=*x× *y,*x=*x÷
*yです(*yは変化しない).
円周率 d_pai,f_paiは nの指定により次のようになり
ます.
n=0:π,n=1: 2π,n=2:π÷ 2,n=3: 1.5π,
n=4:π÷4,n=5: 180÷π
指数・仮数分離 d_norm,f_normでは,指数部を分離
して戻り値とします.また xは仮数のみとし,演算用に左
シフトします.指数・仮数結合 d_anorm,f_anormでは
演算結果の仮数と指数を結合して浮動小数点数型式にして
147Mar. 2008
浮動小数点演算プログラムの作成�浮動小数点演算プログラムの作成�
図2Floatの場合の演算方法
0 0 0
1 E
0 0 0
8 0
0 0
D C C D
0 0 0 0 0 0
0 0
0 0
8 5 F 6 E 6 6 C
4+3
2 F+2
6 E+1
6 6+0
123.45
指数部と仮数部の分離�
5ビット左にシフト�
C
1 0 0 0 0 1 0 10
0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 0 0
0 1 1 0 1 1 0 01 1 1 0 0 1 1 01 1 1 0 1 1 0
1 1 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 0 0
1
1
3.1416
指数部と仮数部の分離�
4ビット右にシフト�
4ビット左にシフト�
F+4
F
1 1 1 1 1 1 1 1
2+3
E
0 0 1 0 1 1 1 0
4+2
8
0 1 0 0 1 0 0 0
E+1
8
1 1 1 0 1 0 0 0
A+0
7
1 0 1 0 0 1 1 1
F F
1 1 1 1 1 1 1 1
2 E
0 0 1 0 1 1 1 0
4 8
0 1 0 0 1 0 0 0
E 8
1 1 1 0 1 0 0 0
A 7
1 0 1 0 0 1 1 1
F 2
1 1 1 1 0 0 1 0
E 4
1 1 1 0 0 1 0 0
8 E
1 0 0 0 1 1 1 0
8 A
1 0 0 0 1 0 1 0
7 0
0 1 1 1 0 0 0 0