誤差と計算速度

Javaのココロの中に,誤差の話が出てきたので処理系によって差が出るのかなぁ
と思って,いろんな言語で実装してみた.


書いたのはこんなコード

#include <stdio.h>

int main(void){
  int i;
  double d = 0;

  for(i = 0; i < 100000000; i++) d += 0.01;

  printf("%lf\n", d);

  return 0;
}


これをC, Java, Perl, Rubyで実装.
どれくらい誤差が出るのか,また実行速度はどれくらいなのか比較してみた

# C
1000000.000779
0.797u 0.000s 0:00.79 100.0%    5+177k 0+0io 0pf+0w

# Java
1000000.0007792843
1.045u 0.333s 0:02.06 66.5%     82+1317k 41+4io 397pf+0w

# Perl
1000000.00077928
10.938u 0.000s 0:10.96 99.7%    1072+528k 1+0io 0pf+0w

# Ruby
1000000.00077928
46.000u 0.000s 0:46.08 99.8%    5+703k 0+0io 0pf+0w

# Python
1000000.00078
47.414u 0.007s 0:47.51 99.7%    884+1853k 0+0io 0pf+0w


Ruby遅っ!がんがんループを回す者としては,これは頂けません.Pythonも遅い.ループの書き方が悪いのかな?
おそらくPerlが速いのでしょう.Perlistとしては少し安心.
逆にPerlが速いのかな?あとでPythonPHPも試してみよう.
(2007-07-23 python追加済)

気になるのはJavaページフォルトの多さ.
実行速度の差はここに原因があるのではないかと思います.


誤差に違いがあるということはわかったのだけれど,その原因までは踏み込めず.
1億回もループを回すとこれだけ実行速度が変わってくるんだなぁ,としんみり.
1億といってもo(N^2)のアルゴリズムだったらN=10000, o(N^3)だったらN=461なので,この差は推して知るべしですな.