C言語のfloatとdoubleの違いとは?精度・誤差・使い分けを解説

目次

はじめに

初心者さん

floatとdoubleって何が違うの?

初心者さん

とりあえずdouble使えばいいの?

C言語を触り始めると、必ず出てくる疑問です。

一見するとどちらも「小数を扱う型」ですが、
精度・内部構造・誤差の出方が大きく違います。

この記事では、

  • floatとdoubleの違い
  • なぜ誤差が発生するのか
  • 実務での正しい使い分け

を、組み込み目線も交えて解説します。


浮動小数点型とは

浮動小数点型は、小数を扱うための型です。

C
float f = 3.14f;
double d = 3.14;

C言語で主に使うのはこの2つです。

サイズ精度
float4バイト約7桁
double8バイト約15桁

初心者さん

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

エンジニアくん

そう思いがちだけど、実務ではそうでもないんだよ


型に関する基本的な内容はこちらの記事でも解説しています。


C言語文法解説シリーズ

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

C言語文法解説シリーズ一覧はこちら

floatとdoubleの違い

① 精度(最重要)

doubleの方が圧倒的に精度が高いです。

float  → 約7桁
double → 約15桁

👉 計算を繰り返すほど、この差が効いてくる


② メモリ使用量

float  → 4バイト
double → 8バイト

👉 配列で使うと差が大きい

C
float data[1000];   // 約4KB
double data[1000];  // 約8KB

③ 計算コスト(特に組み込み)

  • FPUあり → 差は小さい
  • FPUなし → doubleはかなり重い

👉 ここが組み込みでfloatを使う理由


なぜ浮動小数点で誤差が出るのか

ここが一番重要。

結論:

👉 10進数の小数は2進数で正確に表せないことがある


例:0.1は正確に表せない

10進数の0.1は、2進数にするとこうなる👇

0.00011001100110011...

👉 無限に続く

つまり:

  • コンピュータは途中で打ち切る
  • → 近い値で保存する

実際の例

C
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進数でやってる

👉 広い範囲を扱える代わりに、完全な精度は犠牲


誤差の種類(ここが実務ポイント)

① 丸め誤差

→ 表現できない値を近似する

② 桁落ち

→ 近い値の引き算で精度が失われる

C
double a = 12345678.9;
double b = 12345678.8;
printf("%f\n", a - b); // 精度落ちる

③ 累積誤差

→ 計算を繰り返すとズレが蓄積

👉 制御系で重要

float と double の使い分け

ここが実務で一番重要です。

精度を重視するなら double

計算結果の誤差をできるだけ小さくしたい場合は、double を使うのが基本です。

例えば、次のような場面です。

  • 複雑な計算を何度も繰り返す
  • 計算結果のずれを小さくしたい
  • PC上の一般的なアプリケーション

doublefloat よりも表現できる桁数が多いため、
計算を重ねたときの誤差の影響を抑えやすくなります。


メモリや処理負荷を重視するなら float

一方で、組み込み開発では float を選ぶことも少なくありません。

例えば、次のような場面です。

  • メモリを節約したい
  • センサ値などで必要な精度がそこまで高くない
  • ハードウェア的に float の方が扱いやすい
C
float temperature = 23.5f;

特に配列で大量のデータを持つ場合は、floatdouble のサイズ差が効いてきます。


初心者さん

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

エンジニアくん

そう。必要な精度とコストのバランスで選ぶのが正解


浮動小数点型を使うときの注意点

1. == で比較しない方がよい

浮動小数点型は誤差を含むため、単純な比較がうまくいかないことがあります。

C
double a = 0.1 + 0.2;
double b = 0.3;

if (a == b) {
  // 一致するとは限らない
}

このような比較は、見た目には同じ値でも不一致になることがあります。

そのため、実際には「差が十分小さいか」を見ることが多いです。

C
#include <math.h>

if (fabs(a - b) < 1e-9) {
  // ほぼ等しいとみなす
}

2. 金額計算には注意が必要

金額のように「1円単位で正確さが必要」な値では、浮動小数点型をそのまま使わない方がよい場合があります。

例えば、金額を円単位の整数で扱えば、誤差を避けやすくなります。

  • 100円 → 100
  • 1,980円 → 1980

このように、本当に誤差が困る場面では整数で扱うという考え方も重要です。


3. 計算を繰り返すと誤差が積み重なる

浮動小数点型は1回の計算で大きくずれなくても、
繰り返し計算すると少しずつ誤差がたまることがあります。

そのため、制御や計測などでは「どの程度の誤差まで許容できるか」を意識して使うことが大切です。


組み込み開発での考え方

組み込み開発では、浮動小数点型の使い方にさらに注意が必要です。

  • CPUによっては浮動小数点演算が重い
  • メモリ使用量に差が出る
  • 必要以上の精度は不要なことも多い

そのため、単に「double の方が高性能」と考えるのではなく、
必要な精度に対して float で十分かを考えることが重要です。

また、場合によっては浮動小数点型を使わず、
整数でスケーリングして扱うこともあります。

例えば、23.45℃ を 2345 として保持する、といった方法です。

C
double temp_double = 23.45;
int temp_int = 2345;

初心者さん

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

エンジニアくん

誤差や性能を気にする場面では、そういう設計も普通にあるよ


整数型についてはこちらの記事で解説しています。

まとめ

  • 浮動小数点型は、小数を扱うための型
  • 主な型は floatdouble
  • double の方が高精度、float の方が軽い
  • 小数は正確に表せないことがあり、誤差が発生する
  • == 比較は注意が必要
  • 組み込みでは、精度・メモリ・性能のバランスで選ぶことが大切

この記事が参考になった方へ

型を含むC言語の基本文法をこちらの記事で整理しています。

エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。

副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


目次