📦 変数・型・演算子
🎯 doubleを既定として使い分け、小数に必ず誤差があることと比較の作法を理解する
平均点、身長、円周率。世の中の数値の多くは整数では表せません。小数を扱う型がdoubleです。
まずは double を使う
#include <stdio.h>
int main(void) {
double shinchou = 1.725; // メートル
double taijuu = 61.25; // キログラム
double bmi = taijuu / (shinchou * shinchou);
printf("BMIは %.1f です\n", bmi);
return 0;
}コードに小数を書くと、その値は既定で double として扱われます。表示は %f(既定で小数点以下6桁)、%.1f のように桁数を指定できます。
float と double の違い
・float … 4バイト。有効桁はおよそ7桁。1.5f のように末尾に f を付ける。
・double … 8バイト。有効桁はおよそ15〜16桁。迷ったらこちら。
double は「倍精度」という意味です。メモリが厳しい組込みや、膨大な数値を並べる場面を除けば、double が標準の選択になります。
動く例——誤差を目で見る
#include <stdio.h>
int main(void) {
double a = 0.1 + 0.2;
printf("%.1f\n", a);
printf("%.17f\n", a);
printf("%d\n", a == 0.3);
return 0;
}出力は 0.3、0.30000000000000004、0 です。0.1 も 0.2 も、2進数では割り切れない循環小数になります。10進数で 1/3 が 0.333… と書き切れないのと同じ理由で、ごく小さな誤差が必ず残ります。バグではなく、仕組み上そうなります。
だから小数は == で比べない
#include <stdio.h>
#include <math.h>
int main(void) {
double a = 0.1 + 0.2;
if (fabs(a - 0.3) < 1e-9) {
printf("ほぼ等しい\n");
}
return 0;
}「差の絶対値が十分小さければ等しいとみなす」——これが小数の比較の定石です。fabs は math.h の絶対値関数、1e-9 は 0.000000001 という書き方です。
罠・注意
printf は %f、scanf は %lf。 double を読むときだけ l が付きます。非対称なので間違えやすいところです。
お金の計算に double は向かない。 誤差が積み上がると1円ずれます。金額は最小単位(銭・円)の整数で持つのが定石です。
表示は丸められている。 %.1f で 0.3 と見えても、中身は 0.30000000000000004 のまま。見た目と中身を混同しないことです。
まとめ
小数は double を既定に。float は精度がおよそ半分で、末尾に f が要ります。2進数で表せない値には必ず誤差が乗るため、== ではなく差の大きさで比較します。printf は %f、scanf は %lf。
小数を含む数値を扱うための型のこと。floatより広い範囲と高い精度を持ち、実数計算における標準的な選択肢として使われる。小数点以下の桁数が多い計算でも、比較的高い精度を保てるのが特徴。
printfやscanfで使う%dや%fのような記号のこと。続けて渡す値をどんな型・どんな見た目として扱うかを指定する役割を持つ。指定する型と実際に渡す値の型がずれると、思わぬ表示結果になることがある。
キーボードからの入力を読み取り、変数に格納する標準ライブラリの関数のこと。変数の前に&を付け忘れるミスが定番の罠として知られる。戻り値として、正しく読み取れた個数が返ってくる点も覚えておくとよい。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。