Have etc-parse-number-f64.cc test fast_float
diff --git a/script/manual-test-parse-number-f64.cc b/script/manual-test-parse-number-f64.cc
index 1fd5d37..efe7c6d 100644
--- a/script/manual-test-parse-number-f64.cc
+++ b/script/manual-test-parse-number-f64.cc
@@ -52,13 +52,20 @@
 // program to generate a stand-alone C++ file.
 #include "../release/c/wuffs-unsupported-snapshot.c"
 
-// Uncomment this to use the github.com/lemire/fast_double_parser library. This
-// header-only library is C++, not C.
+// Uncomment one or all of these to use the
+//  - github.com/lemire/fast_double_parser
+//  - github.com/lemire/fast_float
+// libraries. These header-only libraries are C++, not C.
+//
 // #define USE_LEMIRE_FAST_DOUBLE_PARSER
+// #define USE_LEMIRE_FAST_FLOAT
 
 #ifdef USE_LEMIRE_FAST_DOUBLE_PARSER
 #include "/the/path/to/fast_double_parser/include/fast_double_parser.h"
 #endif
+#ifdef USE_LEMIRE_FAST_FLOAT
+#include "/the/path/to/fast_float/include/fast_float/fast_float.h"
+#endif
 
 const uint8_t hex[256] = {
     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,  // 0x00-0x07
@@ -140,8 +147,10 @@
   fprintf(stderr, "main: %s mismatch at %s:%" PRIu64 "\n", impl, g_filename,
           g_line);
   fprintf(stderr, "src:  %s\n", z);
-  fprintf(stderr, "have: %016" PRIX64 "\n", have);
-  fprintf(stderr, "want: %016" PRIX64 "\n", want);
+  fprintf(stderr, "have: 0x%016" PRIX64 " %f\n", have,
+          wuffs_base__ieee_754_bit_representation__from_u64_to_f64(have));
+  fprintf(stderr, "want: 0x%016" PRIX64 " %f\n", want,
+          wuffs_base__ieee_754_bit_representation__from_u64_to_f64(want));
 }
 
 bool  //
@@ -193,13 +202,34 @@
     double have_f64;
     if (!fast_double_parser::decimal_separator_dot::parse_number(&z[0],
                                                                  &have_f64)) {
-      fail_parse("lemire", z);
+      fail_parse("lemire/fast_double_parser", &z[0]);
       return false;
     }
     uint64_t have =
         wuffs_base__ieee_754_bit_representation__from_f64_to_u64(have_f64);
     if (have != want) {
-      fail("lemire", &z[0], have, want);
+      fail("lemire/fast_double_parser", &z[0], have, want);
+      return false;
+    }
+  }
+#endif
+
+#ifdef USE_LEMIRE_FAST_FLOAT
+  // Check lemire/fast_float's from_chars.
+  {
+    double have_f64;
+    fast_float::from_chars_result result = fast_float::from_chars(
+        static_cast<char*>(static_cast<void*>(s.ptr)),
+        static_cast<char*>(static_cast<void*>(s.ptr + s.len)), have_f64,
+        fast_float::chars_format::general);
+    if (result.ec != std::errc()) {
+      fail_parse("lemire/fast_float", &z[0]);
+      return false;
+    }
+    uint64_t have =
+        wuffs_base__ieee_754_bit_representation__from_f64_to_u64(have_f64);
+    if (have != want) {
+      fail("lemire/fast_float", &z[0], have, want);
       return false;
     }
   }
@@ -210,7 +240,7 @@
     wuffs_base__result_f64 res = wuffs_base__parse_number_f64(
         s, WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
     if (res.status.repr) {
-      fail_parse("wuffs", z);
+      fail_parse("wuffs", &z[0]);
       return false;
     }
     uint64_t have =