aboutsummaryrefslogtreecommitdiffhomepage
path: root/services/nuldoc/content/posts/2025-10-31
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-11-27 05:05:04 +0900
committernsfisis <nsfisis@gmail.com>2025-11-27 06:07:46 +0900
commitc754d24b162ecd504f3c4bdd8632045dd0398768 (patch)
tree362323710bb329ad609d379df4e4a429e4229fd2 /services/nuldoc/content/posts/2025-10-31
parentd1014de68415df8f0a5dc3389332e086119c6198 (diff)
downloadnsfisis.dev-c754d24b162ecd504f3c4bdd8632045dd0398768.tar.gz
nsfisis.dev-c754d24b162ecd504f3c4bdd8632045dd0398768.tar.zst
nsfisis.dev-c754d24b162ecd504f3c4bdd8632045dd0398768.zip
feat(nuldoc): Djot to Markdown
Diffstat (limited to 'services/nuldoc/content/posts/2025-10-31')
-rw-r--r--services/nuldoc/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.md (renamed from services/nuldoc/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.dj)22
1 files changed, 8 insertions, 14 deletions
diff --git a/services/nuldoc/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.dj b/services/nuldoc/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.md
index 961cb89..3d0ea07 100644
--- a/services/nuldoc/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.dj
+++ b/services/nuldoc/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.md
@@ -22,16 +22,15 @@ isInternal = true
date = "2025-10-31"
remark = "公開"
---
-::: note
+:::note
この記事は、2025-01-23 に [デジタルサーカス株式会社](https://www.dgcircus.com/) の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
:::
-::: note
+:::note
この記事の内容を、[PHP 勉強会@東京 第 180 回](/slides/2025-10-29/phpstudy-tokyo-180/) で発表しました。
:::
-{#intro}
-# はじめに
+# はじめに {#intro}
数値の範囲を指定して検索をおこなう API の中に、半開区間を指定させるものがある。半開区間とは、一方の端を含み一方の端を含まないような区間である。ここでは特に左端が閉じ右端が開いているような区間を扱う。例えば、次の区間 `[3, 7)` は `3 <= x < 7` であるような `x` の集合である。
@@ -40,8 +39,7 @@ remark = "公開"
しかし、検索の対象が実数であればどうだろうか?
-{#half-open-real-interval}
-# 実数の半開区間
+# 実数の半開区間 {#half-open-real-interval}
ちょうど `1` だけを含むような半開区間が作れないか考えよう。つまり、左端に `1` を、右端に `1` より少しだけ大きい値を指定して、「ちょうど `1`」を表すような範囲を作れないだろうか。
@@ -50,16 +48,14 @@ remark = "公開"
数学の世界ではこのような区間を作ることはできない。では、コンピュータ上ならばどうだろうか?
-{#float-numbers}
-# コンピュータにおける実数表現
+# コンピュータにおける実数表現 {#float-numbers}
コンピュータにおける実数の表現にはさまざまなものがあるが、ここでは最もよく使われる IEEE 754 という標準規格に従う形式、その中でも `binary64` と呼ばれる形式を考えることにする。これは多くの言語で `float` や `double` と呼ばれるものと同じである。
`binary64` は 64 bit で構成されており、無限個ある実数をすべて覆い尽くすことはできない。数学の上では存在しなかった `p` も、`binary64` の範囲に実数を限定すれば都合のよい `p` を見つけることができる。
-{#single-value-float-interval}
-# 浮動小数点数で単一値を指す半開区間を作る
+# 浮動小数点数で単一値を指す半開区間を作る {#single-value-float-interval}
結論から言うと、`p` は `1.0000000000000002` である。`[1, 1.0000000000000002)` は `binary64` の範囲で `1` しか含まない。別の言い方をすれば、`1 < x < 1.0000000000000002` を満たすような `x` は、`binary64` で表せない。
@@ -79,8 +75,7 @@ IEEE 754 にはこのような用途に用いることができる `nextUp` と
これを使えば、ある数 `x` が与えられたとき、`[x, nextUp(x))` という半開区間を作ればちょうど `x` だけを含むような範囲を表すことができる。
-{#nextup-in-php}
-# PHP で nextUp を実装する
+# PHP で nextUp を実装する {#nextup-in-php}
プログラミング言語によっては標準ライブラリに `nextUp` 相当の操作が定められているものもある。
PHP には無かったので自作した。
@@ -124,7 +119,6 @@ PHP には無かったので自作した。
}
```
-{#outro}
-# おわりに
+# おわりに {#outro}
頻繁に必要になるようなものではないが、いつか誰かを救えれば幸いである。