floatについて

普通に使って良いです。


#include <float.h>
#include <math.h>

void main(void){
	float a;

	a=sqrtf(2);
}


> sdcc -mz80 --code-loc 0x100 --data-loc 0x100 --no-std-crt0 source.c



sdccの関数は通常のCライブラリ関数に対してfloatのfを追加した関数名となる。
通常のCで、sqrt()は、sqrtf()となる。同様にsin()はsinf()である。
floatの変数をprintf()で表示しないのであればこの方法で良い。

この時にリンクされるmath.hやfloat.h関連関数はz80.libで、コンパイラが特別にリンカ指定
しない際にデフォルトでリンクされるz80.libライブラリを参照する。

z80.libに含まれるprintf()はputchar()を用いており、putchar()はコンパイラデフォルトで
RST08hを呼ぶ。DOS用のCONOUT処理を行なわないので、printf()やputs()は独自のライブラリを
使う必要があるだろう。

printf()はデフォルトではfloatに対応していないので"%f"の書式は<NO FLOAT>と表示される。
しかしprintf()ソースには"%f"書式らしきコードが書かれているのでライブラリのprint_large.c
ソースビルドの際にマクロなどオプションを指定するとfloat対応printf()が出来るかもしれない。

sdccではfloat型をサポートするがdouble型はサポートしない。
floatは4byteのIEEE754形式で実数を表現する。


  • ソースコードのビルドの際の注意

floatやmathライブラリをソースから再ビルドする際に注意することは、BOOL型とMakefileが無いこと。
BOOLについては適切に定義されていないので、sdccのincludeにあるstdbool.hを以下のようにし
Define BOOLの行を_Boolからcharに要修正。
これでコンパイルは通る。

stdbool.h
#else
 /* The ports that have bool */
 //#define bool _Bool
 #define BOOL char
 #define __bool_true_false_are_defined 1
#endif


Makefileはないのでビルドの際は適当にバッチファイルを使えば良い。
ソースはC言語で書かれているものと、Z80用のアセンブラで書かれているものがある。

float関連のライブラリはアセンブラで書かれたlong型の掛け算やシフト処理
ライブラリを参照しているので
ライブラリのビルドの際は両方とも必須。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2012年03月31日 21:34
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。