二つの和を求めるプログラムがある.
#include<iostream> using namespace std; int main(int argc, char *argv[]){ double d = 1e300; double sum = 0; for(int i = 0; i < 10000000; i++){ sum+=d; } cout << sum << endl; }
#include<iostream> using namespace std; int main(int argc, char *argv[]){ double d = 1e308; double sum = 0; for(int i = 0; i < 10000000; i++){ sum+=d; } cout << sum << endl; }
上は 1e300 を 100000000 回足した和を求める.下は 1e308 を 100000000 回足した和を求める.これらのプログラムを実行した場合,普通は速度の違いなどないように思えるが... 実際に動かすと上が 0.148s で下が 0m3.692s と劇的に違う.これは double が 1.7e308 程度までしか値を保持できず,これ以上ではオーバーフローして Inf になってしまうことによる.で,Inf に値を足し続けるので遅くなると.何で Inf で遅くなるのかしらんけど.
- Newer: AWK - はじめ