数学関数
System.Math クラスに、数学用の関数・定数などが定義されています。表1に Math クラスのメンバーを示します(全て static)。
| メンバー名 | 意味 | ||
|---|---|---|---|
| 定数 | PI | 円周率。 | |
E | 自然対数の底 | ||
| 指数・対数関数 | Exp(x) | exp(x) | |
Pow(x, y) | xy | ||
Log(x) | loge x | ||
Log(x, y) | logy x | ||
Log10(x) | log10 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.8660254037844394256
以下、何点か補足。
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:442005/ 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 | 非ジェネリック版と同様。 整列済みの配列で実装された辞書。 |
