diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-10-31 22:10:35 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-10-31 22:10:35 +0900 |
| commit | c42df43640b7d2354b3e0b8afc3bffc3d47d3214 (patch) | |
| tree | 7e467f7a84fdfad24ab588da090168f19cc24ca1 /services | |
| parent | 84ea9620eb4c3352fa03b2e8ea5a81aad583790a (diff) | |
| download | nsfisis.dev-c42df43640b7d2354b3e0b8afc3bffc3d47d3214.tar.gz nsfisis.dev-c42df43640b7d2354b3e0b8afc3bffc3d47d3214.tar.zst nsfisis.dev-c42df43640b7d2354b3e0b8afc3bffc3d47d3214.zip | |
feat(blog/content): new blog /posts/2025-10-31/representing-single-value-with-half-open-float-interval/
Diffstat (limited to 'services')
| -rw-r--r-- | services/blog/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.dj | 130 | ||||
| -rw-r--r-- | services/blog/nuldoc.toml | 1 | ||||
| -rw-r--r-- | services/blog/public/atom.xml | 10 | ||||
| -rw-r--r-- | services/blog/public/posts/2/index.html | 55 | ||||
| -rw-r--r-- | services/blog/public/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html | 231 | ||||
| -rw-r--r-- | services/blog/public/posts/3/index.html | 49 | ||||
| -rw-r--r-- | services/blog/public/posts/4/index.html | 38 | ||||
| -rw-r--r-- | services/blog/public/posts/5/index.html | 35 | ||||
| -rw-r--r-- | services/blog/public/posts/6/index.html | 20 | ||||
| -rw-r--r-- | services/blog/public/posts/atom.xml | 10 | ||||
| -rw-r--r-- | services/blog/public/posts/index.html | 52 | ||||
| -rw-r--r-- | services/blog/public/tags/float/atom.xml | 19 | ||||
| -rw-r--r-- | services/blog/public/tags/float/index.html | 75 | ||||
| -rw-r--r-- | services/blog/public/tags/index.html | 12 | ||||
| -rw-r--r-- | services/blog/public/tags/php/atom.xml | 10 | ||||
| -rw-r--r-- | services/blog/public/tags/php/index.html | 23 |
16 files changed, 653 insertions, 117 deletions
diff --git a/services/blog/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.dj b/services/blog/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.dj new file mode 100644 index 00000000..170807e0 --- /dev/null +++ b/services/blog/content/posts/2025-10-31/representing-single-value-with-half-open-float-interval.dj @@ -0,0 +1,130 @@ +--- +[article] +uuid = "39d3d137-f18d-4d88-8ef6-7be9cc2f3f0b" +title = "浮動小数点数の半開区間で単一値を表現する" +description = "IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。" +tags = [ + "float", + "php", +] + +[[article.revisions]] +date = "2025-01-23" +remark = "デジタルサーカス株式会社の社内記事として公開" +isInternal = true + +[[article.revisions]] +date = "2025-10-29" +remark = "PHP 勉強会@東京 第 180 回で発表" +isInternal = true + +[[article.revisions]] +date = "2025-10-31" +remark = "公開" +--- +::: note +この記事は、2025-01-23 に [デジタルサーカス株式会社](https://www.dgcircus.com/) の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。 +::: + +::: note +この記事の内容を、[PHP 勉強会@東京 第 180 回](/slides/2025-10-29/phpstudy-tokyo-180/) で発表しました。 +::: + +{#intro} +# はじめに + +数値の範囲を指定して検索をおこなう API の中に、半開区間を指定させるものがある。半開区間とは、一方の端を含み一方の端を含まないような区間である。ここでは特に左端が閉じ右端が開いているような区間を扱う。例えば、次の区間 `[3, 7)` は `3 <= x < 7` であるような `x` の集合である。 + +ここで、この API を使って単一の値を検索することを考えたい。検索対象が整数であれば話は簡単で、1 大きい数を右端に指定してやればよい。5 を探したければ `[5, 6)` を渡せば目的が達成できる。 + +しかし、検索の対象が実数であればどうだろうか? + + +{#half-open-real-interval} +# 実数の半開区間 + +ちょうど `1` だけを含むような半開区間が作れないか考えよう。つまり、左端に `1` を、右端に `1` より少しだけ大きい値を指定して、「ちょうど `1`」を表すような範囲を作れないだろうか。 + +お気付きの方もいるだろうがこれは不可能である。もしそのような区間が作れるなら、`[1, p)` にちょうど `1` しか含まれないような実数 `p` が存在する。しかし、`1` と `p` のちょうど真ん中である `(1+p) / 2` を考えると、`1` よりも大きく `p` よりも小さいから `[1, p)` に含まれる。これは `[1, p)` が `1` しか含まないとした仮定に矛盾する。 + +数学の世界ではこのような区間を作ることはできない。では、コンピュータ上ならばどうだろうか? + + +{#float-numbers} +# コンピュータにおける実数表現 + +コンピュータにおける実数の表現にはさまざまなものがあるが、ここでは最もよく使われる IEEE 754 という標準規格に従う形式、その中でも `binary64` と呼ばれる形式を考えることにする。これは多くの言語で `float` や `double` と呼ばれるものと同じである。 + +`binary64` は 64 bit で構成されており、無限個ある実数をすべて覆い尽くすことはできない。数学の上では存在しなかった `p` も、`binary64` の範囲に実数を限定すれば都合のよい `p` を見つけることができる。 + + +{#single-value-float-interval} +# 浮動小数点数で単一値を指す半開区間を作る + +結論から言うと、`p` は `1.0000000000000002` である。`[1, 1.0000000000000002)` は `binary64` の範囲で `1` しか含まない。別の言い方をすれば、`1 < x < 1.0000000000000002` を満たすような `x` は、`binary64` で表せない。 + +`1` と `p` のビット列での表現を見てみよう。 + +``` +1 = 0011111111110000000000000000000000000000000000000000000000000000 +p = 0011111111110000000000000000000000000000000000000000000000000001 +``` + +`p` が `1` よりも一つ分だけ大きいのがわかるだろうか (ここでは `binary64` の具体的な表現について言及していないのでそうなる保証はないのだが、あくまで雰囲気として)。 + +では、任意の値が与えられた際、それに対応する右端を得るにはどうすればよいのだろうか。 +IEEE 754 にはこのような用途に用いることができる `nextUp` という操作が定められている。 + +`nextUp` は、`binary64` で表現できる値のうち、与えられた数よりも一つだけ大きい値を返す演算である。 +これを使えば、ある数 `x` が与えられたとき、`[x, nextUp(x))` という半開区間を作ればちょうど `x` だけを含むような範囲を表すことができる。 + + +{#nextup-in-php} +# PHP で nextUp を実装する + +プログラミング言語によっては標準ライブラリに `nextUp` 相当の操作が定められているものもある。 +PHP には無かったので自作した。 + +* GitHub: https://github.com/nsfisis/php-next-after +* Packagist: https://packagist.org/packages/nsfisis/next-after + +`binary64` を 64 bit の整数に変換できるなら、他の言語でもほとんど同じ方法で実装できるはずだ。 + +```php + public static function nextUp(float $x): float + { + // NaN (Not a Number) なら NaN を返す。 + if (is_nan($x)) { + return NAN; + } + // 正の無限大なら正の無限大を返す。 + if (is_infinite($x) && $x > 0) { + return INF; + } + // 0 なら minValue() を返す (後述)。 + if ($x === 0.0) { + return self::minValue(); + } + // binary64 を 64 bit 整数に変換する。 + $u = self::floatToInt($x); + // 正なら整数に +1 して binary64 に戻す。 + // 負なら整数に -1 して binary64 に戻す。 + return $x > 0.0 ? self::intToFloat($u + 1) : self::intToFloat($u - 1); + } +``` + +`0` のときに返している `minValue()` は次のような値である。 + +```php + public static function minValue(): float + { + // 整数の 1 を binary64 と解釈した値を返す。 + // binary64 で表せる最小の正の非正規化数。 + return self::intToFloat(1); + } +``` + +{#outro} +# おわりに + +頻繁に必要になるようなものではないが、いつか誰かを救えれば幸いである。 diff --git a/services/blog/nuldoc.toml b/services/blog/nuldoc.toml index 351155c8..45633eef 100644 --- a/services/blog/nuldoc.toml +++ b/services/blog/nuldoc.toml @@ -21,6 +21,7 @@ composer = "Composer" conference = "カンファレンス" cpp = "C++" cpp17 = "C++ 17" +float = "浮動小数点数" game = "ゲーム" gitlab = "GitLab" go = "Go" diff --git a/services/blog/public/atom.xml b/services/blog/public/atom.xml index 7af0f350..e4fee046 100644 --- a/services/blog/public/atom.xml +++ b/services/blog/public/atom.xml @@ -7,7 +7,15 @@ <author> <name>nsfisis</name> </author> - <updated>2025-10-29T00:00:00+09:00</updated> + <updated>2025-10-31T00:00:00+09:00</updated> + <entry> + <id>urn:uuid:39d3d137-f18d-4d88-8ef6-7be9cc2f3f0b</id> + <link rel="alternate" href="https://blog.nsfisis.dev/posts/2025-10-31/representing-single-value-with-half-open-float-interval/"></link> + <title>浮動小数点数の半開区間で単一値を表現する</title> + <summary>IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。</summary> + <published>2025-10-31T00:00:00+09:00</published> + <updated>2025-10-31T00:00:00+09:00</updated> + </entry> <entry> <id>urn:uuid:cc51db2d-4f53-4c9c-8930-056e4029e9e0</id> <link rel="alternate" href="https://blog.nsfisis.dev/slides/2025-10-29/phpstudy-tokyo-180/"></link> diff --git a/services/blog/public/posts/2/index.html b/services/blog/public/posts/2/index.html index dd63537a..5d60779f 100644 --- a/services/blog/public/posts/2/index.html +++ b/services/blog/public/posts/2/index.html @@ -67,6 +67,35 @@ </div> </nav> <article class="post-entry"> + <a href="/posts/2025-01-08/phperkaigi-2023-tokens-q1/"> + <header class="entry-header"> + <h2>PHPerKaigi 2023 トークン問題解説 (1/5)</h2> + </header> + <section class="entry-content"> + <p> + PHPerKaigi 2023 でデジタルサーカス株式会社から出題した問題を解説する。全5問中の第1問。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2025-01-08">2025-01-08</time> 投稿、<time datetime="2025-01-11">2025-01-11</time> 更新 + <ul class="entry-tags"> + <li class="tag"> + カンファレンス + </li> + <li class="tag"> + PHP + </li> + <li class="tag"> + PHPerKaigi + </li> + <li class="tag"> + Piet + </li> + </ul> + </footer> + </a> + </article> + <article class="post-entry"> <a href="/posts/2024-12-33/2024-reflections/"> <header class="entry-header"> <h2>2024年の振り返り</h2> @@ -268,32 +297,6 @@ </footer> </a> </article> - <article class="post-entry"> - <a href="/posts/2024-04-14/phpcon-odawara-2024-report/"> - <header class="entry-header"> - <h2>PHP カンファレンス小田原 2024 参加レポ</h2> - </header> - <section class="entry-content"> - <p> - 2024-04-13 に開催された、PHP カンファレンス小田原 2024 に参加した。 - </p> - </section> - <footer class="entry-footer"> - <time datetime="2024-04-14">2024-04-14</time> 投稿、<time datetime="2024-06-01">2024-06-01</time> 更新 - <ul class="entry-tags"> - <li class="tag"> - カンファレンス - </li> - <li class="tag"> - PHP - </li> - <li class="tag"> - PHP カンファレンス小田原 - </li> - </ul> - </footer> - </a> - </article> <nav class="pagination"> <div class="pagination-prev"> <a href="/posts/">前へ</a> diff --git a/services/blog/public/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html b/services/blog/public/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html new file mode 100644 index 00000000..8288a80d --- /dev/null +++ b/services/blog/public/posts/2025-10-31/representing-single-value-with-half-open-float-interval/index.html @@ -0,0 +1,231 @@ +<!DOCTYPE html> +<html lang="ja-JP"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="author" content="nsfisis"> + <meta name="copyright" content="© 2025 nsfisis"> + <meta name="description" content="IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。"> + <meta name="keywords" content="浮動小数点数,PHP"> + <meta property="og:type" content="article"> + <meta property="og:title" content="浮動小数点数の半開区間で単一値を表現する|REPL: Rest-Eat-Program Loop"> + <meta property="og:description" content="IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。"> + <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop"> + <meta property="og:locale" content="ja_JP"> + <meta name="Hatena::Bookmark" content="nocomment"> + <link rel="icon" type="image/svg+xml" href="/favicon.svg"> + <title>浮動小数点数の半開区間で単一値を表現する|REPL: Rest-Eat-Program Loop</title> + <link rel="stylesheet" href="/style.css?h=d2f027875115279303f9fe391e2ef61b"> + </head> + <body class="single"> + <header class="header"> + <div class="site-logo"> + <a href="/">REPL: Rest-Eat-Program Loop</a> + </div> + <nav class="nav"> + <ul> + <li> + <a href="/about/">About</a> + </li> + <li> + <a href="/posts/">Posts</a> + </li> + <li> + <a href="/slides/">Slides</a> + </li> + <li> + <a href="/tags/">Tags</a> + </li> + </ul> + </nav> + </header> + <main class="main"> + <article class="post-single"> + <header class="post-header"> + <h1 class="post-title">浮動小数点数の半開区間で単一値を表現する</h1> + <ul class="post-tags"> + <li class="tag"> + <a href="/tags/float/">浮動小数点数</a> + </li> + <li class="tag"> + <a href="/tags/php/">PHP</a> + </li> + </ul> + </header> + <nav class="toc"> + <h2>目次</h2> + <ul> + <li> + <a href="#section--intro">はじめに</a> + </li> + <li> + <a href="#section--half-open-real-interval">実数の半開区間</a> + </li> + <li> + <a href="#section--float-numbers">コンピュータにおける実数表現</a> + </li> + <li> + <a href="#section--single-value-float-interval">浮動小数点数で単一値を指す半開区間を作る</a> + </li> + <li> + <a href="#section--nextup-in-php">PHP で nextUp を実装する</a> + </li> + <li> + <a href="#section--outro">おわりに</a> + </li> + </ul> + </nav> + <div class="post-content"> + <section id="changelog"> + <h2><a href="#changelog">更新履歴</a></h2> + <ol> + <li class="revision"> + <time datetime="2025-01-23">2025-01-23</time>: デジタルサーカス株式会社の社内記事として公開 + </li> + <li class="revision"> + <time datetime="2025-10-29">2025-10-29</time>: PHP 勉強会@東京 第 180 回で発表 + </li> + <li class="revision"> + <time datetime="2025-10-31">2025-10-31</time>: 公開 + </li> + </ol> + </section> + <div class="admonition"> + <div class="admonition-label"> + NOTE + </div> + <div class="admonition-content"> + <p> + この記事は、2025-01-23 に <a href="https://www.dgcircus.com/" rel="noreferrer" target="_blank">デジタルサーカス株式会社</a> の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。 + </p> + </div> + </div> + <div class="admonition"> + <div class="admonition-label"> + NOTE + </div> + <div class="admonition-content"> + <p> + この記事の内容を、<a href="/slides/2025-10-29/phpstudy-tokyo-180/">PHP 勉強会@東京 第 180 回</a> で発表しました。 + </p> + </div> + </div> + <section id="section--intro"> + <h2><a href="#section--intro">はじめに</a></h2> + <p> + 数値の範囲を指定して検索をおこなう API の中に、半開区間を指定させるものがある。半開区間とは、一方の端を含み一方の端を含まないような区間である。ここでは特に左端が閉じ右端が開いているような区間を扱う。例えば、次の区間 <code>[3, 7)</code> は <code>3 <= x < 7</code> であるような <code>x</code> の集合である。 + </p> + <p> + ここで、この API を使って単一の値を検索することを考えたい。検索対象が整数であれば話は簡単で、1 大きい数を右端に指定してやればよい。5 を探したければ <code>[5, 6)</code> を渡せば目的が達成できる。 + </p> + <p> + しかし、検索の対象が実数であればどうだろうか? + </p> + </section> + <section id="section--half-open-real-interval"> + <h2><a href="#section--half-open-real-interval">実数の半開区間</a></h2> + <p> + ちょうど <code>1</code> だけを含むような半開区間が作れないか考えよう。つまり、左端に <code>1</code> を、右端に <code>1</code> より少しだけ大きい値を指定して、「ちょうど <code>1</code>」を表すような範囲を作れないだろうか。 + </p> + <p> + お気付きの方もいるだろうがこれは不可能である。もしそのような区間が作れるなら、<code>[1, p)</code> にちょうど <code>1</code> しか含まれないような実数 <code>p</code> が存在する。しかし、<code>1</code> と <code>p</code> のちょうど真ん中である <code>(1+p) / 2</code> を考えると、<code>1</code> よりも大きく <code>p</code> よりも小さいから <code>[1, p)</code> に含まれる。これは <code>[1, p)</code> が <code>1</code> しか含まないとした仮定に矛盾する。 + </p> + <p> + 数学の世界ではこのような区間を作ることはできない。では、コンピュータ上ならばどうだろうか? + </p> + </section> + <section id="section--float-numbers"> + <h2><a href="#section--float-numbers">コンピュータにおける実数表現</a></h2> + <p> + コンピュータにおける実数の表現にはさまざまなものがあるが、ここでは最もよく使われる IEEE 754 という標準規格に従う形式、その中でも <code>binary64</code> と呼ばれる形式を考えることにする。これは多くの言語で <code>float</code> や <code>double</code> と呼ばれるものと同じである。 + </p> + <p> + <code>binary64</code> は 64 bit で構成されており、無限個ある実数をすべて覆い尽くすことはできない。数学の上では存在しなかった <code>p</code> も、<code>binary64</code> の範囲に実数を限定すれば都合のよい <code>p</code> を見つけることができる。 + </p> + </section> + <section id="section--single-value-float-interval"> + <h2><a href="#section--single-value-float-interval">浮動小数点数で単一値を指す半開区間を作る</a></h2> + <p> + 結論から言うと、<code>p</code> は <code>1.0000000000000002</code> である。<code>[1, 1.0000000000000002)</code> は <code>binary64</code> の範囲で <code>1</code> しか含まない。別の言い方をすれば、<code>1 < x < 1.0000000000000002</code> を満たすような <code>x</code> は、<code>binary64</code> で表せない。 + </p> + <p> + <code>1</code> と <code>p</code> のビット列での表現を見てみよう。 + </p> + <div class="codeblock"> + <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span>1 = 0011111111110000000000000000000000000000000000000000000000000000</span></span> +<span class="line"><span>p = 0011111111110000000000000000000000000000000000000000000000000001</span></span></code></pre> + </div> + <p> + <code>p</code> が <code>1</code> よりも一つ分だけ大きいのがわかるだろうか (ここでは <code>binary64</code> の具体的な表現について言及していないのでそうなる保証はないのだが、あくまで雰囲気として)。 + </p> + <p> + では、任意の値が与えられた際、それに対応する右端を得るにはどうすればよいのだろうか。IEEE 754 にはこのような用途に用いることができる <code>nextUp</code> という操作が定められている。 + </p> + <p> + <code>nextUp</code> は、<code>binary64</code> で表現できる値のうち、与えられた数よりも一つだけ大きい値を返す演算である。これを使えば、ある数 <code>x</code> が与えられたとき、<code>[x, nextUp(x))</code> という半開区間を作ればちょうど <code>x</code> だけを含むような範囲を表すことができる。 + </p> + </section> + <section id="section--nextup-in-php"> + <h2><a href="#section--nextup-in-php">PHP で nextUp を実装する</a></h2> + <p> + プログラミング言語によっては標準ライブラリに <code>nextUp</code> 相当の操作が定められているものもある。PHP には無かったので自作した。 + </p> + <ul> + <li> + GitHub: <a class="url" href="https://github.com/nsfisis/php-next-after" rel="noreferrer" target="_blank">https://github.com/nsfisis/php-next-after</a> + </li> + <li> + Packagist: <a class="url" href="https://packagist.org/packages/nsfisis/next-after" rel="noreferrer" target="_blank">https://packagist.org/packages/nsfisis/next-after</a> + </li> + </ul> + <p> + <code>binary64</code> を 64 bit の整数に変換できるなら、他の言語でもほとんど同じ方法で実装できるはずだ。 + </p> + <div class="codeblock"> + <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"> public</span><span style="color:#D73A49"> static</span><span style="color:#D73A49"> function</span><span style="color:#6F42C1"> nextUp</span><span style="color:#24292E">(</span><span style="color:#D73A49">float</span><span style="color:#24292E"> $x)</span><span style="color:#D73A49">:</span><span style="color:#D73A49"> float</span></span> +<span class="line"><span style="color:#24292E"> {</span></span> +<span class="line"><span style="color:#6A737D"> // NaN (Not a Number) なら NaN を返す。</span></span> +<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> (</span><span style="color:#005CC5">is_nan</span><span style="color:#24292E">($x)) {</span></span> +<span class="line"><span style="color:#D73A49"> return</span><span style="color:#005CC5"> NAN</span><span style="color:#24292E">;</span></span> +<span class="line"><span style="color:#24292E"> }</span></span> +<span class="line"><span style="color:#6A737D"> // 正の無限大なら正の無限大を返す。</span></span> +<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> (</span><span style="color:#005CC5">is_infinite</span><span style="color:#24292E">($x) </span><span style="color:#D73A49">&&</span><span style="color:#24292E"> $x </span><span style="color:#D73A49">></span><span style="color:#005CC5"> 0</span><span style="color:#24292E">) {</span></span> +<span class="line"><span style="color:#D73A49"> return</span><span style="color:#005CC5"> INF</span><span style="color:#24292E">;</span></span> +<span class="line"><span style="color:#24292E"> }</span></span> +<span class="line"><span style="color:#6A737D"> // 0 なら minValue() を返す (後述)。</span></span> +<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> ($x </span><span style="color:#D73A49">===</span><span style="color:#005CC5"> 0.0</span><span style="color:#24292E">) {</span></span> +<span class="line"><span style="color:#D73A49"> return</span><span style="color:#D73A49"> self::</span><span style="color:#6F42C1">minValue</span><span style="color:#24292E">();</span></span> +<span class="line"><span style="color:#24292E"> }</span></span> +<span class="line"><span style="color:#6A737D"> // binary64 を 64 bit 整数に変換する。</span></span> +<span class="line"><span style="color:#24292E"> $u </span><span style="color:#D73A49">=</span><span style="color:#D73A49"> self::</span><span style="color:#6F42C1">floatToInt</span><span style="color:#24292E">($x);</span></span> +<span class="line"><span style="color:#6A737D"> // 正なら整数に +1 して binary64 に戻す。</span></span> +<span class="line"><span style="color:#6A737D"> // 負なら整数に -1 して binary64 に戻す。</span></span> +<span class="line"><span style="color:#D73A49"> return</span><span style="color:#24292E"> $x </span><span style="color:#D73A49">></span><span style="color:#005CC5"> 0.0</span><span style="color:#D73A49"> ?</span><span style="color:#D73A49"> self::</span><span style="color:#6F42C1">intToFloat</span><span style="color:#24292E">($u </span><span style="color:#D73A49">+</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">) </span><span style="color:#D73A49">:</span><span style="color:#D73A49"> self::</span><span style="color:#6F42C1">intToFloat</span><span style="color:#24292E">($u </span><span style="color:#D73A49">-</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">);</span></span> +<span class="line"><span style="color:#24292E"> }</span></span></code></pre> + </div> + <p> + <code>0</code> のときに返している <code>minValue()</code> は次のような値である。 + </p> + <div class="codeblock"> + <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"> public</span><span style="color:#D73A49"> static</span><span style="color:#D73A49"> function</span><span style="color:#6F42C1"> minValue</span><span style="color:#24292E">()</span><span style="color:#D73A49">:</span><span style="color:#D73A49"> float</span></span> +<span class="line"><span style="color:#24292E"> {</span></span> +<span class="line"><span style="color:#6A737D"> // 整数の 1 を binary64 と解釈した値を返す。</span></span> +<span class="line"><span style="color:#6A737D"> // binary64 で表せる最小の正の非正規化数。</span></span> +<span class="line"><span style="color:#D73A49"> return</span><span style="color:#D73A49"> self::</span><span style="color:#6F42C1">intToFloat</span><span style="color:#24292E">(</span><span style="color:#005CC5">1</span><span style="color:#24292E">);</span></span> +<span class="line"><span style="color:#24292E"> }</span></span></code></pre> + </div> + </section> + <section id="section--outro"> + <h2><a href="#section--outro">おわりに</a></h2> + <p> + 頻繁に必要になるようなものではないが、いつか誰かを救えれば幸いである。 + </p> + </section> + </div> + </article> + </main> + <footer class="footer"> + © 2021 nsfisis + </footer> + </body> +</html> diff --git a/services/blog/public/posts/3/index.html b/services/blog/public/posts/3/index.html index 05159771..cee3b675 100644 --- a/services/blog/public/posts/3/index.html +++ b/services/blog/public/posts/3/index.html @@ -70,6 +70,32 @@ </div> </nav> <article class="post-entry"> + <a href="/posts/2024-04-14/phpcon-odawara-2024-report/"> + <header class="entry-header"> + <h2>PHP カンファレンス小田原 2024 参加レポ</h2> + </header> + <section class="entry-content"> + <p> + 2024-04-13 に開催された、PHP カンファレンス小田原 2024 に参加した。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2024-04-14">2024-04-14</time> 投稿、<time datetime="2024-06-01">2024-06-01</time> 更新 + <ul class="entry-tags"> + <li class="tag"> + カンファレンス + </li> + <li class="tag"> + PHP + </li> + <li class="tag"> + PHP カンファレンス小田原 + </li> + </ul> + </footer> + </a> + </article> + <article class="post-entry"> <a href="/posts/2024-03-20/my-bucket-list/"> <header class="entry-header"> <h2>死ぬまでに作る自作○○一覧あるいは人生の TODO リスト</h2> @@ -263,29 +289,6 @@ </footer> </a> </article> - <article class="post-entry"> - <a href="/posts/2023-10-02/compile-php-runtime-to-wasm/"> - <header class="entry-header"> - <h2>PHP の処理系を Emscripten で WebAssembly にコンパイルする</h2> - </header> - <section class="entry-content"> - <p> - PHP の処理系 (php/php-src) を Emscripten で WebAssembly にコンパイルし、任意のコードを隔離された環境で評価できるようにした。 - </p> - </section> - <footer class="entry-footer"> - <time datetime="2023-10-02">2023-10-02</time> 投稿、<time datetime="2025-04-23">2025-04-23</time> 更新 - <ul class="entry-tags"> - <li class="tag"> - PHP - </li> - <li class="tag"> - WebAssembly - </li> - </ul> - </footer> - </a> - </article> <nav class="pagination"> <div class="pagination-prev"> <a href="/posts/2/">前へ</a> diff --git a/services/blog/public/posts/4/index.html b/services/blog/public/posts/4/index.html index 3e05fe29..c10cbabc 100644 --- a/services/blog/public/posts/4/index.html +++ b/services/blog/public/posts/4/index.html @@ -70,6 +70,29 @@ </div> </nav> <article class="post-entry"> + <a href="/posts/2023-10-02/compile-php-runtime-to-wasm/"> + <header class="entry-header"> + <h2>PHP の処理系を Emscripten で WebAssembly にコンパイルする</h2> + </header> + <section class="entry-content"> + <p> + PHP の処理系 (php/php-src) を Emscripten で WebAssembly にコンパイルし、任意のコードを隔離された環境で評価できるようにした。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2023-10-02">2023-10-02</time> 投稿、<time datetime="2025-04-23">2025-04-23</time> 更新 + <ul class="entry-tags"> + <li class="tag"> + PHP + </li> + <li class="tag"> + WebAssembly + </li> + </ul> + </footer> + </a> + </article> + <article class="post-entry"> <a href="/posts/2023-06-25/phpconfuk-2023-report/"> <header class="entry-header"> <h2>PHP カンファレンス福岡 2023 参加レポ</h2> @@ -260,21 +283,6 @@ </footer> </a> </article> - <article class="post-entry"> - <a href="/posts/2022-08-31/support-for-communty-is-employee-benefits/"> - <header class="entry-header"> - <h2>弊社の PHP Foundation への寄付に寄せて</h2> - </header> - <section class="entry-content"> - <p> - 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。 - </p> - </section> - <footer class="entry-footer"> - <time datetime="2022-08-31">2022-08-31</time> 投稿 - </footer> - </a> - </article> <nav class="pagination"> <div class="pagination-prev"> <a href="/posts/3/">前へ</a> diff --git a/services/blog/public/posts/5/index.html b/services/blog/public/posts/5/index.html index 982088c8..0976a571 100644 --- a/services/blog/public/posts/5/index.html +++ b/services/blog/public/posts/5/index.html @@ -67,6 +67,21 @@ </div> </nav> <article class="post-entry"> + <a href="/posts/2022-08-31/support-for-communty-is-employee-benefits/"> + <header class="entry-header"> + <h2>弊社の PHP Foundation への寄付に寄せて</h2> + </header> + <section class="entry-content"> + <p> + 先日、私の勤めるデジタルサーカス株式会社が、PHP Foundation へ寄付をおこないました。本件を社内でしつこく推進した1人として、推進の理由等を書き残しておきます。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2022-08-31">2022-08-31</time> 投稿 + </footer> + </a> + </article> + <article class="post-entry"> <a href="/posts/2022-08-27/php-conference-okinawa-code-golf/"> <header class="entry-header"> <h2>PHP カンファレンス沖縄で出題されたコードゴルフの問題を解いてみた</h2> @@ -268,26 +283,6 @@ </footer> </a> </article> - <article class="post-entry"> - <a href="/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/"> - <header class="entry-header"> - <h2>【Vim】 autocmd events の BufWrite/BufWritePre の違い</h2> - </header> - <section class="entry-content"> - <p> - Vim の autocmd events における BufWrite/BufWritePre がどう違うのかを調べた結果、違いはないことがわかった。 - </p> - </section> - <footer class="entry-footer"> - <time datetime="2021-10-02">2021-10-02</time> 投稿 - <ul class="entry-tags"> - <li class="tag"> - Vim - </li> - </ul> - </footer> - </a> - </article> <nav class="pagination"> <div class="pagination-prev"> <a href="/posts/4/">前へ</a> diff --git a/services/blog/public/posts/6/index.html b/services/blog/public/posts/6/index.html index 920bebc0..e490fcef 100644 --- a/services/blog/public/posts/6/index.html +++ b/services/blog/public/posts/6/index.html @@ -63,6 +63,26 @@ </div> </nav> <article class="post-entry"> + <a href="/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/"> + <header class="entry-header"> + <h2>【Vim】 autocmd events の BufWrite/BufWritePre の違い</h2> + </header> + <section class="entry-content"> + <p> + Vim の autocmd events における BufWrite/BufWritePre がどう違うのかを調べた結果、違いはないことがわかった。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2021-10-02">2021-10-02</time> 投稿 + <ul class="entry-tags"> + <li class="tag"> + Vim + </li> + </ul> + </footer> + </a> + </article> + <article class="post-entry"> <a href="/posts/2021-10-02/vim-swap-order-of-selected-lines/"> <header class="entry-header"> <h2>Vimで選択した行の順番を入れ替える</h2> diff --git a/services/blog/public/posts/atom.xml b/services/blog/public/posts/atom.xml index f153f574..fdc33730 100644 --- a/services/blog/public/posts/atom.xml +++ b/services/blog/public/posts/atom.xml @@ -7,7 +7,15 @@ <author> <name>nsfisis</name> </author> - <updated>2025-07-15T00:00:00+09:00</updated> + <updated>2025-10-31T00:00:00+09:00</updated> + <entry> + <id>urn:uuid:39d3d137-f18d-4d88-8ef6-7be9cc2f3f0b</id> + <link rel="alternate" href="https://blog.nsfisis.dev/posts/2025-10-31/representing-single-value-with-half-open-float-interval/"></link> + <title>浮動小数点数の半開区間で単一値を表現する</title> + <summary>IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。</summary> + <published>2025-10-31T00:00:00+09:00</published> + <updated>2025-10-31T00:00:00+09:00</updated> + </entry> <entry> <id>urn:uuid:427a124c-fce3-4a1c-a388-5c9827e34957</id> <link rel="alternate" href="https://blog.nsfisis.dev/posts/2025-07-15/partial-surrender-to-ebooks/"></link> diff --git a/services/blog/public/posts/index.html b/services/blog/public/posts/index.html index c7e0a5be..788129dc 100644 --- a/services/blog/public/posts/index.html +++ b/services/blog/public/posts/index.html @@ -63,6 +63,29 @@ </div> </nav> <article class="post-entry"> + <a href="/posts/2025-10-31/representing-single-value-with-half-open-float-interval/"> + <header class="entry-header"> + <h2>浮動小数点数の半開区間で単一値を表現する</h2> + </header> + <section class="entry-content"> + <p> + IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2025-10-31">2025-10-31</time> 投稿 + <ul class="entry-tags"> + <li class="tag"> + 浮動小数点数 + </li> + <li class="tag"> + PHP + </li> + </ul> + </footer> + </a> + </article> + <article class="post-entry"> <a href="/posts/2025-07-15/partial-surrender-to-ebooks/"> <header class="entry-header"> <h2>電子書籍への部分的降伏</h2> @@ -258,35 +281,6 @@ </footer> </a> </article> - <article class="post-entry"> - <a href="/posts/2025-01-08/phperkaigi-2023-tokens-q1/"> - <header class="entry-header"> - <h2>PHPerKaigi 2023 トークン問題解説 (1/5)</h2> - </header> - <section class="entry-content"> - <p> - PHPerKaigi 2023 でデジタルサーカス株式会社から出題した問題を解説する。全5問中の第1問。 - </p> - </section> - <footer class="entry-footer"> - <time datetime="2025-01-08">2025-01-08</time> 投稿、<time datetime="2025-01-11">2025-01-11</time> 更新 - <ul class="entry-tags"> - <li class="tag"> - カンファレンス - </li> - <li class="tag"> - PHP - </li> - <li class="tag"> - PHPerKaigi - </li> - <li class="tag"> - Piet - </li> - </ul> - </footer> - </a> - </article> <nav class="pagination"> <div class="pagination-prev"> </div> diff --git a/services/blog/public/tags/float/atom.xml b/services/blog/public/tags/float/atom.xml new file mode 100644 index 00000000..b0d857bb --- /dev/null +++ b/services/blog/public/tags/float/atom.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + <id>tag:blog.nsfisis.dev,2021:tag-float</id> + <title>タグ「浮動小数点数」一覧|REPL: Rest-Eat-Program Loop</title> + <link rel="alternate" href="https://blog.nsfisis.dev/tags/float/"></link> + <link rel="self" href="https://blog.nsfisis.dev/tags/float/atom.xml"></link> + <author> + <name>nsfisis</name> + </author> + <updated>2025-10-31T00:00:00+09:00</updated> + <entry> + <id>urn:uuid:39d3d137-f18d-4d88-8ef6-7be9cc2f3f0b</id> + <link rel="alternate" href="https://blog.nsfisis.dev/posts/2025-10-31/representing-single-value-with-half-open-float-interval/"></link> + <title>浮動小数点数の半開区間で単一値を表現する</title> + <summary>IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。</summary> + <published>2025-10-31T00:00:00+09:00</published> + <updated>2025-10-31T00:00:00+09:00</updated> + </entry> +</feed> diff --git a/services/blog/public/tags/float/index.html b/services/blog/public/tags/float/index.html new file mode 100644 index 00000000..84535e49 --- /dev/null +++ b/services/blog/public/tags/float/index.html @@ -0,0 +1,75 @@ +<!DOCTYPE html> +<html lang="ja-JP"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="author" content="nsfisis"> + <meta name="copyright" content="© 2025 nsfisis"> + <meta name="description" content="タグ「浮動小数点数」のついた記事またはスライドの一覧"> + <meta name="keywords" content="浮動小数点数"> + <meta property="og:type" content="article"> + <meta property="og:title" content="タグ「浮動小数点数」一覧|REPL: Rest-Eat-Program Loop"> + <meta property="og:description" content="タグ「浮動小数点数」のついた記事またはスライドの一覧"> + <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop"> + <meta property="og:locale" content="ja_JP"> + <meta name="Hatena::Bookmark" content="nocomment"> + <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/float/atom.xml"> + <link rel="icon" type="image/svg+xml" href="/favicon.svg"> + <title>タグ「浮動小数点数」一覧|REPL: Rest-Eat-Program Loop</title> + <link rel="stylesheet" href="/style.css?h=d2f027875115279303f9fe391e2ef61b"> + </head> + <body class="list"> + <header class="header"> + <div class="site-logo"> + <a href="/">REPL: Rest-Eat-Program Loop</a> + </div> + <nav class="nav"> + <ul> + <li> + <a href="/about/">About</a> + </li> + <li> + <a href="/posts/">Posts</a> + </li> + <li> + <a href="/slides/">Slides</a> + </li> + <li> + <a href="/tags/">Tags</a> + </li> + </ul> + </nav> + </header> + <main class="main"> + <header class="page-header"> + <h1>タグ「浮動小数点数」一覧</h1> + </header> + <article class="post-entry"> + <a href="/posts/2025-10-31/representing-single-value-with-half-open-float-interval/"> + <header class="entry-header"> + <h2>浮動小数点数の半開区間で単一値を表現する</h2> + </header> + <section class="entry-content"> + <p> + IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2025-10-31">2025-10-31</time> 投稿 + <ul class="entry-tags"> + <li class="tag"> + 浮動小数点数 + </li> + <li class="tag"> + PHP + </li> + </ul> + </footer> + </a> + </article> + </main> + <footer class="footer"> + © 2021 nsfisis + </footer> + </body> +</html> diff --git a/services/blog/public/tags/index.html b/services/blog/public/tags/index.html index 9840355a..46aa60c8 100644 --- a/services/blog/public/tags/index.html +++ b/services/blog/public/tags/index.html @@ -113,6 +113,16 @@ </a> </article> <article class="post-entry"> + <a href="/tags/float/"> + <header class="entry-header"> + <h2>浮動小数点数</h2> + </header> + <footer class="entry-footer"> + 1件の記事 + </footer> + </a> + </article> + <article class="post-entry"> <a href="/tags/game/"> <header class="entry-header"> <h2>ゲーム</h2> @@ -228,7 +238,7 @@ <h2>PHP</h2> </header> <footer class="entry-footer"> - 21件の記事、22件のスライド + 22件の記事、22件のスライド </footer> </a> </article> diff --git a/services/blog/public/tags/php/atom.xml b/services/blog/public/tags/php/atom.xml index dc98f500..8bc41c13 100644 --- a/services/blog/public/tags/php/atom.xml +++ b/services/blog/public/tags/php/atom.xml @@ -7,7 +7,15 @@ <author> <name>nsfisis</name> </author> - <updated>2025-10-29T00:00:00+09:00</updated> + <updated>2025-10-31T00:00:00+09:00</updated> + <entry> + <id>urn:uuid:39d3d137-f18d-4d88-8ef6-7be9cc2f3f0b</id> + <link rel="alternate" href="https://blog.nsfisis.dev/posts/2025-10-31/representing-single-value-with-half-open-float-interval/"></link> + <title>浮動小数点数の半開区間で単一値を表現する</title> + <summary>IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。</summary> + <published>2025-10-31T00:00:00+09:00</published> + <updated>2025-10-31T00:00:00+09:00</updated> + </entry> <entry> <id>urn:uuid:cc51db2d-4f53-4c9c-8930-056e4029e9e0</id> <link rel="alternate" href="https://blog.nsfisis.dev/slides/2025-10-29/phpstudy-tokyo-180/"></link> diff --git a/services/blog/public/tags/php/index.html b/services/blog/public/tags/php/index.html index 95834818..30a44a7d 100644 --- a/services/blog/public/tags/php/index.html +++ b/services/blog/public/tags/php/index.html @@ -45,6 +45,29 @@ <h1>タグ「PHP」一覧</h1> </header> <article class="post-entry"> + <a href="/posts/2025-10-31/representing-single-value-with-half-open-float-interval/"> + <header class="entry-header"> + <h2>浮動小数点数の半開区間で単一値を表現する</h2> + </header> + <section class="entry-content"> + <p> + IEEE 754 の nextUp 操作を用いて,浮動小数点数の半開区間で単一値を指定するテクニックを紹介する。 + </p> + </section> + <footer class="entry-footer"> + <time datetime="2025-10-31">2025-10-31</time> 投稿 + <ul class="entry-tags"> + <li class="tag"> + 浮動小数点数 + </li> + <li class="tag"> + PHP + </li> + </ul> + </footer> + </a> + </article> + <article class="post-entry"> <a href="/slides/2025-10-29/phpstudy-tokyo-180/"> <header class="entry-header"> <h2>登壇: PHP 勉強会@東京 第180回 (レギュラートーク (20分))</h2> |
