浮動小数点演算浮動小数点演算プログラムの作成 プ...

2
一般に技術計算などでは非常に大きな数や小さな数を扱 います.整数演算ではけた落ちを起こします.そのため浮 動小数点数の演算(以下,浮動小数点演算)が必要になり ます. 最近のパソコン向け 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月号付属マイコン基板で動作する� 浮動小数点演算プログラムの作成� 浮動小数点演算プログラムの作成� 関連データ� KEYWORD ――浮動小数点演算,Float,Double,V850,SH-2 図1 浮動小数点演算プログラムのデータ構造 Intel ,V Motorola ,SH Float Double ): :) ): xff バイアス: x f) ): )ビット に〕 a)Floatの Intel Motorola ): :) ): x ff バイアス: x ff) ): )ビット に〕 b)Doubleの F 図3 Double の場合の演算方法

Upload: hadung

Post on 21-Apr-2018

222 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: 浮動小数点演算浮動小数点演算プログラムの作成 プ …»¥降の説明は,Intel系やV850の構成に従って行いま す.Motorola系やSH-2については,ロー・バイトとハ

一般に技術計算などでは非常に大きな数や小さな数を扱

います.整数演算ではけた落ちを起こします.そのため浮

動小数点数の演算(以下,浮動小数点演算)が必要になり

ます.

最近のパソコン向け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の場合の演算方法

Page 2: 浮動小数点演算浮動小数点演算プログラムの作成 プ …»¥降の説明は,Intel系やV850の構成に従って行いま す.Motorola系やSH-2については,ロー・バイトとハ

以降の説明は,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