C# プログラミング講座 第7回 変数とデータ型(浮動小数点型)

前回は整数型について説明しました

今回は不動小数点型についての説明を行います

C#では小数点以下の数値を扱う場合、浮動小数点型と呼ばれる float型 または double型 を使用します

float型 と double型 の違いですが、double型の方が有効桁数が多く、精度が良いので通常はこちらを使用します

float型 はデータ量が少ないので画像処理など大量の計算を行う場合に使用されることがあります

では、前回作成したプログラムを少し変更してみます

class Program
{
    static void Main(string[] args)
    {
        double x = 0.1;
        double y = 0.1;
        double z = x + y;
 
        Console.WriteLine("z = {0}", z);
        Console.ReadKey();
    }
}

開始してプログラムを実行すると、正しく z = 0.2 と結果が表示されました

開始してプログラムを実行すると、正しく z = 0.2 と結果が表示されました

次の double型 を float型 に変更してみます

float x = 0.1;

すると 0.1 の部分に赤い波線でエラーメッセージが表示されました

リテラル とは 0.1 のようにプログラムの中に直接記述した値のことを指しています

つまり、0.1というリテラルは double型 なので float型 の変数に代入することができないということです

'F'サフィックスを使用して…とありますが、ようするに 0.1F と記述しろという意味です

0.1F に書き直すとエラーがなくなります

float x = 0.1F;

実行すると正しく結果が表示されました

浮動小数点とは簡単に説明すると 1.1011x2の12乗 というような形でデータを保持しています

その為、非常に大きな値から、非常に小さな値まで表現できますが、誤差が問題になることがあります

WriteLineの{0}の部分を{0:G17}に書き換えることで 変数z の中身をより詳細に出力させることができます

Console.WriteLine("z = {0:G17}", z);

これも浮動小数点の性質の一つです

結果このように最後の桁に1が表示されました

これは難しい話になるのですが、0.2が2進数では無理数(0.00110011...)であることが原因です

浮動小数点にはこのような小さな誤差が常に存在することを覚えておきましょう

つぎにプログラムを書き換えて、大きな数字に小さな数字を足してみます

x を 1000000000 y を 0.0000001 に書き換えてみます

double x = 1000000000;
double y = 0.0000001;

意図したとおりの結果が出力されました

次に大きな数字を1桁増やして実行します

double x = 10000000000;
double y = 0.0000001;

すると結果は大きな数字だけになり小さな数字は足されていないことになってしまいました

これは有効桁数をこえて小さな数字が切り捨てられたことが原因です

<前へ(第6回 変数とデータ型(整数型))