首藤です。

ごとけんさん wrote:

> >|# これらの関数は float と double で違います(FreeBSD)
> >
> >え? floatを受ける floor があるんですか?
>
> floorf() とか ceilf() とかあるんですよ、これが。もちろん一般
> 的ではないですけどね。ちなみに sinf() とか remainderf() とか 
> copysignf() とかもあります。

glibc 2.1.2 では、対象の型が違う floor のような関数がこれだけあります。
  float  floorf(float x)
  double  floor(double x)
  long double  floorl(long double x)

ただ、僕の手もとでは floor(3) 以外のマニュアルがありません。
(man-pages-1.23-3.rpm)


glibc 2.1.2 のヘッダのどこに floorf, floorl があるのか探しました。
…見つかりません…と思ったら、
/usr/include/tgmath.h

  ISO C 9X Standard: 7.9 Type-generic math        <tgmath.h>

というヘッダに、suffix `f', `l' 付きの関数を使う巧妙な記述がありました。

ソースコード中には単に floor(...) と書いておくと、
C プリプロセッサが、引数の型に応じて呼び出す関数を変えてくれます。
例えば、変数 val が float 型の場合、
floor(val) は実際は floorf(val) に展開されます。

tgmath.h には #include <math.h> とも書かれているので、
次のような使い方が想定されているのではないかと想像しています。

  * C9X の type-generic math な書き方をしたい場合は
    #include <tgmath.h> とする。
  * 従来 (現在の ISO C, ANSI C) の書き方、
    つまり floorf() など型に応じた関数を直接書きたい場合は
    #include <math.h> とする


で… floorf(), floorl() は C9X の範疇なんでしょうか?
ISO C, ANSI C の範疇ではないと思うんですが...


さて、3ヵ月半ぶりの散髪にゴー!

SHUDO Kazuyuki/首藤一幸   私をたばねないで あらせいとうの花のように
  shudoh / muraoka.info.waseda.ac.jp