C言語/float

概要

float は C 言語における 単精度浮動小数点数 (single precision floating-point number) を表すデータ型です。IEEE 754 規格に基づく 32 ビット浮動小数点数 として実装されており、小数を扱う計算 に使用されます。

C 言語では doublelong double も浮動小数点型として利用できますが、float はそれらよりも 精度が低い代わりにメモリ使用量が少なく、処理が高速 である点が特徴です。

float 型の仕様

項目 値 (IEEE 754 32 ビット)
ビット数 32 ビット
符号ビット 1 ビット
指数部 8 ビット (バイアス 127)
仮数部 23 ビット
表現可能範囲 約 ±1.18 × 10⁻³⁸ ~ ±3.4 × 10³⁸
精度 (有効桁数) 約 6 ~ 7 桁
デフォルトのリテラル型 float x = 3.14f; (f を付ける)

C における float 型のサイズは sizeof(float) で確認できます。

#include <stdio.h>
int main() {
    printf("Size of float: %zu bytes\n", sizeof(float));
    return 0;
}

出力:

Size of float: 4 bytes

float 型のリテラル

C 言語では、浮動小数点リテラルはデフォルトで double 型として扱われます。float 型のリテラルを明示するには、末尾に f または F を付けます

float a = 3.14f;   // OK: float 型
double b = 3.14;   // デフォルトは double 型

指数表記 (e または E を使用) も可能です。

float x = 1.23e4f;  // 1.23 × 10⁴ = 12300.0
float y = 5.67E-2f; // 5.67 × 10⁻² = 0.0567

float の範囲と特殊値

浮動小数点数は 正の無限大 (+∞)、負の無限大 (-∞)、非数 (NaN) を扱うことができます。

特殊値 説明
+∞ オーバーフロー時に発生
-∞ 負のオーバーフロー時に発生
NaN 非数 (0 除算や未定義演算)

これらの値は math.hisfinite()isnan() などの関数で確認できます。

#include <stdio.h>
#include <math.h>
int main() {
    float x = 1.0f / 0.0f;  // 正の無限大
    float y = 0.0f / 0.0f;  // NaN

    printf("x = %f, isfinite(x): %d\n", x, isfinite(x));
    printf("y = %f, isnan(y): %d\n", y, isnan(y));

    return 0;
}

出力:

x = inf, isfinite(x): 0
y = nan, isnan(y): 1

float の演算

float加減乗除、剰余、累乗、三角関数 などの演算が可能ですが、浮動小数点誤差 (丸め誤差) に注意が必要です。

#include <stdio.h>
int main() {
    float a = 0.1f + 0.2f;
    printf("0.1 + 0.2 = %.10f\n", a); // 期待値: 0.3

    return 0;
}

出力:

0.1 + 0.2 = 0.3000000119

これは 浮動小数点誤差 によるもので、特に金融計算などでは doubledecimal 型を使うべきです。

float の比較と誤差対策

浮動小数点数を直接 == で比較すると誤差の影響で正しく判定できない場合があります。そのため、「許容誤差 (epsilon)」を考慮した比較 が推奨されます。

#include <stdio.h>
#include <math.h>
#define EPSILON 1e-6f  // 許容誤差
int main() {
    float a = 0.1f + 0.2f;
    float b = 0.3f;

    if (fabs(a - b) < EPSILON) {
        printf("a と b はほぼ等しい\n");
    } else {
        printf("a と b は異なる\n");
    }

    return 0;
}

出力:

a と b はほぼ等しい

float の使用例

1. float で三角関数を計算

#include <stdio.h>
#include <math.h>
int main() {
    float angle = 30.0f;
    float radians = angle * (M_PI / 180.0f);  // 度をラジアンに変換

    printf("sin(30°) = %f\n", sinf(radians));
    printf("cos(30°) = %f\n", cosf(radians));

    return 0;
}

出力:

sin(30°) = 0.500000
cos(30°) = 0.866025

2. float 配列の合計と平均

#include <stdio.h>
int main() {
    float numbers[] = {1.2f, 2.3f, 3.4f, 4.5f, 5.6f};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    float sum = 0.0f;
    for (int i = 0; i < size; i++) {
        sum += numbers[i];
    }

    float avg = sum / size;
    printf("合計: %f, 平均: %f\n", sum, avg);

    return 0;
}

出力:

合計: 17.000000, 平均: 3.400000

まとめ

  • float単精度浮動小数点数 (32 ビット) を表すデータ型。
  • double に比べて メモリ効率が良い が、精度は低い (有効桁数 6 ~ 7)。
  • float のリテラルは f を付ける (3.14f)。
  • 浮動小数点誤差が発生する ため、比較時には EPSILON を考慮する。
  • math.hsinf()cosf() などの float 専用関数を使うと効率が良い。

floatメモリ使用量を節約しつつ小数を扱いたい場面 で適していますが、精度が必要な場合は double の方が望ましいです。

カテゴリ:C言語
カテゴリ:C言語