Q. FreeBSD には long double 用の算術関数 sqrtl()、sinl() はないのですか。 A. ありません。しかし、FPU を持っている CPU の場合は、次のような方法が あります。 一部の算術関数は gcc に最適化フラグ -O -ffast-math -mfancy-math-387 を付ける事により、builtin function 扱いになり、アセンブラ上に FPU の 命令が直接生成され、使えるようになります。 ただし fmodl() など、使えない算術関数もあります。 どういう関数が使えるかは、gcc の i386.md ファイルを参照して下さい。 (/usr/src/contrib/gcc/config/i386/i386.md) FreeBSD では long double の算術関数のプロトタイプ宣言が math.h で 行なわれていないので、プログラム中で宣言が必要です。使う関数の プロトタイプ宣言を Cの参考書等を参考にして追加してください。 FreeBSD の long double は使用上の注意点があります。[管理番号 587] をご覧ください。 プログラム例 -------------------------------------------------------- #include <stdio.h> #include <math.h> #ifdef __FreeBSD__ /* [管理番号 587] を参考ください */ #include <ieeefp.h> #endif /* __FreeBSD__ */ #ifdef __FreeBSD__ /* プロトタイプ宣言 */ extern long double sinl(long double); extern long double sqrtl(long double); #endif /* __FreeBSD__ */ int main() { long double ld; double d; #ifdef __FreeBSD__ /* [管理番号 587] を参考ください */ fpsetprec(FP_PE); /* 仮数部の精度を 64bit にする。 */ #endif /* __FreeBSD__ */ ld = sinl(1.1); d = sin(1.1); printf("double = %.20f\n", d); printf("long double = %.20Lf\n", ld); printf("ld-d = %e\n", (double)(ld-d)); return 0; }
グループ名: FreeBSD-math