目次

数学関数

System.Math クラスに、数学用の関数・定数などが定義されています。 表1に Math クラスのメンバーを示します(全て static)。

Math クラスのメンバー
メンバー名 意味
定数 PI 円周率。
E 自然対数の底
指数・対数関数 Exp(x) exp (x)
Pow(x, y) xy
Log(x) log e x
Log(x, y) log y x
Log10(x, y) log 10 x
三角関数 Sin(x) sin (x)
Cos(x) cos (x)
Tan(x) tan (x)
逆三角関数 Asin(x) sin −1 (x)
Acos(x) cos −1 (x)
Atan(x) tan −1 (x)
Atan2(y, x) tan −1 (
x
y
)
双曲線関数 Sinh(x) sinh (x)
Cosh(x) cosh (x)
Tanh(x) tanh (x)
整数化 Floor(x) x の床(x 以下の最大の整数)。
Ceiling(x) x の天井(x 以上の最小の整数)。
Round(x) x を四捨五入。
その他の数学関数 Abs(x) x の絶対値。
Sign(x) x 符号。x が正ならば1、負ならば-1、0ならば0。
Sqrt(x) x の平方根。
最大・最小 Max(x, y) x, y のうち、大きい方を帰す。
Min(x, y) x, y のうち、小さい方を帰す。
その他 BigMul(x, y) int×intlongを帰す乗算を行う。
DivRem(x, y, out res) 商と剰余を同時に計算する。 res にx % yを代入し、x / yを帰す。
IEEERemainder(x, y) 剰余を計算する。x % yx - Math.Floor(x / y) * yなのに対して、 この関数はx - Math.Round(x / y) * yを帰す。
Console.Write("{0}\n", Math.Sin(2.0 / 3.0 * Math.PI));
Console.Write("{0}\n", Math.Log10(10000));
Console.Write("{0}\n", Math.Pow(2, 8));
0.866025403784439
4
256

以下、何点か補足。

Log と Log10

自然対数と常用対数については、 「常用対数と自然対数」を参照。

Atan2

Math.Atan2、 C 言語にも atan2 という関数があるんですが、 意外と知らない人が多いみたい。

直交座標 (x, y) → 極座標 (r, θ) の変換とか、 複素数 z = x + i y の偏角 arg z とかを求めたいときに使う。 ( atan(x / y) だと、 ( 1, 1 ) ( 1, 1 ) も atan(1) になっちゃって、π/4 になってしまうので。 )

というか、おそらくは複素数の偏角を求めるために作られた関数だと思う。 だから、atan2 の引数は atan2(sin, cos) の順序じゃなくて、 atan2(cos, sin) = atan2(実部, 虚部) の順序。

数学っぽく書くなら、atan2(x, y) arg (x + i y) です。

Round

上の表では“四捨五入”と説明しましたが、 正確には、ぴったり真ん中(例えば 0.5, 1.5, 2.5, ・・・)のときの動作は四捨五入ではありません。

Round 関数は、第2引数に「ぴったり真ん中のときの丸めをどうするか」を指定することが出来て、 通常は MidpointRounding.ToEven になっています。 これは“偶数丸め”と呼ばれているもので、 0.5 → 0、1.5 → 2、2.5 → 2、3.5 → 4、 4.5 → 4 ・・・ というように、必ず偶数に向かって丸めます。

なぜこんなことをするかというと、 この方式が一番誤差の蓄積が少ないから。 “切り上げ”と“切り下げ”が半々なので、 丸めた数値を足し合わせていったとき、 丸め誤差が打ち消しあってくれる確率が高くなります。

一方、日本語の文字通りの四捨五入(ぴったり真ん中のときは切り上げ)をしたければ、 MidpointRounding.AwayFromZero を指定します。 こちらの方が演算量は小さくて、 精度よりも演算量優先の場合はこちらを指定します。 (要するに、0.5 を足して切り捨てるだけなので。 ToEven の場合は、0.5 のときに条件分岐したりテーブル参照したりが必要。)

