C言語の浮動小数点型とは?floatとdoubleの違い・誤差・使い分けをわかりやすく解説

C言語では、小数を扱うために浮動小数点型が用意されています。
代表的なのは floatdouble です。

一見すると、整数型と同じように「数値を入れる型」に見えますが、浮動小数点型には整数型と大きく違う点があります。
それは、小数を常に正確に表せるとは限らないことです。

この記事では、float と double の違い、なぜ誤差が生まれるのか、実務でどう使い分けるのかを順番に解説します。


目次

浮動小数点型とは

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

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

C言語でよく使う浮動小数点型は、主に次の2つです。

特徴
floatサイズが小さい、精度は低め
doubleサイズが大きい、精度が高い

初心者さん

整数型の int みたいに、小数用の型ってことですか?

エンジニアくん

そう。ただし整数型と違って、浮動小数点型は“近い値で表すことがある”のがポイントなんだ


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


C言語文法解説シリーズ

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

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

float と double の違い

まずは違いを整理します。

サイズ(目安)精度の目安
float4バイト約7桁
double8バイト約15桁

double の方が、より細かい値まで表現できます。
そのため、精度が重要な計算では double が使われることが多くなります。

一方で、float はメモリ使用量が少なく、環境によっては処理負荷を抑えられることがあります。


初心者さん

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

エンジニアくん

一般的にはそういう場面も多いけど、組み込みでは float を選ぶ理由もちゃんとあるよ


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

ここが、浮動小数点型で一番重要なポイントです。

整数型では、たとえば 10 や 100 はそのまま正確に表せます。
しかし浮動小数点型では、小数を 2進数で表現 しているため、10進数の小数がぴったり表せないことがあります。

例えば、10進数の 0.1 は、2進数では有限桁で表せません。
そのため、コンピュータの中では 0.1 に最も近い値で保存されます。


初心者さん

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

エンジニアくん

一見た目は 0.1 でも、中では“0.1に近い値”になっていることがあるんだ


この仕組みのため、浮動小数点型では誤差が発生します。


誤差の例

例えば、次のようなコードです。

C
#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.10.2 がどちらも完全には表せず、近似値として計算されるためです。


初心者さん

なんか怖いですね…

エンジニアくん

だから浮動小数点型は“誤差がある前提”で使うことが大事なんだよ


浮動小数点型はどうやって値を表しているのか

浮動小数点型は、ざっくり言うと次のような考え方で値を表します。

  • 符号
  • 仮数
  • 指数

これは、10進数の「1.23 × 10²」のような表現を、2進数で行っているイメージです。

そのため、非常に大きな数や非常に小さな数を扱える一方で、
すべての小数を正確に表せるわけではありません。


初心者さん

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

エンジニアくん

そう。だから“正確さより範囲を優先した表現”とも言えるね


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 として保持する、といった方法です。


初心者さん

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

エンジニアくん

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


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

まとめ

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

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

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

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

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

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

この記事を書いた人

コメント

コメントする


目次