【CSS】calc(infinity / infinity)は何になるか?
先日、次の記事を読んでinfinity
の計算について興味を持ちました。
なお、infinityの値が2147483647ではありません。calc(infinity - 2147483647)の結果も2147483647と同じなります。
infinity
が実行環境における「可能な最大値」となることは知っていましたが、infinity
を含む計算がどのような結果になるのかは理解していませんでした。そこでz-index
プロパティを用いて、infinity
に関する計算の検証および調査を行ったので、まとめたいと思います。
infinity
が絡む計算
今回検証した限りでは、infinity
が絡む計算は次の3パターンにわけられます。
以降ではJavaScriptのWindow.getComputedStyle()を使用しつつ、それぞれのz-index
の値を確認していこうと思います。
infinity
となる計算
結果が±infinity
は、直接キーワードを指定する以外にも、calc()
関数の計算結果として算出されることがあります。
これは、次のような計算が該当します。
- 任意の値に
±infinity
を何かしらの値に加算または減算する - 任意の値を
±infinity
で乗算する
z-index: calc(1 + infinity);
z-index: calc(1 - infinity);
z-index: calc(1 * infinity);
z-index: calc(1 * -infinity);
また、計算過程でinfinity
キーワードを直接使用せずに、infinity
の結果を得ることがあります。
- 任意の値を
0
で割る - 数学関数の特定の引数の組み合わせは、
infinity
となるように定義されている- たとえば、
pow(0, -1)
など
- たとえば、
z-index: calc(1 / 0);
z-index: calc(-1 / 0);
z-index: pow(0, -1);
0
となる計算
結果が任意の値を±infinity
で除算すると、0
になります。
z-index: calc(1 / infinity)
z-index: calc(1 / -infinity);
NaN
となる計算
結果がNaN
は明確に定義された値を持たない、特定の演算結果を表します。
次のような計算を行うことで、NaN
となります。
-
±infinity
を±infinity
で割る -
0
を±infinity
で乗算する -
+infinity
を-infinity
に加算する - 同じ符号の2つの
infinity
を減算する
ちなみにタイトルのcalc(infinity / infinity)
は「NaN
(何)になる」が正解ですね。
z-index: calc(infinity / infinity);
z-index: calc(0 * infinity);
z-index: calc(-infinity + infinity);
z-index: calc(infinity - infinity);
また、本記事の内容(infinity
)とは直接関係ないですが、以下のような操作でもNaN
の結果を得ることができます。
-
0
を0
で割る - 数学関数の特定の引数の組み合わせは、
NaN
を生成するように定義されている- たとえば
log(-1, -1)
など
- たとえば
- 少なくとも1つ以上の
NaN
を引数に渡す
z-index: calc(0 / 0);
z-index: log(-1, -1);
z-index: calc(NaN + 1);
NaN does not escape a top-level calculation; it’s censored into a zero value
ただし、上記に書かれているようにNaN
となった場合は、値が最終的に0
に置き換えられます。
以下の例で、z-index
に値がない場合はauto
になっていることからも、NaN
が0
に置き換えられていることがわかります。
おわりに
infinity
が絡む計算について、z-index
プロパティを用いて検証および調査を行いました。基本的にCSSの数学関数は、IEEE-754と呼ばれる規格に基づいたもののようで、この辺に明るい方は理解しやすいかもしれません。
実際にCSSでinfinity
を使うユースケースは少ないかもしれませんが、calc()
関数を使う際には、infinity
が絡む計算についても理解しておくと、想定外の挙動を避けることができるかと思います。本記事の内容が少しでもお役に立てれば幸いです。
参考
Discussion
タイトルの伏線回収が秀逸✨
z-index
プロパティだと値が整数値に丸められるため、小数値を扱えるプロパティ(例えばline-height
)を使ったほうが計算結果を確認しやすいです。