床関数と天井関数

出典: フリー百科事典『ウィキペディア(Wikipedia)』

床関数 から転送)
床関数
天井関数

床関数(ゆかかんすう、floor function)と天井関数(てんじょうかんすう、ceiling function)は、任意の実数に対し整数を対応付ける関数である。

"floor" や "ceiling" といった名称やその他の記法は、1962年にケネス・アイバーソンによって導入された[1]

目次

[編集] 床関数

床関数は、実数 x に対して x 以下の最大の整数として定義され、

 \lfloor x \rfloor, [x], \operatorname{floor} (x)

などと書かれる([x] は日本や中国ではガウス記号などと呼ばれる)。これを数式で表すと次のようになる。

 \lfloor x \rfloor=\max\{n\in\mathbb{Z}\mid n\le x\}.

例えば、

  • floor(e) = 2
  • floor(√3) = 1
  • floor(-π) = -4

といった具合である。実数 x に対し、\lfloor x \rfloor整数部分x - \lfloor x \rfloor小数部分と呼ぶ。小数部分は x  mod  1 や {x} とも書かれる。整数部分の値は床関数の値そのものであるから、例えば -2.3 の整数部分は -2 ではなく -3 であること、また小数部分は -0.3 ではなく 0.7 であることに注意が必要である。小数部分は、任意の実数に対して 0 以上 1 未満である(この定義は直感的ではないので、-2.3 の整数部分を -2 と定義する流儀もある)。

任意の有理数帯分数で表せる、すなわち整数と真分数とに分解して表示できるが、この整数と真分数との関係は実数の整数部分と小数部分の関係に拡張され、任意の実数は整数部分と小数部分とに分解して表示できる。

[編集] 天井関数

床関数と密接に関係しているのが天井関数である。これは、実数 x に対して x 以上の最小の整数として定義され、

 \lceil x \rceil, \operatorname{ceil} (x), \operatorname{ceiling} (x)

などと書かれる。これを数式で表すと次のようになる。

 \lceil x \rceil=\min\{n\in\mathbb{Z}\mid x\le n\}.

例えば、

  • ceil(e) = 3
  • ceil(√3) = 2
  • ceil(-π) = -3

といった具合である。

[編集] 床関数と天井関数の性質

  • 任意の実数 x に対し、次の式が成り立つ。( \le の等号はxが整数であるときに限り成立)
     \lceil x \rceil - 1 < \lfloor x\rfloor \le x \le \lceil x \rceil < \lfloor x \rfloor + 1
  • 任意の実数 x に対し、次の式が成り立つ。
    \lceil x \rceil = - \lfloor - x \rfloor
    \lfloor x \rfloor = - \lceil - x \rceil
  • 任意の整数 k に対し、次の式が成り立つ。
    \left\lfloor \frac{k}{2} \right\rfloor + \left\lceil \frac{k}{2} \right\rceil = k.
  • 床関数と天井関数は冪等である。つまり、次の式が成り立つ。
    \left\lfloor \lfloor x\rfloor \right\rfloor=\lfloor x\rfloor
    \left\lceil \lceil x\rceil \right\rceil=\lceil x\rceil
  • k が整数のとき、次の式が成り立つ。
     \lfloor {k+x} \rfloor = k + \lfloor x\rfloor
     \lceil {k+x} \rceil = k + \lceil x\rceil
  • 床関数と天井関数は連続ではないが、半連続(床関数は上半連続、天井関数は下半連続)である。床関数と天井関数は区分的に定数関数であり、微分係数が存在する x(すなわち、整数でない x)では微分係数は0である。
  • 任意の実数xの小数点以下を四捨五入した値は、次の式で表される。
     \lfloor x + 0.5 \rfloor \quad (x \ge 0)
     \lceil x - 0.5 \rceil \quad (x \le 0)
  • 任意の整数でない実数 x に対し、床関数と天井関数は次のようにフーリエ級数展開できる。
    \lfloor x\rfloor = x - \frac{1}{2} + \frac{1}{\pi} \sum_{k=1}^\infty \frac{\sin(2 \pi k x)}{k}.
    \lceil x\rceil = x + \frac{1}{2} + \frac{1}{\pi} \sum_{k=1}^\infty \frac{\sin(2 \pi k x)}{k}.
  • 任意の実数 x に対し、床関数と天井関数の平均は次のようにフーリエ級数展開できる。
     \frac 1 2 \left( \lfloor x\rfloor + \lceil x\rceil \right) = x + \frac{1}{\pi} \sum_{k=1}^\infty \frac{\sin(2 \pi k x)}{k}.

