C言語では、小数を扱うために浮動小数点型が用意されています。
代表的なのは float と double です。
一見すると、整数型と同じように「数値を入れる型」に見えますが、浮動小数点型には整数型と大きく違う点があります。
それは、小数を常に正確に表せるとは限らないことです。
この記事では、float と double の違い、なぜ誤差が生まれるのか、実務でどう使い分けるのかを順番に解説します。
浮動小数点型とは
浮動小数点型は、小数を扱うための型です。
float f = 3.14f;
double d = 3.14;C言語でよく使う浮動小数点型は、主に次の2つです。
| 型 | 特徴 |
|---|---|
| float | サイズが小さい、精度は低め |
| double | サイズが大きい、精度が高い |
初心者さん整数型の int みたいに、小数用の型ってことですか?



そう。ただし整数型と違って、浮動小数点型は“近い値で表すことがある”のがポイントなんだ
型に関する基本的な内容はこちらの記事でも解説しています。


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


float と double の違い
まずは違いを整理します。
| 型 | サイズ(目安) | 精度の目安 |
|---|---|---|
| float | 4バイト | 約7桁 |
| double | 8バイト | 約15桁 |
double の方が、より細かい値まで表現できます。
そのため、精度が重要な計算では double が使われることが多くなります。
一方で、float はメモリ使用量が少なく、環境によっては処理負荷を抑えられることがあります。



じゃあ、いつも double を使えばいいんですか?



一般的にはそういう場面も多いけど、組み込みでは float を選ぶ理由もちゃんとあるよ
なぜ浮動小数点型で誤差が出るのか
ここが、浮動小数点型で一番重要なポイントです。
整数型では、たとえば 10 や 100 はそのまま正確に表せます。
しかし浮動小数点型では、小数を 2進数で表現 しているため、10進数の小数がぴったり表せないことがあります。
例えば、10進数の 0.1 は、2進数では有限桁で表せません。
そのため、コンピュータの中では 0.1 に最も近い値で保存されます。



え、0.1 って 0.1 じゃないんですか?



一見た目は 0.1 でも、中では“0.1に近い値”になっていることがあるんだ
この仕組みのため、浮動小数点型では誤差が発生します。
誤差の例
例えば、次のようなコードです。
#include <stdio.h>
int main(void) {
double a = 0.1;
double b = 0.2;
double c = a + b; printf("%.17f\n", c);
return 0;
}この結果は、環境によっては次のように表示されます。
0.30000000000000004
本来は 0.3 になってほしいのに、少しずれています。
これは 0.1 と 0.2 がどちらも完全には表せず、近似値として計算されるためです。



なんか怖いですね…



だから浮動小数点型は“誤差がある前提”で使うことが大事なんだよ
浮動小数点型はどうやって値を表しているのか
浮動小数点型は、ざっくり言うと次のような考え方で値を表します。
- 符号
- 仮数
- 指数
これは、10進数の「1.23 × 10²」のような表現を、2進数で行っているイメージです。
そのため、非常に大きな数や非常に小さな数を扱える一方で、
すべての小数を正確に表せるわけではありません。



整数型みたいに、単純にそのまま入ってるわけじゃないんですね



そう。だから“正確さより範囲を優先した表現”とも言えるね
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 として保持する、といった方法です。



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



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


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


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









コメント