20 #include "gmock/gmock.h" 21 #include "gtest/gtest.h" 27 #define ABSL_COMPILER_DOES_EXACT_ROUNDING 0 28 #define ABSL_STRTOD_HANDLES_NAN_CORRECTLY 0 30 #define ABSL_COMPILER_DOES_EXACT_ROUNDING 1 31 #define ABSL_STRTOD_HANDLES_NAN_CORRECTLY 1 38 #if ABSL_COMPILER_DOES_EXACT_ROUNDING 44 double actual_number = 0.0;
47 EXPECT_EQ(result.
ec, std::errc());
49 EXPECT_EQ(actual_number, expected_number);
54 float actual_number = 0.0;
57 EXPECT_EQ(result.
ec, std::errc());
59 EXPECT_EQ(actual_number, expected_number);
67 #define FROM_CHARS_TEST_DOUBLE(number) \ 69 TestDoubleParse(#number, number); \ 70 TestDoubleParse("-" #number, -number); \ 73 #define FROM_CHARS_TEST_FLOAT(number) \ 75 TestFloatParse(#number, number##f); \ 76 TestFloatParse("-" #number, -number##f); \ 79 TEST(FromChars, NearRoundingCases) {
157 #undef FROM_CHARS_TEST_DOUBLE 158 #undef FROM_CHARS_TEST_FLOAT 177 TEST(FromChars, NearRoundingCasesExplicit) {
178 EXPECT_EQ(ToDouble(
"5.e125"), ldexp(6653062250012735, 365));
179 EXPECT_EQ(ToDouble(
"69.e267"), ldexp(4705683757438170, 841));
180 EXPECT_EQ(ToDouble(
"999.e-026"), ldexp(6798841691080350, -129));
181 EXPECT_EQ(ToDouble(
"7861.e-034"), ldexp(8975675289889240, -153));
182 EXPECT_EQ(ToDouble(
"75569.e-254"), ldexp(6091718967192243, -880));
183 EXPECT_EQ(ToDouble(
"928609.e-261"), ldexp(7849264900213743, -900));
184 EXPECT_EQ(ToDouble(
"9210917.e080"), ldexp(8341110837370930, 236));
185 EXPECT_EQ(ToDouble(
"84863171.e114"), ldexp(4625202867375927, 353));
186 EXPECT_EQ(ToDouble(
"653777767.e273"), ldexp(5068902999763073, 884));
187 EXPECT_EQ(ToDouble(
"5232604057.e-298"), ldexp(5741343011915040, -1010));
188 EXPECT_EQ(ToDouble(
"27235667517.e-109"), ldexp(6707124626673586, -380));
189 EXPECT_EQ(ToDouble(
"653532977297.e-123"), ldexp(7078246407265384, -422));
190 EXPECT_EQ(ToDouble(
"3142213164987.e-294"), ldexp(8219991337640559, -988));
191 EXPECT_EQ(ToDouble(
"46202199371337.e-072"), ldexp(5224462102115359, -246));
192 EXPECT_EQ(ToDouble(
"231010996856685.e-073"), ldexp(5224462102115359, -247));
193 EXPECT_EQ(ToDouble(
"9324754620109615.e212"), ldexp(5539753864394442, 705));
194 EXPECT_EQ(ToDouble(
"78459735791271921.e049"), ldexp(8388176519442766, 166));
195 EXPECT_EQ(ToDouble(
"272104041512242479.e200"), ldexp(5554409530847367, 670));
196 EXPECT_EQ(ToDouble(
"6802601037806061975.e198"), ldexp(5554409530847367, 668));
197 EXPECT_EQ(ToDouble(
"20505426358836677347.e-221"),
198 ldexp(4524032052079546, -722));
199 EXPECT_EQ(ToDouble(
"836168422905420598437.e-234"),
200 ldexp(5070963299887562, -760));
201 EXPECT_EQ(ToDouble(
"4891559871276714924261.e222"),
202 ldexp(6452687840519111, 757));
203 EXPECT_EQ(ToFloat(
"5.e-20"), ldexpf(15474250, -88));
204 EXPECT_EQ(ToFloat(
"67.e14"), ldexpf(12479722, 29));
205 EXPECT_EQ(ToFloat(
"985.e15"), ldexpf(14333636, 36));
206 EXPECT_EQ(ToFloat(
"7693.e-42"), ldexpf(10979816, -150));
207 EXPECT_EQ(ToFloat(
"55895.e-16"), ldexpf(12888509, -61));
208 EXPECT_EQ(ToFloat(
"996622.e-44"), ldexpf(14224264, -150));
209 EXPECT_EQ(ToFloat(
"7038531.e-32"), ldexpf(11420669, -107));
210 EXPECT_EQ(ToFloat(
"60419369.e-46"), ldexpf(8623340, -150));
211 EXPECT_EQ(ToFloat(
"702990899.e-20"), ldexpf(16209866, -61));
212 EXPECT_EQ(ToFloat(
"6930161142.e-48"), ldexpf(9891056, -150));
213 EXPECT_EQ(ToFloat(
"25933168707.e-13"), ldexpf(11138211, -32));
214 EXPECT_EQ(ToFloat(
"596428896559.e20"), ldexpf(12333860, 82));
217 EXPECT_EQ(ToDouble(
"9.e-265"), ldexp(8168427841980010, -930));
218 EXPECT_EQ(ToDouble(
"85.e-037"), ldexp(6360455125664090, -169));
219 EXPECT_EQ(ToDouble(
"623.e100"), ldexp(6263531988747231, 289));
220 EXPECT_EQ(ToDouble(
"3571.e263"), ldexp(6234526311072170, 833));
221 EXPECT_EQ(ToDouble(
"81661.e153"), ldexp(6696636728760206, 472));
222 EXPECT_EQ(ToDouble(
"920657.e-023"), ldexp(5975405561110124, -109));
223 EXPECT_EQ(ToDouble(
"4603285.e-024"), ldexp(5975405561110124, -110));
224 EXPECT_EQ(ToDouble(
"87575437.e-309"), ldexp(8452160731874668, -1053));
225 EXPECT_EQ(ToDouble(
"245540327.e122"), ldexp(4985336549131723, 381));
226 EXPECT_EQ(ToDouble(
"6138508175.e120"), ldexp(4985336549131723, 379));
227 EXPECT_EQ(ToDouble(
"83356057653.e193"), ldexp(5986732817132056, 625));
228 EXPECT_EQ(ToDouble(
"619534293513.e124"), ldexp(4798406992060657, 399));
229 EXPECT_EQ(ToDouble(
"2335141086879.e218"), ldexp(5419088166961646, 713));
230 EXPECT_EQ(ToDouble(
"36167929443327.e-159"), ldexp(8135819834632444, -536));
231 EXPECT_EQ(ToDouble(
"609610927149051.e-255"), ldexp(4576664294594737, -850));
232 EXPECT_EQ(ToDouble(
"3743626360493413.e-165"), ldexp(6898586531774201, -549));
233 EXPECT_EQ(ToDouble(
"94080055902682397.e-242"), ldexp(6273271706052298, -800));
234 EXPECT_EQ(ToDouble(
"899810892172646163.e283"), ldexp(7563892574477827, 947));
235 EXPECT_EQ(ToDouble(
"7120190517612959703.e120"), ldexp(5385467232557565, 409));
236 EXPECT_EQ(ToDouble(
"25188282901709339043.e-252"),
237 ldexp(5635662608542340, -825));
238 EXPECT_EQ(ToDouble(
"308984926168550152811.e-052"),
239 ldexp(5644774693823803, -157));
240 EXPECT_EQ(ToDouble(
"6372891218502368041059.e064"),
241 ldexp(4616868614322430, 233));
243 EXPECT_EQ(ToFloat(
"3.e-23"), ldexpf(9507380, -98));
244 EXPECT_EQ(ToFloat(
"57.e18"), ldexpf(12960300, 42));
245 EXPECT_EQ(ToFloat(
"789.e-35"), ldexpf(10739312, -130));
246 EXPECT_EQ(ToFloat(
"2539.e-18"), ldexpf(11990089, -72));
247 EXPECT_EQ(ToFloat(
"76173.e28"), ldexpf(9845130, 86));
248 EXPECT_EQ(ToFloat(
"887745.e-11"), ldexpf(9760860, -40));
249 EXPECT_EQ(ToFloat(
"5382571.e-37"), ldexpf(11447463, -124));
250 EXPECT_EQ(ToFloat(
"82381273.e-35"), ldexpf(8554961, -113));
251 EXPECT_EQ(ToFloat(
"750486563.e-38"), ldexpf(9975678, -120));
252 EXPECT_EQ(ToFloat(
"3752432815.e-39"), ldexpf(9975678, -121));
253 EXPECT_EQ(ToFloat(
"75224575729.e-45"), ldexpf(13105970, -137));
254 EXPECT_EQ(ToFloat(
"459926601011.e15"), ldexpf(12466336, 65));
270 template <
typename FloatType>
275 low_rep[low_rep.size() - 1] -= 1;
279 absl::from_chars(low_rep.data(), low_rep.data() + low_rep.size(), actual_low);
280 EXPECT_EQ(expected_low, actual_low);
282 std::string high_rep =
283 absl::StrCat(mantissa, std::string(1000,
'0'),
"1e", exponent);
287 EXPECT_EQ(expected_high, actual_high);
289 std::string halfway_rep =
absl::StrCat(mantissa,
"e", exponent);
291 absl::from_chars(halfway_rep.data(), halfway_rep.data() + halfway_rep.size(),
293 EXPECT_EQ(expected_half, actual_half);
296 TEST(FromChars, DoubleRounding) {
297 const double zero = 0.0;
298 const double first_subnormal = nextafter(zero, 1.0);
299 const double second_subnormal = nextafter(first_subnormal, 1.0);
301 const double first_normal = DBL_MIN;
302 const double last_subnormal = nextafter(first_normal, 0.0);
303 const double second_normal = nextafter(first_normal, 1.0);
305 const double last_normal = DBL_MAX;
306 const double penultimate_normal = nextafter(last_normal, 0.0);
315 "470328229206232720882843964341106861825299013071623822127928412503377536" 316 "351043759326499181808179961898982823477228588654633283551779698981993873" 317 "980053909390631503565951557022639229085839244910518443593180284993653615" 318 "250031937045767824921936562366986365848075700158576926990370631192827955" 319 "855133292783433840935197801553124659726357957462276646527282722005637400" 320 "648549997709659947045402082816622623785739345073633900796776193057750674" 321 "017632467360096895134053553745851666113422376667860416215968046191446729" 322 "184030053005753084904876539171138659164623952491262365388187963623937328" 323 "042389101867234849766823508986338858792562830275599565752445550725518931" 324 "369083625477918694866799496832404970582102851318545139621383772282614543" 325 "7693412532098591327667236328125",
326 -324, zero, first_subnormal, zero);
331 "410984687618698162648531893023320585475897039214871466383785237510132609" 332 "053131277979497545424539885696948470431685765963899850655339096945981621" 333 "940161728171894510697854671067917687257517734731555330779540854980960845" 334 "750095811137303474765809687100959097544227100475730780971111893578483867" 335 "565399878350301522805593404659373979179073872386829939581848166016912201" 336 "945649993128979841136206248449867871357218035220901702390328579173252022" 337 "052897402080290685402160661237554998340267130003581248647904138574340187" 338 "552090159017259254714629617513415977493871857473787096164563890871811984" 339 "127167305601704549300470526959016576377688490826798697257336652176556794" 340 "107250876433756084600398490497214911746308553955635418864151316847843631" 341 "3080237596295773983001708984375",
342 -324, first_subnormal, second_subnormal, second_subnormal);
347 "225073858507201136057409796709131975934819546351645648023426109724822222" 348 "021076945516529523908135087914149158913039621106870086438694594645527657" 349 "207407820621743379988141063267329253552286881372149012981122451451889849" 350 "057222307285255133155755015914397476397983411801999323962548289017107081" 351 "850690630666655994938275772572015763062690663332647565300009245888316433" 352 "037779791869612049497390377829704905051080609940730262937128958950003583" 353 "799967207254304360284078895771796150945516748243471030702609144621572289" 354 "880258182545180325707018860872113128079512233426288368622321503775666622" 355 "503982534335974568884423900265498198385487948292206894721689831099698365" 356 "846814022854243330660339850886445804001034933970427567186443383770486037" 357 "86162277173854562306587467901408672332763671875",
358 -308, last_subnormal, first_normal, first_normal);
363 "225073858507201630123055637955676152503612414573018013083228724049586647" 364 "606759446192036794116886953213985520549032000903434781884412325572184367" 365 "563347617020518175998922941393629966742598285899994830148971433555578567" 366 "693279306015978183162142425067962460785295885199272493577688320732492479" 367 "924816869232247165964934329258783950102250973957579510571600738343645738" 368 "494324192997092179207389919761694314131497173265255020084997973676783743" 369 "155205818804439163810572367791175177756227497413804253387084478193655533" 370 "073867420834526162513029462022730109054820067654020201547112002028139700" 371 "141575259123440177362244273712468151750189745559978653234255886219611516" 372 "335924167958029604477064946470184777360934300451421683607013647479513962" 373 "13837722826145437693412532098591327667236328125",
374 -308, first_normal, second_normal, first_normal);
379 "797693134862315608353258760581052985162070023416521662616611746258695532" 380 "672923265745300992879465492467506314903358770175220871059269879629062776" 381 "047355692132901909191523941804762171253349609463563872612866401980290377" 382 "995141836029815117562837277714038305214839639239356331336428021390916694" 383 "57927874464075218944",
384 308, penultimate_normal, last_normal, penultimate_normal);
389 TEST(FromChars, FloatRounding) {
390 const float zero = 0.0;
391 const float first_subnormal = nextafterf(zero, 1.0);
392 const float second_subnormal = nextafterf(first_subnormal, 1.0);
394 const float first_normal = FLT_MIN;
395 const float last_subnormal = nextafterf(first_normal, 0.0);
396 const float second_normal = nextafterf(first_normal, 1.0);
398 const float last_normal = FLT_MAX;
399 const float penultimate_normal = nextafterf(last_normal, 0.0);
404 "006492321624085354618647916449580656401309709382578858785341419448955413" 405 "42930300743319094181060791015625",
406 -46, zero, first_subnormal, zero);
411 "101947696487225606385594374934874196920392912814773657635602425834686624" 412 "028790902229957282543182373046875",
413 -45, first_subnormal, second_subnormal, second_subnormal);
418 "175494280757364291727882991035766513322858992758990427682963118425003064" 419 "9651730385585324256680905818939208984375",
420 -38, last_subnormal, first_normal, first_normal);
425 "175494420887210724209590083408724842314472120785184615334540294131831453" 426 "9442813071445925743319094181060791015625",
427 -38, first_normal, second_normal, first_normal);
430 TestHalfwayValue(
"3.40282336497324057985868971510891282432", 38,
431 penultimate_normal, last_normal, penultimate_normal);
434 TEST(FromChars, Underflow) {
441 std::string negative_underflow =
"-1e-1000";
442 const char*
begin = negative_underflow.data();
443 const char*
end = begin + negative_underflow.size();
446 EXPECT_EQ(result.
ptr, end);
447 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
448 EXPECT_TRUE(std::signbit(d));
449 EXPECT_GE(d, -std::numeric_limits<double>::min());
452 EXPECT_EQ(result.
ptr, end);
453 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
454 EXPECT_TRUE(std::signbit(f));
455 EXPECT_GE(f, -std::numeric_limits<float>::min());
457 std::string positive_underflow =
"1e-1000";
458 begin = positive_underflow.data();
459 end = begin + positive_underflow.size();
462 EXPECT_EQ(result.
ptr, end);
463 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
464 EXPECT_FALSE(std::signbit(d));
465 EXPECT_LE(d, std::numeric_limits<double>::min());
468 EXPECT_EQ(result.
ptr, end);
469 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
470 EXPECT_FALSE(std::signbit(f));
471 EXPECT_LE(f, std::numeric_limits<float>::min());
474 TEST(FromChars, Overflow) {
481 std::string negative_overflow =
"-1e1000";
482 const char*
begin = negative_overflow.data();
483 const char*
end = begin + negative_overflow.size();
486 EXPECT_EQ(result.
ptr, end);
487 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
488 EXPECT_TRUE(std::signbit(d));
489 EXPECT_EQ(d, -std::numeric_limits<double>::max());
492 EXPECT_EQ(result.
ptr, end);
493 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
494 EXPECT_TRUE(std::signbit(f));
495 EXPECT_EQ(f, -std::numeric_limits<float>::max());
497 std::string positive_overflow =
"1e1000";
498 begin = positive_overflow.data();
499 end = begin + positive_overflow.size();
502 EXPECT_EQ(result.
ptr, end);
503 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
504 EXPECT_FALSE(std::signbit(d));
505 EXPECT_EQ(d, std::numeric_limits<double>::max());
508 EXPECT_EQ(result.
ptr, end);
509 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
510 EXPECT_FALSE(std::signbit(f));
511 EXPECT_EQ(f, std::numeric_limits<float>::max());
514 TEST(FromChars, ReturnValuePtr) {
520 std::string normal =
"3.14@#$%@#$%";
522 EXPECT_EQ(result.
ec, std::errc());
523 EXPECT_EQ(result.
ptr - normal.data(), 4);
525 std::string overflow =
"1e1000@#$%@#$%";
527 overflow.data() + overflow.size(), d);
528 EXPECT_EQ(result.
ec, std::errc::result_out_of_range);
529 EXPECT_EQ(result.
ptr - overflow.data(), 6);
531 std::string garbage =
"#$%@#$%";
533 garbage.data() + garbage.size(), d);
534 EXPECT_EQ(result.
ec, std::errc::invalid_argument);
535 EXPECT_EQ(result.
ptr - garbage.data(), 0);
543 TEST(FromChars, TestVersusStrtod) {
544 for (
int mantissa = 1000000; mantissa <= 9999999; mantissa += 501) {
545 for (
int exponent = -300; exponent < 300; ++
exponent) {
546 std::string candidate =
absl::StrCat(mantissa,
"e", exponent);
547 double strtod_value = strtod(candidate.c_str(),
nullptr);
548 double absl_value = 0;
551 ASSERT_EQ(strtod_value, absl_value) << candidate;
561 TEST(FromChars, TestVersusStrtof) {
562 for (
int mantissa = 1000000; mantissa <= 9999999; mantissa += 501) {
563 for (
int exponent = -43; exponent < 32; ++
exponent) {
564 std::string candidate =
absl::StrCat(mantissa,
"e", exponent);
565 float strtod_value = strtof(candidate.c_str(),
nullptr);
566 float absl_value = 0;
569 ASSERT_EQ(strtod_value, absl_value) << candidate;
576 template <
typename Float>
577 bool Identical(Float
a, Float
b) {
578 return 0 == memcmp(&a, &b,
sizeof(Float));
588 TEST(FromChars, NaNDoubles) {
589 for (std::string n_char_sequence :
590 {
"",
"1",
"2",
"3",
"fff",
"FFF",
"200000",
"400000",
"4000000000000",
591 "8000000000000",
"abc123",
"legal_but_unexpected",
592 "99999999999999999999999",
"_"}) {
593 std::string input =
absl::StrCat(
"nan(", n_char_sequence,
")");
595 double from_chars_double;
598 double std_nan_double = std::nan(n_char_sequence.c_str());
599 EXPECT_TRUE(Identical(from_chars_double, std_nan_double));
603 #if ABSL_STRTOD_HANDLES_NAN_CORRECTLY 604 double strtod_double = strtod(input.c_str(),
nullptr);
605 EXPECT_TRUE(Identical(from_chars_double, strtod_double));
606 #endif // ABSL_STRTOD_HANDLES_NAN_CORRECTLY 609 std::string negative_input =
"-" + input;
610 double negative_from_chars_double;
612 negative_input.data() + negative_input.size(),
613 negative_from_chars_double);
614 EXPECT_TRUE(std::signbit(negative_from_chars_double));
615 EXPECT_FALSE(Identical(negative_from_chars_double, from_chars_double));
616 from_chars_double = std::copysign(from_chars_double, -1.0);
617 EXPECT_TRUE(Identical(negative_from_chars_double, from_chars_double));
621 TEST(FromChars, NaNFloats) {
622 for (std::string n_char_sequence :
623 {
"",
"1",
"2",
"3",
"fff",
"FFF",
"200000",
"400000",
"4000000000000",
624 "8000000000000",
"abc123",
"legal_but_unexpected",
625 "99999999999999999999999",
"_"}) {
626 std::string input =
absl::StrCat(
"nan(", n_char_sequence,
")");
628 float from_chars_float;
631 float std_nan_float = std::nanf(n_char_sequence.c_str());
632 EXPECT_TRUE(Identical(from_chars_float, std_nan_float));
636 #if ABSL_STRTOD_HANDLES_NAN_CORRECTLY 637 float strtof_float = strtof(input.c_str(),
nullptr);
638 EXPECT_TRUE(Identical(from_chars_float, strtof_float));
639 #endif // ABSL_STRTOD_HANDLES_NAN_CORRECTLY 642 std::string negative_input =
"-" + input;
643 float negative_from_chars_float;
645 negative_input.data() + negative_input.size(),
646 negative_from_chars_float);
647 EXPECT_TRUE(std::signbit(negative_from_chars_float));
648 EXPECT_FALSE(Identical(negative_from_chars_float, from_chars_float));
649 from_chars_float = std::copysign(from_chars_float, -1.0);
650 EXPECT_TRUE(Identical(negative_from_chars_float, from_chars_float));
655 int NextStep(
int step) {
656 return step + (step >> 2) + 1;
670 template <
typename Float>
671 void TestOverflowAndUnderflow(
672 const std::function<std::string(
int)>& input_generator,
673 const std::function<Float(
int)>& expected_generator,
int lower_bound,
677 for (index = lower_bound, step = 1; index < upper_bound;
678 index +=
step, step = NextStep(step)) {
679 std::string input = input_generator(index);
681 Float expected = expected_generator(index);
685 EXPECT_EQ(result.ec, std::errc());
686 EXPECT_EQ(expected, actual)
690 for (index = upper_bound, step = 1; index > lower_bound;
691 index -=
step, step = NextStep(step)) {
692 std::string input = input_generator(index);
694 Float expected = expected_generator(index);
698 EXPECT_EQ(result.ec, std::errc());
699 EXPECT_EQ(expected, actual)
703 for (index = lower_bound - 1, step = 1; index > -1000000;
704 index -=
step, step = NextStep(step)) {
705 std::string input = input_generator(index);
710 EXPECT_EQ(result.ec, std::errc::result_out_of_range);
711 EXPECT_LT(actual, 1.0);
714 for (index = upper_bound + 1, step = 1; index < 1000000;
715 index +=
step, step = NextStep(step)) {
716 std::string input = input_generator(index);
721 EXPECT_EQ(result.ec, std::errc::result_out_of_range);
722 EXPECT_GT(actual, 1.0);
732 TEST(FromChars, HexdecimalDoubleLimits) {
733 auto input_gen = [](
int index) {
return absl::StrCat(
"0x1.0p", index); };
734 auto expected_gen = [](
int index) {
return std::ldexp(1.0, index); };
735 TestOverflowAndUnderflow<double>(input_gen, expected_gen, -1074, 1023);
743 TEST(FromChars, HexdecimalFloatLimits) {
744 auto input_gen = [](
int index) {
return absl::StrCat(
"0x1.0p", index); };
745 auto expected_gen = [](
int index) {
return std::ldexp(1.0f, index); };
746 TestOverflowAndUnderflow<float>(input_gen, expected_gen, -149, 127);
755 TEST(FromChars, DecimalDoubleLimits) {
756 auto input_gen = [](
int index) {
return absl::StrCat(
"1.0e", index); };
757 auto expected_gen = [](
int index) {
return Pow10(index); };
758 TestOverflowAndUnderflow<double>(input_gen, expected_gen, -323, 308);
767 TEST(FromChars, DecimalFloatLimits) {
768 auto input_gen = [](
int index) {
return absl::StrCat(
"1.0e", index); };
769 auto expected_gen = [](
int index) {
return Pow10(index); };
770 TestOverflowAndUnderflow<float>(input_gen, expected_gen, -45, 38);
void StrAppend(std::string *dest, const AlphaNum &a)
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
#define FROM_CHARS_TEST_DOUBLE(number)
CONSTEXPR_F fields step(second_tag, fields f, diff_t n) noexcept
#define FROM_CHARS_TEST_FLOAT(number)
constexpr size_type size() const noexcept
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &...args)
constexpr size_type length() const noexcept
from_chars_result from_chars(const char *first, const char *last, double &value, chars_format fmt)
constexpr const_pointer data() const noexcept
TEST(Symbolize, Unimplemented)