hexonal 6c285ba88a
Format zero as 0x0p+0 in hexfloat (#4878)
fmt::format("{:a}", 0.0) produced 0x0p-1022 where printf's %a gives
0x0p+0, and likewise for -0.0, {:A}, {:#a} and any explicit precision.

basic_fp::assign maps a zero biased exponent to 1 ("subnormals use
biased exponent 1"), which is right for subnormals but not for zero, so
format_hexfloat inherited the minimum subnormal exponent for a value
whose significand carries no information. Reset the exponent there
rather than in assign, which the decimal path shares.

A zero significand can only come from +-0: normals get the implicit bit
added, and a subnormal has a nonzero significand by definition. So the
guard cannot affect anything else, and denorm_min keeps its existing
denormalized form (0x0.0000000000001p-1022, asserted in format_double).

The five new expectations were taken from printf rather than derived,
and all fail without this change.
2026-08-10 09:52:03 -07:00
..
add-subdirectory-test Apply clang-format 2026-07-23 13:10:37 -07:00
compile-error-test Avoid dropping null byte in format string (#4732) 2026-04-23 09:34:27 -07:00
cuda-test Apply cmake-format 2026-03-03 15:49:40 -08:00
find-package-test Bump tested CMake version to 3.25 2022-11-30 08:09:32 -08:00
fuzzing Apply cmake-format 2026-03-03 15:49:40 -08:00
gtest Apply cmake-format 2026-03-03 15:49:40 -08:00
static-export-test Bump tested CMake version to 3.25 2022-11-30 08:09:32 -08:00
args-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
assert-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
base-test.cc Simplify test 2026-06-26 12:29:26 -07:00
c-test.c Add a test for fmt_print 2026-06-08 08:18:43 +02:00
chrono-test.cc fix out-of-range float to int conversion in to_nonnegative_int (#4802) 2026-06-16 23:14:58 -07:00
CMakeLists.txt Set matching CC alongside CXX in Linux CI matrix (#4863) 2026-07-30 10:08:36 -07:00
color-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
compile-test.cc Handle const-qualified named arguments 2026-07-29 09:20:23 -07:00
detect-stdfs.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
enforce-checks-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
format-impl-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
format-test.cc Format zero as 0x0p+0 in hexfloat (#4878) 2026-08-10 09:52:03 -07:00
gtest-extra-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
gtest-extra.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
gtest-extra.h Unify copyright notices 2026-05-31 08:54:06 -07:00
header-only-test.cc Add base.h 2024-01-09 19:36:12 -08:00
mock-allocator.h Unify copyright notices 2026-05-31 08:54:06 -07:00
module-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
no-builtin-types-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
noexception-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
os-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
ostream-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
perf-sanity.cc Cleanup test 2024-07-17 06:59:24 -07:00
posix-mock-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
posix-mock.h Unify copyright notices 2026-05-31 08:54:06 -07:00
printf-test.cc fix out-of-bounds read in basic_format_args::get (#4800) 2026-06-09 22:18:35 -07:00
ranges-odr-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
ranges-test.cc Fix ambiguous formatter<std::optional<T>> between fmt/std.h and fmt/ranges.h on C++26 (P3168R2) (#4761) 2026-05-03 07:37:46 -07:00
scan-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
scan.h Unify copyright notices 2026-05-31 08:54:06 -07:00
std-test.cc Annotate FMT_USE_RTTI #endif directives 2026-07-17 12:12:25 -07:00
test-assert.h Unify copyright notices 2026-05-31 08:54:06 -07:00
test-main.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
unicode-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
util.cc Unify copyright notices 2026-05-31 08:54:06 -07:00
util.h Unify copyright notices 2026-05-31 08:54:06 -07:00
xchar-test.cc Unify copyright notices 2026-05-31 08:54:06 -07:00