C言語 #11: 小数点以下の精度(Decimal Precision)

独習C

小数点以下の精度は、浮動小数点数の計算において重要な概念です。C言語では、浮動小数点数の精度を制御するためのいくつかの方法があります。ここでは、C言語の小数点以下の精度について詳しく説明します。

浮動小数点型の基本

C言語には3種類の浮動小数点型があります。それぞれが異なる精度と範囲を持っています。

基本的な浮動小数点型

  • float: 単精度浮動小数点型。約7桁の有効数字を表現できます。
  • double: 倍精度浮動小数点型。約15桁の有効数字を表現できます。
  • long double: 拡張倍精度浮動小数点型。さらに多くの有効数字を表現できます。
#include <stdio.h>

int main() {
    float a = 3.14f;
    double b = 3.141592653589793;
    long double c = 3.141592653589793238462643383279502884L;

    printf("float: %f\n", a);
    printf("double: %lf\n", b);
    printf("long double: %Lf\n", c);

    return 0;
}

精度の制御

浮動小数点数の精度を制御するために、printf関数のフォーマット指定子を使用することができます。printf関数では、%f%lf、および%Lfを使用して、それぞれfloatdouble、およびlong doubleの値を表示できます。

フォーマット指定子の使用

フォーマット指定子を使用して、小数点以下の桁数を指定できます。例えば、%.2fは小数点以下2桁を表示し、%.10fは小数点以下10桁を表示します。

#include <stdio.h>

int main() {
    double pi = 3.141592653589793;

    printf("小数点以下2桁: %.2f\n", pi);
    printf("小数点以下5桁: %.5f\n", pi);
    printf("小数点以下10桁: %.10f\n", pi);

    return 0;
}

浮動小数点数の誤差

浮動小数点数は、コンピュータ内部で2進数で表現されるため、特定の数値は正確に表現できない場合があります。このため、計算結果に誤差が生じることがあります。

丸め誤差

浮動小数点数の計算では、丸め誤差が発生することがあります。これは、無限に続く小数を有限の桁数に丸めるために生じる誤差です。

#include <stdio.h>

int main() {
    float a = 0.1f;
    float b = 0.2f;
    float c = a + b;

    printf("a: %.10f\n", a);
    printf("b: %.10f\n", b);
    printf("a + b: %.10f\n", c);

    if (c == 0.3f) {
        printf("cは0.3です\n");
    } else {
        printf("cは0.3ではありません\n");
    }

    return 0;
}

誤差を考慮した比較

浮動小数点数を比較する際には、誤差を考慮して比較することが重要です。通常、ある程度の許容誤差(イプシロン)を設定して比較します。

#include <stdio.h>
#include <math.h>

int main() {
    double a = 0.1;
    double b = 0.2;
    double c = a + b;
    double epsilon = 1e-9;

    printf("a: %.10f\n", a);
    printf("b: %.10f\n", b);
    printf("a + b: %.10f\n", c);

    if (fabs(c - 0.3) < epsilon) {
        printf("cは0.3に非常に近いです\n");
    } else {
        printf("cは0.3ではありません\n");
    }

    return 0;
}

総合例

以下に、ここまで学んだ知識を統合したプログラムを示します。このプログラムでは、浮動小数点数の基本、精度の制御、誤差の考慮を含む一連の操作を行います。

#include <stdio.h>
#include <math.h>

int main() {
    // 浮動小数点型の宣言
    float a = 3.14f;
    double b = 3.141592653589793;
    long double c = 3.141592653589793238462643383279502884L;

    // 浮動小数点数の出力
    printf("float: %f\n", a);
    printf("double: %lf\n", b);
    printf("long double: %Lf\n", c);

    // 精度の制御
    double pi = 3.141592653589793;
    printf("小数点以下2桁: %.2f\n", pi);
    printf("小数点以下5桁: %.5f\n", pi);
    printf("小数点以下10桁: %.10f\n", pi);

    // 浮動小数点数の誤差
    float x = 0.1f;
    float y = 0.2f;
    float z = x + y;
    printf("x: %.10f\n", x);
    printf("y: %.10f\n", y);
    printf("x + y: %.10f\n", z);
    if (z == 0.3f) {
        printf("zは0.3です\n");
    } else {
        printf("zは0.3ではありません\n");
    }

    // 誤差を考慮した比較
    double d = 0.1;
    double e = 0.2;
    double f = d + e;
    double epsilon = 1e-9;
    printf("d: %.10f\n", d);
    printf("e: %.10f\n", e);
    printf("d + e: %.10f\n", f);
    if (fabs(f - 0.3) < epsilon) {
        printf("fは0.3に非常に近いです\n");
    } else {
        printf("fは0.3ではありません\n");
    }

    return 0;
}

結論

浮動小数点数の精度と誤差は、数値計算において重要な要素です。C言語では、浮動小数点数の精度を制御し、誤差を考慮した比較を行うことで、正確な計算結果を得ることができます。これらの知識を活用して、より信頼性の高いプログラムを作成しましょう。

購読
通知
0 Comments
Inline Feedbacks
View all comments