FreeBSD QandA 588

FreeBSD QandA

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


間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。