■float型対double型
●2003年初版のCプログラミング診断室で紹介されている
「float型はやめなさい」をgcc11版で試してみた。
●2022年現在でも「float型はやめなさい」だった。
処理時間でも精度でもdoubleの圧勝。
●なお浮動小数点は処理系依存の巣窟なのでご自分の環境で
試してみる事をおすすめする。
■実験用プログラム
#include <stdio.h>
#define MAX 10000000
#define EPSILON 0.01
void floatloop(int max) {
float r = 0.0;
for (int i = 0; i < max ; ++i)
r += EPSILON ;
printf("f=%.20f\n",r);
}
void doubleloop(int max) {
double r = 0.0;
for (int i = 0; i < max ; ++i)
r += EPSILON ;
printf("d=%.20f\n",r);
}
int main(int argc, char *argv[])
{
if (argc != 2)
return 1;
printf("EPSILON*MAX=\n %.20f\n",EPSILON*MAX);
switch (*argv[1]) {
case 'f': floatloop(MAX); break;
case 'd': doubleloop(MAX); break;
}
}
■実験用スクリプト
#!/bin/bash -x
gcc fvsd.c -O2
time ./a.out float
time ./a.out double
●実験結果
+ gcc fvsd.c -O2
+ ./a.out float
EPSILON*MAX=
100000.00000000000000000000
f=95680.94531250000000000000
real 0m0.044s
user 0m0.031s
sys 0m0.000s
+ ./a.out double
EPSILON*MAX=
100000.00000000000000000000
d=99999.99998630968912038952
real 0m0.025s
user 0m0.016s
sys 0m0.016s
処理速度 44s 対 25s
⇒double の勝ち
精度 95680.9略 対 99999.9略
⇒doubleの勝ち
■まとめ
特殊な事情が無い限り処理速度でも精度でも
double型を使うのが無難。
参考: