【C言語】float型の仕様と使い方についてわかりやすく詳しく解説

目次から探す

float型の注意点

float型の精度の制約

float型は、浮動小数点数を表現するためのデータ型ですが、その精度には制約があります。

float型は32ビットのメモリを使用し、符号ビット、指数部、仮数部の3つの部分から構成されています。

しかし、この32ビットのメモリでは、実数の精度を完全に表現することはできません。

例えば、以下のコードを見てみましょう。


#include <stdio.h>
int main() {
    float num = 0.1;
    printf("%.10f\n", num);
    return 0;
}

このコードを実行すると、出力結果は 0.1000000015 となります。

しかし、私たちが期待する値は 0.1 です。

これは、float型の精度の制約によるものです。

float型は、小数点以下の桁数に制約があり、完全な精度を表現することができません。

float型の丸め誤差による問題

float型は、浮動小数点数を近似的に表現するため、丸め誤差が発生することがあります。

これは、計算結果が予想と異なる場合があることを意味します。

例えば、以下のコードを見てみましょう。


#include <stdio.h>
int main() {
    float num1 = 0.1;
    float num2 = 0.2;
    float sum = num1 + num2;
    printf("%.10f\n", sum);
    return 0;
}

このコードを実行すると、出力結果は 0.3000000119 となります。

しかし、私たちが期待する値は 0.3 です。

これは、float型の丸め誤差によるものです。

浮動小数点数の計算では、数値の近似が行われるため、完全な精度を保証することはできません。

float型の値の比較における注意点

float型の値を比較する際には、注意が必要です。

浮動小数点数の比較は、単純な等号や不等号の比較ではなく、誤差を考慮した比較が必要です。

例えば、以下のコードを見てみましょう。


#include <stdio.h>
int main() {
    float num1 = 0.1;
    float num2 = 0.2;
    float sum = num1 + num2;
    
    if (sum == 0.3) {
        printf("sum is equal to 0.3\n");
    } else {
        printf("sum is not equal to 0.3\n");
    }
    
    return 0;
}

このコードを実行すると、出力結果は sum is not equal to 0.3 となります。

これは、float型の値の比較における注意点です。

浮動小数点数の比較では、誤差を考慮した比較を行う必要があります。

例えば、以下のように誤差の範囲を指定して比較することが一般的です。


#include <stdio.h>
#include <math.h>
int main() {
    float num1 = 0.1;
    float num2 = 0.2;
    float sum = num1 + num2;
    
    if (fabs(sum - 0.3) < 0.0001) {
        printf("sum is approximately equal to 0.3\n");
    } else {
        printf("sum is not equal to 0.3\n");
    }
    
    return 0;
}

このコードを実行すると、出力結果は sum is approximately equal to 0.3 となります。

誤差の範囲を指定して比較することで、より正確な比較が行えます。

以上が、float型の注意点についての説明です。

float型の精度の制約や丸め誤差による問題、値の比較における注意点を理解し、適切に扱うことが重要です。

1 2 3

この記事のページ一覧
  1. 現在のページ
目次から探す