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