C言語/float
概要
float
は C 言語における 単精度浮動小数点数 (single precision floating-point number) を表すデータ型です。IEEE 754 規格に基づく 32 ビット浮動小数点数 として実装されており、小数を扱う計算 に使用されます。
C 言語では double
や long 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.h
の isfinite()
、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
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.h
のsinf()
やcosf()
などのfloat
専用関数を使うと効率が良い。
float
は メモリ使用量を節約しつつ小数を扱いたい場面 で適していますが、精度が必要な場合は double
の方が望ましいです。