数学関数
System.Math クラスに、数学用の関数・定数などが定義されています。 表1に Math クラスのメンバーを示します(全て static)。
| メンバー名 | 意味 | ||
|---|---|---|---|
| 定数 | PI | 円周率。 | |
| E | 自然対数の底 | ||
| 指数・対数関数 | Exp(x) | exp (x) | |
| Pow(x, y) | xy | ||
| Log(x) | log e x | ||
| Log(x, y) | log y x | ||
| Log10(x) | 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
            ( 
 | ||
| 双曲線関数 | 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×intでlongを帰す乗算を行う。 | |
| DivRem(x, y, out res) | 商と剰余を同時に計算する。 res に x % yを代入し、x / yを帰す。 | ||
| IEEERemainder(x, y) | 剰余を計算する。 x % yがx - Math.Truncate(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(y / x) だと、 ( 1, 1 ) も ( −1, −1 ) も atan(1) になっちゃって、π/4 になってしまうので。 )
数学っぽく書くなら、atan2(y, x) = 
        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 | 非ジェネリック版と同様。 整列済みの配列で実装された辞書。 | 
