[Bug libstdc++/126731] `std::format("{}", std::float16_t)` does not agree with `std::to_chars`

"cvs-commit at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126731

--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tomasz Kaminski <[email protected]>:

https://gcc.gnu.org/g:4b6ce501c4f1db06c8084170a68796622266b671

commit r17-3473-g4b6ce501c4f1db06c8084170a68796622266b671
Author: Tomasz KamiÅski <[email protected]>
Date:   Thu Aug 13 09:51:56 2026 +0200

    libstdc++: Format std::float16_t and std::bfloat16_t using respective
std::to_chars overloads [PR126731]

    This patch removes the partial specialization for float16_t and bfloat16_t
    that formatted the values by casting to float. In consequence an implicit
    specialization of generic floating-point specialization is used, and
    to_chars overloads for their types are used.
    As explained in r13-3591-g0ae26533b3e268 (that adds corresponding to_chars
    overload), the shortest string (produced when no precision is specified)
    is shorter than float for above.

    As formatter specializations were defined under the same condition as
    corresponding to_chars overloads, the __formattable_float constrain on
    formatter floating-point specialization makes it enable in same cases.

    This reverted parts of r14-3305-g6cf214b4fc97f5 (revereted partially
    in r14-3329-g27d0cfcb2b33de), leading to (necessary for correctness)
    increase of the number template specializations. It also depends on
    preserving values of above types (instead of float) in basic_format_arg
    introduced r16-616-g9c9a7316adb996.

    The specializations for float32_t and float64_t are left unchanged,
    as their to_chars overloads are also implemented in terms of casting
    to float/double respectivelly.

    libstdc++-v3/ChangeLog:

            PR libstdc++/126731
            * include/std/format (std::formatter<_Float16, _CharT>)
            (std::formatter<__format::__bflt16_t, _CharT>): Remove
            partial specializations.
            * testsuite/std/format/formatter/ext_float.cc: Test output
            for closest value to 1/10.

    Reviewed-by: Jonathan Wakely <[email protected]>
    Signed-off-by: Tomasz KamiÅski <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.