diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-11-27 05:05:04 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-11-27 06:07:46 +0900 |
| commit | c754d24b162ecd504f3c4bdd8632045dd0398768 (patch) | |
| tree | 362323710bb329ad609d379df4e4a429e4229fd2 /services/nuldoc/content/posts/2025-10-31 | |
| parent | d1014de68415df8f0a5dc3389332e086119c6198 (diff) | |
| download | nsfisis.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} 頻繁に必要になるようなものではないが、いつか誰かを救えれば幸いである。 |
