浮動小数点定数
cにおいて、浮動小数点定数の書き方には、小数点形式と指数形式がある。
- 小数点形式
- ふつうにピリオドを使って表す。
e.g., 12.345, 20.0 .3
- 指数形式
- eまたはEを使って、10のn乗を表す。
e.g., 12.345e2(=1234.5), 1e-6(=0.0000001, 1マイクロ)
またサフィックス(接尾辞)Fまたはfがあるとfloat型、Lまたはlがあるとlong double型、サフィックスがないときはdouble型になる。
e.g., 12.34f, 56.78e1L
実行時間の測定
getrusageという関数を使って、プログラムの実行時間を測りました。こちらの記事を参考にさせていただきました(C言語: 実行時間測定の方法)。getrusageは資源(resource)の使用量(usage)を返す関数。なので時間以外にもいろんな情報が得られます。SVr4, BSD 4.3に準拠しています。
manより、書式
#include#include int getrusage(int who, struct rusage *usage);
whoはRUSAGE_SELFかRUSAGE_CHILDREN。前者は呼び出したプロセス、後者は子プロセスのリソース使用量を返す。rusageは、
struct rusage { struct timeval ru_utime; /* 使用されたユーザー時間 / struct timeval ru_stime; / 使用されたシステム時間 / long ru_maxrss; / RAM 上に存在する仮想ページのサイズ (resident set size) の最大値 / long ru_ixrss; / 共有メモリの合計サイズ / long ru_idrss; / 非共有データの合計サイズ / long ru_isrss; / 非共有スタックの合計サイズ / long ru_minflt; / 利用されたページ / long ru_majflt; / ページフォールト / long ru_nswap; / スワップ / long ru_inblock; / ブロック入力操作 / long ru_oublock; / ブロック出力操作 / long ru_msgsnd; / 送信されたメッセージ / long ru_msgrcv; / 受信されたメッセージ / long ru_nsignals; / 受信されたシグナル / long ru_nvcsw; / 意図したコンテキスト切り替え / long ru_nivcsw; / 意図しないコンテキスト切り替え */ };
構造体timevalは、こんなん。秒とマイクロ秒の二つのメンバを持っています。
struct timeval { time_t tv_sec; /* 秒 / suseconds_t tv_usec; / マイクロ秒 */ }
というわけで、
#include#include #include …
double getrusageSec(){ struct rusage t; struct timeval s; getrusage(RUSAGE_SELF, &t); s = t.ru_utime; return s.tv_sec + (double)s.tv_usec*1e-6; }
…
int main(void){
double t1, t2;
…
t1 = getrusageSec();
処理
t2 = getrusageSec();
printf(“%f\n”, t2 - t1);
}
例えばこういう風にすれば、ある処理の時間を測定できます。getrusageSec内ではgetrusageでリソース使用量を取得し、そこから時間を取得、その後tv_usecを足しあわせて、秒で返せるようになっています。