Movatterモバイル変換


[0]ホーム

URL:


Logo

目次

数学関数

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

Math クラスのメンバー
メンバー名意味
定数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(
y
x
)
双曲線関数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.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配列で実装されたリストです。「インデクサー」による要素のランダムアクセスが可能です。
StackFILO(first in last out:先入れ後出し)式のコレクション。
QueueFIFO(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非ジェネリック版と同様。 整列済みの配列で実装された辞書。

更新履歴

更新:言語バージョンの指定

[C#]

ファイル ベース実行

[C#]

C# 14.0 の新機能

[C#]

更新:[雑記] オーバーロード解決

[C#]

型の分割定義 (partial)

[C#]

ブログ

C# 14 の破壊的変更点(First-class Span)

ファイナライザー

文字列リテラルを data セクションに UTF-8 で書き込む案

nameof(T<>)

First-class な Span 型


誤字等を見つけた場合や、ご意見・ご要望がございましたら、GitHub の Issues まで気兼ねなくご連絡ください。

[8]ページ先頭

©2009-2025 Movatter.jp