普通に使って良いです。
#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型の掛け算やシフト処理
ライブラリを参照しているので
ライブラリのビルドの際は両方とも必須。
最終更新:2012年03月31日 21:34