今回は、C#で使用されるfloat型について詳しく解説します。
float型は浮動小数点数を表すために使用されますが、その仕様や使い方について理解することは初心者にとって重要です。
この記事では、float型の基本的な概念から、実際のサンプルコードを交えてわかりやすく解説していきます。
float型とは
float型は、C#で使用される浮動小数点数の一つです。浮動小数点数とは、整数部分と小数部分を持ち、小数点の位置が可変的なデータ型のことを指します。
float型は、32ビット(4バイト)のメモリを使用し、有効桁数は約7桁です。また、値域は-3.402823E+38から3.402823E+38までです。 例えば、以下のように宣言することができます。
float myFloat = 3.14f;
このように、f
を付けることで数値がfloat型であることを明示する事が可能です。
float型の特徴
float型は、浮動小数点数を表現するためのデータ型です。C#では、32ビットの精度で浮動小数点数を扱うことができます。 float型は、次のような特徴があります。
- 小数点以下の桁数に制限がある
- 数値範囲に制限がある
- 演算時に誤差が生じる可能性がある
小数点以下の桁数に制限がある
float型は、小数点以下の桁数に制限があります。
具体的には、7桁程度までしか正確な値を表現することができません。これは、浮動小数点数を2進数で表現する際に生じる誤差によるものです。
例えば、0.1という値をfloat型で表現する場合、実際には0.100000001490116119384765625という値が格納されます。このような微小な誤差は一般的な計算では問題ありませんが、高精度な計算を行う場合や金銭計算など正確性が求められる場合には注意が必要です。
数値範囲に制限がある
float型は、表現可能な範囲にも制限があります。
具体的には、約1.5×10^-45から約3.4×10^38までの範囲内でしか正確な値を表現することができません。
このため、極端に大きいまたは極端に小さい値を扱う場合や、整数演算を行う場合にも注意が必要です。
演算時に誤差が生じる可能性がある
float型では演算時に誤差が生じる可能性もあります。これは前述したように浮動小数点数を2進数で表現する際の誤差や丸め処理の影響です。
そのため、「等しい」と判断されていた2つの値でも微妙な違い(誤差)が生じてしまうこともあります。 例えば以下のコードでは、0.1f * 10f
を計算しています。
float a = 0.1f * 10f;
Console.WriteLine(a == 1.0f); // false
0.1の10倍は1.0であるはずですが、結果としてfalse
と表示されてしまいます。
==
演算子では厳密な比較(完全一致)しか行われず、a
変数内部で発生した微妙な誤差(0.00000011920928955078125)は考慮されていません。
このような場合、Math.Abs(a - 1f) < float.Epsilon
という式を使って比較することで微妙な誤差も考慮した比較処理を行うことが出来ます。
float a = 0.1f * 10f;
Console.WriteLine(Math.Abs(a - 1f) < float.Epsilon); // true
float型の宣言方法
float型の変数を宣言するには、以下のように記述します。
float num1 = 3.14f;
上記の例では、num1
という名前のfloat型の変数を宣言しています。
初期値として、小数点以下2桁まで表示される円周率π(3.14)を代入しています。 また、注意点として、float型の変数を宣言する際には末尾にf
を付ける必要があります。
これは、C#がデフォルトでdouble型と認識するためです。つまり、3.14
と書いた場合はdouble型となりますが、3.14f
と書くことでfloat型となります。
// double型
double num2 = 3.14;
// float型
float num3 = 3.14f;
このように、同じ値でもデータ型が異なる場合があるため、適切なデータ型を選択することが重要です。
float型の演算
float型は、小数点以下を扱うことができるデータ型です。そのため、四則演算や比較演算などの様々な演算が可能です。
四則演算
float型同士の足し算、引き算、掛け算、割り算は以下のように行います。
float a = 1.5f;
float b = 2.5f;
// 足し算
float c = a + b; // cには4.0が代入される
// 引き算
float d = a - b; // dには-1.0が代入される
// 掛け算
float e = a * b; // eには3.75が代入される
// 割り算
float f = a / b; // fには0.6が代入される
整数型ではないため剰余算%
はできません。
割り算の余りを求めたい場合は整数型にキャストしてから計算しましょう。
比較演算
float型同士の大小比較や等価比較も可能です。以下は比較演算子を用いた例です。
float g = 1.5f;
float h = 2.5f;
if (g < h)
{
Console.WriteLine("gはhよりも小さい");
}
else if (g > h)
{
Console.WriteLine("gはhよりも大きい");
}
else if (g == h)
{
Console.WriteLine("gとhは等しい");
}
先程触れたように、浮動小数点数の計算では誤差が生じる場合があります。
そのため、正確な計算結果を求める必要がある場合には注意する必要があります。
また、計算結果がNaN(Not a Number)やInfinity(無限大)となってしまう場合もあります。これらの値を扱う際にも注意する必要があります。
float型とdouble型の違い
float型とdouble型は、C#で数値を扱うためのデータ型です。両者の違いは、精度とメモリ使用量にあります。
float型は32ビットで表現され、浮動小数点数を扱います。一方、double型は64ビットで表現され、より高い精度の浮動小数点数を扱います。
つまり、float型はよりメモリ使用量が少ない代わりに、double型より扱える数値の範囲が狭い特徴を持っています。
一方でdouble型はより高い精度の計算結果が得られますが、その分メモリ使用量も多くなります。 例えば以下のコードを見てみましょう。
float f = 1.234567890123456789f;
double d = 1.234567890123456789;
Console.WriteLine("float: " + f);
Console.WriteLine("double: " + d);
float型では扱える小数点以下の桁数が少ないため多くの桁が切り捨てられてしまい、1.234568
と表示されます。
一方でdouble型では全ての桁が正確に表示され、1.23456789012346
と表示されます(これでも何桁かは丸められて消失しています)。
このような仕様があるので、プログラム上で必要な精度やメモリ使用量に応じて、適切なデータ型を選択することが重要です。