.net column
.NET開発者のためのブログメディア

C#で絶対値を取得するには?絶対値の意味も解説!

2020年07月03日
SE
C#での絶対値とは何ですか?
PM
マイナスの数値を取り除く、プラスだけの数値のことを言います。

絶対値とは?

C#の絶対値の取得方法を知る前に、まず絶対値とは何なのかを確認しておきましょう。絶対値とは「0を起点とした時の値」のことで、簡単に言えば「正の数」です。5は0を起点として5であり、-5も0を起点として5ということです。

つまり、絶対値とはマイナスの数値・負の数を除くプラスのみの数値のことです。そしてC#において絶対値の取得とは「マイナスの数値だったらマイナスを取り、プラスにする」ということになります。

この記事では絶対値をC#で取得する方法と、注意すべき点、実例について解説します。C#を利用している方は是非ご覧ください。

C#の絶対値の計算方法

C#で絶対値を取得するにはどうしたらいいのでしょうか。以下のようなメソッドを作れば、絶対値を返してくれます。

static int GetABSVal(int val)
{
if (val >= 0)
return val;
else
return -val;
}

ABSValとはabsolute valueの略です。このメソッドに値を渡せば、マイナス値だった場合にマイナスをかけてプラスにして返すので、絶対値を取得できます。

Math.Absで絶対値を取得できる

しかし、上のようなコードを記述しなくても、C#では絶対値を取得できる標準メソッドがあります。それがMath.Absです。以下のようにすれば5が表示されます。

Console.WriteLine(Math.Abs(-5));

また、Math.Absはよく使われるint型以外の様々な型にも対応しています。以下のようにfloat型の-5.5fを渡せば、5.5が返されます。

Console.WriteLine(Math.Abs(-5.5f));

Math.Absは様々な型に対応できる

C#のMath.Absは、以下のサンプルのように多くの型に対応できます。

decimal abs_dc = Math.Abs(-1.2m);
Console.WriteLine(abs_dc+”” Decimal型””);
double abs_db = Math.Abs(-3.4d);
Console.WriteLine(abs_db+”” double型””);
short abs_sh = Math.Abs((short)-5);
Console.WriteLine(abs_sh+”” short型””);
int abs_in = Math.Abs(-6);
Console.WriteLine(abs_in + “” int型””);
long abs_ln = Math.Abs(-7L);
Console.WriteLine(abs_ln+”” long型””);
sbyte abs_sb = Math.Abs((sbyte)-8);
Console.WriteLine(abs_sb+”” sbyte型””);
float abs_fl = Math.Abs(-9.1f);
Console.WriteLine(abs_fl+”” float型””);

Math.Absは数値の型を気にせず使える

上のサンプルの実行結果は以下になります。

1.2 Decimal型
3.4 double型
5 short型
6 int型
7 long型
8 sbyte型
9.1 float型

なお、Math.Absのように同じメソッド名で複数の型のパラメータに対応できる作り方を、オーバーロードと言います。パラメータの型で判別して、内部で別の処理が呼び出されています。

C#のMathクラスはAbs以外にも、平方根を取得するSqrt、logを取得するLog、小数点を切り捨てるFloor、切り上げをするCeiling、サインを取得するSin、コサインを取得するCosなど様々な数学系メソッドを持つので興味があれば調べてみてください。

複素数の絶対値も計算できる

C#では複素数の絶対値も計算できます。複素数はComplexというクラスで設定し、Complex.Absで複素数の絶対値を取得できます。以下を実行すると、5と表示されます。

Complex complex = new Complex(3.0, 4.0);
Console.WriteLine(Complex.Abs(complex));

複素数とはa+biのような式で表され、aとbで示される二次元座標を表すことができます。iは虚数なので、乗算するとマイナスになる実在しない数です。Complex.Absで取得できる絶対値は、√aの2乗+bの2乗で、この値は複素数が示す座標のベクトル長を意味します。

上の例では|3+4i|=√3×3+4×4=√25=5という結果が返るので、5が表示されるのです。なおComplexクラスを使用する場合は、ソースの先頭にusing System.Numerics;を記述してください。

Math.Absの落とし穴

めったにないケースですが、Math.Absには危険な落とし穴があります。以下の2つの例を見てください。

short short_val = -32768;
Console.WriteLine(Math.Abs(short_val));

int int_val = -2147483648;
Console.WriteLine(Math.Abs(int_val));

上の結果は32768、下は2147483648になるように思えます。ところが、結果はどちらもOverflowExceptionが発生して異常終了してしまうのです。なぜでしょうか。

それはC#のshort型は-32768~32767、int形は-2147483648~2147483647までの範囲の値しか取れないからです。shortやintの最小値の値をプラスにしたくても、範囲外になるので出来ないということです。

これにひっかかる機会は少ないと思われますが、Math.Absを使用する時は頭の片隅に入れておくと良いでしょう。

Math.Absを使用した実例

C#の絶対値を取得するMath.Absは、具体的にどのような場合に役立つのでしょうか。以下は一つの例です。2つの座標の距離を表示します。

Random rand = new System.Random();

int x1 = rand.Next(0, 10);
Console.WriteLine(“”Aの位置”” + x1);
int x2 = rand.Next(0, 10);
Console.WriteLine(“”Bの位置”” + x2);

Console.WriteLine(“”AからBを引いた値”” + (x1 – x2));
Console.WriteLine(“”AとBの距離は”” + Math.Abs(x1 – x2));

Randomは乱数を取得するC#の機能です。このクラスのNextにより、指定した範囲の乱数を得ることができます。このサンプルでは0から9までの値を得られます。10まではないことに注意してください。

Math.Absでマイナス値を排除できる

上のサンプルは実行する度に結果が変わりますが、以下のようにAからBを引いた値がマイナスになることがあります。

Aの位置1
Bの位置5
AからBを引いた値-4
AとBの距離は4

AとBの差がマイナスでも、距離はプラスの値にしたいです。こういった場合に、絶対値を取得できるMath.Absが役立つのです。

Math.Absを使わず、結果がマイナス値だったらプラス値にするという処理を、if文で行っても問題はありません。しかし、Math.Absを使用することで、絶対値を取得しているということが明示されるため、意図が明確なプログラムになります。

SE
Math.Absはさまざまな数値を計算することが出来るのですね。
PM
さまざまな場面で絶対値を取得することが出来るので、身に付けておくといいでしょう。

C#のMath.Absで絶対値をスマートに処理しよう

C#の絶対値を取得するMath.Absについて紹介しましたが、いかがでしたでしょうか。プログラムをしていると、マイナスの値をプラス値として扱いたい機会がよくあるので、Math.Absを使うことは多くなるでしょう。

この記事を参考に、Math.Absを実際に使ってみてください。また、興味があればMath.Abs以外の数学系の機能も調べてみましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags

Jobs