C のヘッダファイルなんてのは…

拘束具なわけですよ。でリミッタ外すと暴走しやすくなっちゃうという。例えばこの挙動説明できますかーという話。

#include <stdio.h>
int main() {
    printf("%f\n", sinf(10));
}

こんな普通のコード。

i@um ~/test> gcc fsin.c
fsin.c: In function 'main':
fsin.c:3: warning: incompatible implicit declaration of built-in function 'sinf'
i@um ~/test> ./a.out
-0.544021
i@um ~/test> gcc fsin.c -fno-builtin
i@um ~/test> ./a.out
0.000000

Linux でもやってみる。

i@u ~/test> gcc fsin.c -lm
fsin.c: In function 'main':
fsin.c:3: warning: incompatible implicit declaration of built-in function 'sinf'
i@u ~/test> ./a.out
-0.544021
i@u ~/test> gcc fsin.c -lm -fno-builtin
i@u ~/test> ./a.out
-0.226913
i@u ~/test> ./a.out
-1.687096
i@u ~/test> ./a.out
-0.012923
i@u ~/test> ./a.out
-0.699833
i@u ~/test> ./a.out
-0.014358

Linux では毎度動作が変わるぞ! これはステキだ! fsin ってのは疑似乱数作る関数だったんだね。

追記: ざんねん! この疑似乱数は CPU に依存しちゃうんだ!

i@uk:~$ uname -a
Linux uk 2.4.17_kuro-box #2 2004年 3月 18日 木曜日 11:39:47 JST ppc GNU/Linux
i@uk:~$ gcc fsin.c -lm
i@uk:~$ ./a.out
-0.544021
i@uk:~$ gcc fsin.c -lm -fno-builtin
i@uk:~$ ./a.out
0.000000

http://alohakun.blog7.fc2.com/blog-entry-685.html#comment

というわけで別に実装だの仕様だの見るまでもなく動作サンプル見たら別に本来のシグネチャなんて調べてないのは明白な気がするのですがーという。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h