時刻

時刻は System.DateTime で、 時刻の差、すなわち、経過時間は System.TimeSpan クラスで表されます。

DateTime t = DateTime.Now;
Console.Write("{0}\n", t);
Console.Write("{0}/{1,2}/{2,2} ({3}) {4,2}:{5:d02}:{6:d02}\n",
  t.Year, t.Month, t.Day, t.DayOfWeek,
  t.Hour, t.Minute, t.Second);

Console.Write("エンターキーを押して");
Console.ReadLine();

TimeSpan ts = DateTime.Now - t;
Console.Write("キーを押すまでの時間: {0}[ms]", ts.TotalSeconds);
2005/09/21 16:51:44
2005/ 9/21 (Wednesday) 16:51:44
エンターキーを押して
キーを押すまでの時間: 2.6738448[ms]

コレクション

System.Collections 名前空間以下に、 さまざまなコレクションクラスがあります。

詳細説明に別ページを儲けました: 「コレクション

どのコレクションがどういう動作をするかは、 「コレクション概要」も参照。

コレクションクラス
クラス名 概要
シーケンス ArrayList 配列で実装されたリストです。「インデクサー」による要素のランダムアクセスが可能です。
Stack FILO(first in last out:先入れ後出し)式のコレクション。
Queue FIFO(first in fast out:先入れ先出し)式のコレクション。
辞書 Hashtable 名前の通り、ハッシュテーブルで実装された辞書。 (キー, 値)のペアの順序は完全に失われます。 値の挿入も、キーによる検索も高速です。 (十分に大きなキャパシティにしておけば、非常に高速)
SortedList 整列済みの配列で実装された辞書。 (キー, 値)のペアは、 キーの大小によってソートされた状態になります。 値の挿入には時間がかかりますが、 キーによる検索は非常に高速です。 (二分探索アルゴリズムによる検索を行います。)
ビット配列 BitArray 例えば、ある変数 x の n ビット目が1か0かを調べるには、(x & (1 << (n - 1))) != 0と言うように書きますが、このビット配列を用いると、BitArray a; a[n]というように書けます。

少し補足すると、 シーケンスと言うのは順番に意味のあるコレクションの事をいいます。 int 型で番号を指定して、インデクサで a[i] と言うようにアクセスできたり、 「先に入れた値ほど先に出てくる」、 「後に入れた値ほど先に出てくる」など、値の追加・取り出しに順序があります。

一方、辞書というのは、値とキーのペアを持っていて、 キーによって値を検索できるものです。 例えば、キーの型を string、値の型を int とすると、 a["keyword"] = 5; というように、 キーの型を引数とするインデクサによる値の読み書きができます。

Ver. 2.0

.NET Framework 2.0 では、「ジェネリック」の導入に伴い、 ジェネリック版のコレクションクラスが追加されました。 ジェネリックコレクションクラスは System.Collections.Generic 名前空間以下にあります。

ジェネリックコレクション
クラス名 概要
シーケンス List 非ジェネリック版の ArrayList に相当。 配列で実装されたリストです。
LinkedList 連結リストです。 要素のランダムアクセスはできませんが、 シーケンスの末尾以外への要素の挿入が高速に行えます。
Stack 非ジェネリック版と同様。 FILO 式のコレクションです。
Queue 非ジェネリック版と同様。 FIFO 式のコレクションです。
辞書 Dictionary 非ジェネリック版の Hashtable に相当。 ハッシュテーブルで実装された辞書です。
SortedDictionary 二分探索木(赤黒木)で実装された辞書。 (キー, 値)のペアは、 キーの大小によってソートされた状態になります。 値の挿入も、キーによる検索も高速です。 (できること自体はハッシュテーブルと二分探索木に大きな差はありませんが、 演算量やメモリ使用量などの点でそれぞれ一長一短あります。)
SortedList 非ジェネリック版と同様。 整列済みの配列で実装された辞書。

更新履歴

ブログ