gcc
提供: MacWiki
2009年5月30日 (土) 18:07時点における219.97.56.232 (トーク)による版
MacOSX の DeveloperToolsにも付属している、フリーの高性能 C/C++/Objective-C/Fortran/... コンパイラ。
最適化オプション
PPC 機でコンパイル時に -fast というオプションをつけると、 バイナリファイルが G5 向けに最適化されます。
また、G4, G5 向けに最適化する場合は -fast -mcpu=7450 として下さい。 ただし、このオプションで作られたバイナリは、初期の G4プロセッサ(PowerPC 7410等)では動作しませんので注意して下さい。
- G3: -mcpu=750
- 初期の G4: -mcpu=7400
- 第二世代の G4: -mcpu=7450
- G5: -mcpu=G5
最適化オプションについての詳細は、mac gcc を参照して下さい。
4倍精度計算
Xcode1.5-gcc3.3.2 では4倍精度計算をしようとすると
warning: use of `long double' type; its size may change in a future release
と警告されていた。
- Tiger (10.4.5, gcc version 4.0.1 (Apple Computer, Inc. build 5247))では G5 で4倍精度計算が可能になった。
- G4, G3 でも可能です。
$ cat testQuadPrec.c #include <stdio.h> #include <math.h> int main() { double x; long double y; x = 1.0/3.0; y = 1.0l/3.0l; printf("x %2d %32.31f\n", sizeof(x),x); printf("y %2d %32.31Lf\n", sizeof(y),y); x = 0.33333333333333333333333333333333333333; y = 0.33333333333333333333333333333333333333L; printf("x %2d %32.31f\n", sizeof(x),x); printf("y %2d %32.31Lf\n", sizeof(y),y); printf("pi %32.31f\n", 4.0*atan(1.0)); printf("pi %32.31Lf\n", 4.0*atanl(1.0)); return 0; }
$ gcc -O3 testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333333333333333 x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333333333333333 pi 3.1415926535897931159979634685442 pi 3.1415926535897932384626433832795
- IEEE 規格によりますと有効精度が 80 bit -- 128 bit(?) であれば4倍精度浮動小数点数(?)と称しても良いようです。
- どうやら、本当は、拡張倍精度(extended double or long double precision, 80 bit以上) と4倍精度(quadruple precision, 128 bit)を区別して考える必要があるようです。
- そして、Intel Mac (IntelCore) においては、有効精度が 80 bit のlong double計算をCPUネイティブにサポートするようです。
- このCPUでサポートされている80 bit精度なlong doubleについて議論している資料を見つけました。これの p. 62 or later です: http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf ほかにもこれです:http://www.cs.berkeley.edu/~wkahan/ARITH_17.pdf
- しかし 128 bit の4倍精度を欲しい人はソフトウェア(コンパイラ?)で実現する必要があるようです。
- Intel Mac (10.4.5, gcc version 4.0.1 (Apple Computer, Inc. build 5250)) でのテスト結果。以下を見る限り、四則演算と代入で 16 byte 分の精度が確保されていないようです。
$ cc -O3 -march=i686 -mtune=pentium-m -m128bit-long-double testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 pi 3.1415926535897931159979634685442 pi 3.1415926535897932385128089594062
$ cc -O3 -march=i686 -mtune=pentium-m testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 pi 3.1415926535897931159979634685442 pi 3.1415926535897932385128089594062
$ cc -O3 -march=i686 -mtune=pentium-m -m96bit-long-double testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 12 0.3333333333333333333423683514374 x 8 0.3333333333333333148296162562474 y 12 0.3333333333333333333423683514374 pi 3.1415926535897931159979634685442 pi 3.1415926535897932385128089594062
変数のサイズ
各変数型のサイズを知るには、安直に:
#include <stdio.h> int main( int argc, char* argv[] ) { printf( "%d %d", sizeof(int), sizeof(double) ); return 0; }
gccのオプション
- 知っていると便利な gcc のオプション
http://mail.unixuser.org/~euske/doc/gccopts/index.html http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
例:c89準拠かつプロトタイプ必須としてコンパイル
$ gcc -O2 -ansi -pedantic -Wall -Wextra -Wno-missing-field-initializers -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations test.c
(上記では低レベルのミスを見逃さないように警告オプションをつけています.パーフェクトではありません.)