13 November 2007

浮動小数点定数

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を足しあわせて、秒で返せるようになっています。