|
189 | 189 | <p class="text-right"><small> |
190 | 190 | 最終更新日時: |
191 | 191 | <time itemprop="datePublished" class="js-local-time" |
192 | | - datetime="2026-08-08T22:18:00+09:00"> |
193 | | - 2026年08月08日 22時18分00秒 (JST) |
| 192 | + datetime="2026-09-02T11:57:54+09:00"> |
| 193 | + 2026年09月02日 11時57分54秒 (JST) |
194 | 194 | </time> |
195 | 195 | <br/> |
196 | 196 | <span itemprop="author" itemscope itemtype="http://schema.org/Person"> |
197 | | - <span itemprop="name">rotarymars</span> |
| 197 | + <span itemprop="name">Akira Takahashi</span> |
198 | 198 | </span> |
199 | 199 | が更新 |
200 | 200 | </small></p> |
@@ -372,7 +372,11 @@ <h2>効果</h2> |
372 | 372 | </li> |
373 | 373 | <li> |
374 | 374 | <p>(2), (3), (4), (5) : Cロケールで<code>printf</code>によって行われたかのように浮動小数点数を文字列へ変換する。<br /> |
375 | | - フォーマット指定子は<code>%f,%e</code>どちらかを出力文字列が最も短くなるように(両者が同じなら<code>%f</code>が優先)選択する。</p> |
| 375 | + フォーマット指定子は以下のように選択する。</p> |
| 376 | +<ul> |
| 377 | +<li>C++17 : <code>%f</code>, <code>%e</code>のどちらかを、出力文字列が最も短くなるように選択する(両者が同じなら<code>%f</code>が優先)</li> |
| 378 | +<li>C++29 : 浮動小数点数型を<code>T</code>として、<code>value</code>の絶対値が<code>[l, u)</code>の範囲にあれば<code>%f</code>、そうでなければ<code>%e</code>を選択する。<code>l</code>は10<sup>-4</sup>に対応する<code>T</code>の値、<code>u</code>は<code><a href="../limits/numeric_limits/radix.html">std::numeric_limits<T>::radix</a></code>の<code><a href="../limits/numeric_limits/digits.html">std::numeric_limits<T>::digits</a>+ 1</code>乗を10の累乗へ切り下げた値に対応する<code>T</code>の値である</li> |
| 379 | +</ul> |
376 | 380 | </li> |
377 | 381 | <li> |
378 | 382 | <p>(6), (7), (8), (9) : <code>fmt</code>によって指定されたフォーマット指定子を用いて、Cロケールで<code>printf</code>によって行われたかのように浮動小数点数を文字列へ変換する。<br /> |
@@ -416,6 +420,23 @@ <h2>備考</h2> |
416 | 420 | <li>MSVCでは浮動小数点数→10進文字列変換の実装に<a href="https://github.com/ulfjack/ryu" target="_blank">Ryu</a>というアルゴリズムを利用している。</li> |
417 | 421 | <li>(1) : 実装によって全ての整数型(符号付、無し)および<code>char</code>の<a class="cpprefjp-defined-word" data-desc="同名の関数を異なる引数・テンプレート・制約などで複数定義すること。または同名の関数の集合">オーバーロード</a>が提供される</li> |
418 | 422 | <li>(5), (9), (13) : 浮動小数点数型は<a class="cpprefjp-defined-word" data-desc="<stdfloat>で定義される内部表現の規定された浮動小数点数型" href="../stdfloat.html">拡張浮動小数点数型</a>を含む</li> |
| 423 | +<li>(2), (3), (4), (5) :<ul> |
| 424 | +<li>C++29での<code>[l, u)</code>は、<code>double</code>では<code>[10</code><sup><code>-4</code></sup><code>, 10</code><sup><code>16</code></sup><code>)</code>、<code>float</code>では<code>[10</code><sup><code>-4</code></sup><code>, 10</code><sup><code>7</code></sup><code>)</code>となる</li> |
| 425 | +<li>C++17の規則では出力文字列の長さで指定子を選択するため、値が近くても表記が大きく変わることがあった。C++29ではPythonやRustなど他言語と同様に値の範囲で選択するため、この不整合が解消される<ul> |
| 426 | +<li><code>100000.0</code>の変換結果<ul> |
| 427 | +<li>C++17 : <code>1e+05</code></li> |
| 428 | +<li>C++29 : <code>100000</code>(<code>120000.0</code>はどちらのバージョンでも<code>120000</code>であり、近い値どうしで表記が食い違わなくなる)</li> |
| 429 | +</ul> |
| 430 | +</li> |
| 431 | +<li><code>1234567890123456700000.0</code>の変換結果<ul> |
| 432 | +<li>C++17 : <code>1234567890123456774144</code>(意味のない桁を含む)</li> |
| 433 | +<li>C++29 : <code>1.2345678901234568e+22</code></li> |
| 434 | +</ul> |
| 435 | +</li> |
| 436 | +</ul> |
| 437 | +</li> |
| 438 | +</ul> |
| 439 | +</li> |
419 | 440 | </ul> |
420 | 441 | <h2>例</h2> |
421 | 442 | <h3>基本の使用例 (C++17)</h3> |
@@ -654,6 +675,14 @@ <h2>参照</h2> |
654 | 675 | <li>C++23で<a class="cpprefjp-defined-word" data-desc="<stdfloat>で定義される内部表現の規定された浮動小数点数型" href="../stdfloat.html">拡張浮動小数点数型</a>に対応した</li> |
655 | 676 | </ul> |
656 | 677 | </li> |
| 678 | +<li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3505r4.html" target="_blank">P3505R4 Fix the default floating-point representation in <code>std::format</code></a><ul> |
| 679 | +<li>C++29で、(2), (3), (4), (5)のフォーマット指定子の選択が、出力文字列の長さによるものから<code>value</code>の値の範囲によるものへ変更された。この変更は<code><a href="../format/format.html">std::format()</a></code>で型指定を省略した場合の出力にも影響する。LEWGでは以前のバージョンへの欠陥報告 (DR) として扱うことが推奨されているため、処理系がC++29より前のモードでも新しい表現を採用する場合がある</li> |
| 680 | +</ul> |
| 681 | +</li> |
| 682 | +<li><a href="https://cplusplus.github.io/LWG/issue4602" target="_blank">LWG Issue 4602. Incorrect lower bound for the default floating-point representation</a><ul> |
| 683 | +<li>P3505R4が意図せず変更していた<code>l</code>, <code>u</code>の定義を、10<sup>-4</sup>などの値に最も近い<code>T</code>の値を指すという本来の設計へ戻す修正。C++29のワーキングドラフトへはまだ適用されていない (Readyステータス)</li> |
| 684 | +</ul> |
| 685 | +</li> |
657 | 686 | <li><a href="https://ja.cppreference.com/w/c/io/fprintf" target="_blank">C言語リファレンス - fprintf</a></li> |
658 | 687 | </ul></div> |
659 | 688 |
|
|
0 commit comments