数学関数
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
|
非ジェネリック版と同様。 整列済みの配列で実装された辞書。 |