はじめに
初心者さんfloatとdoubleって何が違うの?



とりあえずdouble使えばいいの?
C言語を触り始めると、必ず出てくる疑問です。
一見するとどちらも「小数を扱う型」ですが、
精度・内部構造・誤差の出方が大きく違います。
この記事では、
- floatとdoubleの違い
- なぜ誤差が発生するのか
- 実務での正しい使い分け
を、組み込み目線も交えて解説します。
浮動小数点型とは
浮動小数点型は、小数を扱うための型です。
float f = 3.14f;
double d = 3.14;C言語で主に使うのはこの2つです。
| 型 | サイズ | 精度 |
|---|---|---|
| float | 4バイト | 約7桁 |
| double | 8バイト | 約15桁 |



じゃあdoubleの方が上位互換ですか?



そう思いがちだけど、実務ではそうでもないんだよ
型に関する基本的な内容はこちらの記事でも解説しています。


C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


floatとdoubleの違い
① 精度(最重要)
doubleの方が圧倒的に精度が高いです。
float → 約7桁
double → 約15桁
👉 計算を繰り返すほど、この差が効いてくる
② メモリ使用量
float → 4バイト
double → 8バイト
👉 配列で使うと差が大きい
float data[1000]; // 約4KB
double data[1000]; // 約8KB③ 計算コスト(特に組み込み)
- FPUあり → 差は小さい
- FPUなし → doubleはかなり重い
👉 ここが組み込みでfloatを使う理由
なぜ浮動小数点で誤差が出るのか
ここが一番重要。
結論:
👉 10進数の小数は2進数で正確に表せないことがある
例:0.1は正確に表せない
10進数の0.1は、2進数にするとこうなる👇
0.00011001100110011...
👉 無限に続く
つまり:
- コンピュータは途中で打ち切る
- → 近い値で保存する
実際の例
double a = 0.1;
double b = 0.2;
double c = a + b;
printf("%.17f\n", c);結果:
0.30000000000000004



え、0.3じゃないの…?



中では“近い値”で計算されてるんだ
浮動小数点の内部構造
浮動小数点はこう表現されます👇
符号 × 仮数 × 2^指数
例:
1.23 × 10^2 みたいなものを2進数でやってる
👉 広い範囲を扱える代わりに、完全な精度は犠牲
誤差の種類(ここが実務ポイント)
① 丸め誤差
→ 表現できない値を近似する
② 桁落ち
→ 近い値の引き算で精度が失われる
double a = 12345678.9;
double b = 12345678.8;
printf("%f\n", a - b); // 精度落ちる③ 累積誤差
→ 計算を繰り返すとズレが蓄積
👉 制御系で重要
float と double の使い分け
ここが実務で一番重要です。
精度を重視するなら double
計算結果の誤差をできるだけ小さくしたい場合は、double を使うのが基本です。
例えば、次のような場面です。
- 複雑な計算を何度も繰り返す
- 計算結果のずれを小さくしたい
- PC上の一般的なアプリケーション
double は float よりも表現できる桁数が多いため、
計算を重ねたときの誤差の影響を抑えやすくなります。
メモリや処理負荷を重視するなら float
一方で、組み込み開発では float を選ぶことも少なくありません。
例えば、次のような場面です。
- メモリを節約したい
- センサ値などで必要な精度がそこまで高くない
- ハードウェア的に float の方が扱いやすい
float temperature = 23.5f;特に配列で大量のデータを持つ場合は、float と double のサイズ差が効いてきます。



じゃあ「doubleが上位互換」ってわけではないんですね



そう。必要な精度とコストのバランスで選ぶのが正解
浮動小数点型を使うときの注意点
1. == で比較しない方がよい
浮動小数点型は誤差を含むため、単純な比較がうまくいかないことがあります。
double a = 0.1 + 0.2;
double b = 0.3;
if (a == b) {
// 一致するとは限らない
}このような比較は、見た目には同じ値でも不一致になることがあります。
そのため、実際には「差が十分小さいか」を見ることが多いです。
#include <math.h>
if (fabs(a - b) < 1e-9) {
// ほぼ等しいとみなす
}2. 金額計算には注意が必要
金額のように「1円単位で正確さが必要」な値では、浮動小数点型をそのまま使わない方がよい場合があります。
例えば、金額を円単位の整数で扱えば、誤差を避けやすくなります。
- 100円 → 100
- 1,980円 → 1980
このように、本当に誤差が困る場面では整数で扱うという考え方も重要です。
3. 計算を繰り返すと誤差が積み重なる
浮動小数点型は1回の計算で大きくずれなくても、
繰り返し計算すると少しずつ誤差がたまることがあります。
そのため、制御や計測などでは「どの程度の誤差まで許容できるか」を意識して使うことが大切です。
組み込み開発での考え方
組み込み開発では、浮動小数点型の使い方にさらに注意が必要です。
- CPUによっては浮動小数点演算が重い
- メモリ使用量に差が出る
- 必要以上の精度は不要なことも多い
そのため、単に「double の方が高性能」と考えるのではなく、
必要な精度に対して float で十分かを考えることが重要です。
また、場合によっては浮動小数点型を使わず、
整数でスケーリングして扱うこともあります。
例えば、23.45℃ を 2345 として保持する、といった方法です。
double temp_double = 23.45;
int temp_int = 2345;


小数なのに整数で持つこともあるんですね



誤差や性能を気にする場面では、そういう設計も普通にあるよ
整数型についてはこちらの記事で解説しています。


まとめ
- 浮動小数点型は、小数を扱うための型
- 主な型は
floatとdouble doubleの方が高精度、floatの方が軽い- 小数は正確に表せないことがあり、誤差が発生する
==比較は注意が必要- 組み込みでは、精度・メモリ・性能のバランスで選ぶことが大切
この記事が参考になった方へ
型を含むC言語の基本文法をこちらの記事で整理しています。


エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。
副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。

コメント