[編集] 床関数の性質

  • x > 0 かつ n > 0 のとき、次の式が成り立つ。
     \left\lfloor \frac{n}{x} \right\rfloor \geq \frac{n}{x} - \frac{x-1}{x}
  • n が整数のとき、nxn\lfloor x \rfloor は同値である。意匠を凝らした言い方では、床関数は Galois connection の片翼を担っており、整数を実数へ埋め込む関数の upper adjoint である。
  • 床関数を用いると、いくつかの素数生成式をつくることができる (ただしこれらは実際の計算には役立たない)。
  • 互いに素であるの整数 mn に対し、次の式が成り立つ。
    \sum_{i=1}^{n-1} \left\lfloor \frac{im}{n} \right\rfloor = \frac{(m - 1)(n - 1)}{2}
  • ビーティの定理 (Beatty's theorem) は、任意の正の無理数が、床関数を用いて自然数の集合を2つに分ける方法を表している。
  • 正の整数 kn 進数で表すと、\lfloor \log_n k \rfloor + 1 桁となる。

[編集] C言語の演算子 (int)

演算子(int)

C言語やそれに関連するプログラミング言語では、型変換演算子 (int) を用いることで浮動小数点型の値を整数型に変換することができる。この演算子は0への丸めを行うものである。すなわち、0以上の x に対しては \lfloor x \rfloor として、負の x に対しては \lceil x \rceil として作用する。なお、これとは別に床関数floorと天井関数ceilも存在する。

これらの演算により値の有意性が失われるので、それにより丸め誤差が大きくなる虞がある。例えば、正しくは 0.6/0.2 = 3 であるにもかかわらず、C言語の多くの実装において (int)(0.6/0.2) は 2 となってしまう。これは、コンピュータは内部処理に二進法を用いており、その二進法では0.6や0.2を有限小数で表すことができないため、0.6/0.2 が 2.999999999999999555910790149937 と計算されることに起因する。

浮動小数点型が実価を保存するのに使用される状況においては、POSIX の floor() 関数と同様、Java (Sun JDK version 1.5.0_05), Perl (version 5.8.0), PHP (version 5.2.1) といった他の多くの言語についても同様の誤差が現れる。

このような現象が問題になる場合、内部処理に十進法を用いることがある。しかし、この方法で解決されるのは問題の一部に過ぎず、(int)((4.0/9.0) * 9.0) が 3 となってしまう(本来は 4 となるべき)ような問題は十進法を用いても解決されない(この結果は (4.0/9.0) * 9.0 = 0.44444...4444 * 9.0 = 3.99999...9996 という計算によるものであり、二進法でも十進法でも表わし得る最も近い数で近似したところで問題は変わらない)。

解決策としては、微小な定数 e(例えば e = 0.00000001 など)を定めた上で、正の x に対して床関数を floor(x) = (int)(x + e)、天井関数を ceiling(x) = (int)(x + e) + 1 などと定義する方法がある。

より綺麗な解決法としては、有理数を正確に表せるようなデータ型を用いる、つまり除算などが行われる時にそこで丸め誤差が発生するのを避けるという方法がある。例えば、浮動小数点型の被除数と正の整数型の除数との組を保持しておくという方法である。この方法では途中計算やその間のデータ保持はすべてこの型で行われ、最後に結果を表示するときにのみ十進の浮動小数点型の表示が計算される。これにより正しい丸めが行われる。尚、この方法は Windows 付属の電卓 で用いられている。

[編集] コンピュータでの実装

どの表計算ソフトceiling 関数を実装している。詳細はプログラム毎に異なるが、多くの場合2つの変数 (a,b) を取り、a を切り上げて最も近い b の倍数にする。例えば、ceiling(2,3) であれば 3 の倍数に 2 を切り上げるので戻り値は 3 となる。しかしながら、「切り上げ」の意味はプログラム毎に異なる。

Microsoft Excelceiling 関数の場合、数学でいう天井関数とは異なり、無限大への丸め(正負によらず絶対値が大きい方への丸め)が行われる。例えば、ceiling(-4.5,1) であれば -5 となる。この方式は Office Open XML の形式に準拠している。

一方 OpenOffice.org 等で用いられている OpenDocument の形式では、数学でいう天井関数のように、値が大きくなる方への丸めが行われる。例えば、ceiling(-4.5;1) であれば -4 となる(引数の指定によりMicrosoft Excel と同様のはたらきをさせることも可能)。

Mathematica における関数も、数学と同じはたらきをする。

[編集] 切り捨て

床関数は常に整数を返すが、実数の切り捨てはどの桁においても為されるものであり、小数第1位での切り捨てとは限らない。

[編集] 組版

床関数・天井関数は、\lfloor x \rfloor, \lceil x \rceil のように上下の欠けた角括弧で表される。これは、LaTeX では \lfloor, \rfloor, \lceil, \rceil と書かれる。Unicodeでは U+2308U+230B に割り当てられており、⌈x⌉, ⌊x⌋のようになる。

記号 Unicode JIS X 0213 文字参照 名称
U+2308 &#x2308;
&#8968;
LEFT CEILING
U+2309 &#x2309;
&#8969;
RIGHT CEILING
U+230A &#x230A;
&#8970;
LEFT FLOOR
U+230B &#x230B;
&#8971;
RIGHT FLOOR

[編集] 脚注

  1. ^ Kenneth E. Iverson. "A Programming Language". Wiley, 1962.