Serenity Operating System
at master 579 lines 52 kB view raw
1/* 2 * Copyright (c) 2020, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibTest/TestCase.h> 8 9#include <AK/FloatingPointStringConversions.h> 10 11static double parse_complete_double(StringView view) 12{ 13 char const* start = view.characters_without_null_termination(); 14 return parse_floating_point_completely<double>(start, start + view.length()).release_value(); 15} 16 17static float parse_complete_float(StringView view) 18{ 19 char const* start = view.characters_without_null_termination(); 20 return parse_floating_point_completely<float>(start, start + view.length()).release_value(); 21} 22 23TEST_CASE(simple_cases) 24{ 25 26#define DOES_PARSE_DOUBLE_LIKE_CPP(value) \ 27 do { \ 28 EXPECT_EQ(static_cast<double>(value), parse_complete_double(#value##sv)); \ 29 EXPECT_EQ(-static_cast<double>(value), parse_complete_double("-" #value##sv)); \ 30 } while (false) 31 32#define DOES_PARSE_FLOAT_LIKE_CPP(value) \ 33 do { \ 34 float val = parse_complete_float(#value##sv); \ 35 EXPECT_EQ(static_cast<float>(value##f), val); \ 36 EXPECT_EQ(-static_cast<float>(value##f), parse_complete_float("-" #value##sv)); \ 37 } while (false) 38 39#define DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(value) \ 40 DOES_PARSE_DOUBLE_LIKE_CPP(value); \ 41 DOES_PARSE_FLOAT_LIKE_CPP(value); 42 43 DOES_PARSE_DOUBLE_LIKE_CPP(2.22507385850720138309e-308); 44 45 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(10090518465521146875.); 46 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(10052108125844341766.); 47 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(0.); 48 constexpr u64 negative_zero = 1ull << 63; 49 EXPECT_EQ(0ull, bit_cast<u64>(parse_complete_double("0"sv))); 50 EXPECT_EQ(negative_zero, bit_cast<u64>(parse_complete_double("-0"sv))); 51 EXPECT_EQ(negative_zero, bit_cast<u64>(parse_complete_double("-0."sv))); 52 EXPECT_EQ(negative_zero, bit_cast<u64>(parse_complete_double("-0.0"sv))); 53 54 DOES_PARSE_DOUBLE_LIKE_CPP(2.2222222222223e-322); 55 DOES_PARSE_DOUBLE_LIKE_CPP(2.2250738585072013e-308); 56 57 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(1.0); 58 DOES_PARSE_DOUBLE_LIKE_CPP(0.54e-85); 59 DOES_PARSE_DOUBLE_LIKE_CPP(123); 60 DOES_PARSE_DOUBLE_LIKE_CPP(1e10); 61 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(001234.0); 62 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(123.456); 63 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(0.456); 64 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(0.456); 65 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(0.45689544977495495495197116546843576574949654); 66 DOES_PARSE_DOUBLE_LIKE_CPP(0.45689544977495495495197116546843576574949654e81); 67 DOES_PARSE_DOUBLE_LIKE_CPP(0.45689544977495495495197116546843576574949654e-81); 68 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(7.2057594037927933e+8); 69 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(234532.3426362); 70 DOES_PARSE_DOUBLE_LIKE_CPP(860228122.6654514319E+90); 71 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009195); 72 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009200); 73 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009199); 74 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009198); 75 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009208); 76 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009204); 77 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009200); 78 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009201); 79 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009202); 80 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009203); 81 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009205); 82 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009206); 83 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.001); 84 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.000); 85 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0001); 86 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0000); 87 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.00001); 88 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.000001); 89 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0000001); 90 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.00000001); 91 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.000000001); 92 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0000000001); 93 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.00000000001); 94 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.000000000001); 95 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0000000000001); 96 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.00000000000001); 97 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.000000000000001); 98 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0000000000000001); 99 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.00000000000000001); 100 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.000000000000000001); 101 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0000000000000000001); 102 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.00000000000000000001); 103 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.000000000000000000001); 104 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(69294956446009204.0000000000000000000001); 105 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009196); 106 DOES_PARSE_DOUBLE_LIKE_CPP(69294956446009115); 107 DOES_PARSE_DOUBLE_LIKE_CPP(692949564460091155); 108 DOES_PARSE_DOUBLE_LIKE_CPP(6929495644600911557); 109 DOES_PARSE_DOUBLE_LIKE_CPP(7.0420557077594588669468784357561207962098443483187940792729600000e+59); 110 DOES_PARSE_DOUBLE_LIKE_CPP(7.0420557077594588669468784357561207962098443483187940792729600000e+59); 111 DOES_PARSE_DOUBLE_LIKE_CPP(1.7339253062092163730578609458683877051596800000000000000000000000e+42); 112 DOES_PARSE_DOUBLE_LIKE_CPP(2.0972622234386619214559824785284023792871122537545728000000000000e+52); 113 DOES_PARSE_DOUBLE_LIKE_CPP(1.0001803374372191849407179462120053338028379051879898808320000000e+57); 114 DOES_PARSE_DOUBLE_LIKE_CPP(1.8607245283054342363818436991534856973992070520151142825984000000e+58); 115 DOES_PARSE_DOUBLE_LIKE_CPP(1.9189205311132686907264385602245237137907390376574976000000000000e+52); 116 DOES_PARSE_DOUBLE_LIKE_CPP(2.8184483231688951563253238886553506793085187889855201280000000000e+54); 117 DOES_PARSE_DOUBLE_LIKE_CPP(1.7664960224650106892054063261344555646357024359107788800000000000e+53); 118 DOES_PARSE_DOUBLE_LIKE_CPP(2.1470977154320536489471030463761883783915110400000000000000000000e+45); 119 DOES_PARSE_DOUBLE_LIKE_CPP(4.4900312744003159009338275160799498340862630046359789166919680000e+61); 120 DOES_PARSE_DOUBLE_LIKE_CPP(2.2222222222223e-322); 121 DOES_PARSE_DOUBLE_LIKE_CPP(860228122.6654514319E+90); 122 DOES_PARSE_DOUBLE_LIKE_CPP(4.9406564584124653e-324); 123 DOES_PARSE_DOUBLE_LIKE_CPP(4.9406564584124654e-324); 124 DOES_PARSE_DOUBLE_LIKE_CPP(2.2250738585072009e-308); 125 DOES_PARSE_DOUBLE_LIKE_CPP(2.2250738585072014e-308); 126 DOES_PARSE_DOUBLE_LIKE_CPP(1.7976931348623157e308); 127 DOES_PARSE_DOUBLE_LIKE_CPP(1.7976931348623158e308); 128 DOES_PARSE_DOUBLE_LIKE_CPP(0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044501477170144022721148195934182639518696390927032912960468522194496444440421538910330590478162701758282983178260792422137401728773891892910553144148156412434867599762821265346585071045737627442980259622449029037796981144446145705102663115100318287949527959668236039986479250965780342141637013812613333119898765515451440315261253813266652951306000184917766328660755595837392240989947807556594098101021612198814605258742579179000071675999344145086087205681577915435923018910334964869420614052182892431445797605163650903606514140377217442262561590244668525767372446430075513332450079650686719491377688478005309963967709758965844137894433796621993967316936280457084866613206797017728916080020698679408551343728867675409720757232455434770912461317493580281734466552734375); 129 DOES_PARSE_DOUBLE_LIKE_CPP(0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072008890245868760858598876504231122409594654935248025624400092282356951787758888037591552642309780950434312085877387158357291821993020294379224223559819827501242041788969571311791082261043971979604000454897391938079198936081525613113376149842043271751033627391549782731594143828136275113838604094249464942286316695429105080201815926642134996606517803095075913058719846423906068637102005108723282784678843631944515866135041223479014792369585208321597621066375401613736583044193603714778355306682834535634005074073040135602968046375918583163124224521599262546494300836851861719422417646455137135420132217031370496583210154654068035397417906022589503023501937519773030945763173210852507299305089761582519159720757232455434770912461317493580281734466552734375); 130 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740993.); 131 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740993.1); 132 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740993.0000000000000000000000000000000000000000000000000); 133 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740993.0000000000000000000000000000000000000000000000001); 134 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740993.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000); 135 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740993.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000); 136 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740993.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); 137 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009007199254740993.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000); 138 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009007199254740993.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); 139 140 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(1.17549414062751785924617589866280818433124586473279624003138594271817467598606476997247227700427174568176269531250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e-38); 141 142 DOES_PARSE_DOUBLE_LIKE_CPP(179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.); 143 DOES_PARSE_DOUBLE_LIKE_CPP(179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858369.); 144 DOES_PARSE_DOUBLE_LIKE_CPP(179769313486231579999999999999999999999999999999999999999917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.); 145 DOES_PARSE_DOUBLE_LIKE_CPP(179769313486231580000000000000000000000000000000000000000000000000057260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.); 146 DOES_PARSE_DOUBLE_LIKE_CPP(179769313486231580790000000000000000000000000000000000000000000000057260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.); 147 DOES_PARSE_DOUBLE_LIKE_CPP(179769313486231580793700000000000000000000000000000000000000000000057260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.); 148 DOES_PARSE_DOUBLE_LIKE_CPP(179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.); 149 150 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(7.2057594037927933e+16); 151 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(7.3177701707893310e+15); 152 DOES_PARSE_DOUBLE_LIKE_CPP(4.2523296908380055e94); 153 DOES_PARSE_DOUBLE_LIKE_CPP(4.2523296908380052e94); 154 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(6865415254.161212); 155 DOES_PARSE_DOUBLE_LIKE_CPP(4.9406564584124654416987984e-324); 156 DOES_PARSE_DOUBLE_LIKE_CPP(4.94065645841246544177987491e-324); 157 DOES_PARSE_DOUBLE_LIKE_CPP(1.4821969375237396325297063786046641170951794078429742932767570475020265218106262555958995090849079771393896940863371531927799701310678193891963243880323456343789021395709342135835374515035469463110661559081709961921691500191622274606949531619374201918195088454200951461561942223787156967735130799756700603045611186809318747958358147744773659879163696332033824403891299986257959682272412496899735742714436070441803404780657158346504044105794804160581370804321322475109996680534260007162497295808277148680375104180318034518509429259235026831954987743714947574192329127781743623968254334611203409098600941053918033152755376981653597394514673304353113588214501752867512169200796980994429823492617107911270837728302633695687262616047519259154796600341796875e-323); 158 DOES_PARSE_DOUBLE_LIKE_CPP(0.14821969375237396325297063786046641170951794078429742932767570475020265218106262555958995090849079771393896940863371531927799701310678193891963243880323456343789021395709342135835374515035469463110661559081709961921691500191622274606949531619374201918195088454200951461561942223787156967735130799756700603045611186809318747958358147744773659879163696332033824403891299986257959682272412496899735742714436070441803404780657158346504044105794804160581370804321322475109996680534260007162497295808277148680375104180318034518509429259235026831954987743714947574192329127781743623968254334611203409098600941053918033152755376981653597394514673304353113588214501752867512169200796980994429823492617107911270837728302633695687262616047519259154796600341796875e-322); 159 DOES_PARSE_DOUBLE_LIKE_CPP(0000000000000000000000000000.14821969375237396325297063786046641170951794078429742932767570475020265218106262555958995090849079771393896940863371531927799701310678193891963243880323456343789021395709342135835374515035469463110661559081709961921691500191622274606949531619374201918195088454200951461561942223787156967735130799756700603045611186809318747958358147744773659879163696332033824403891299986257959682272412496899735742714436070441803404780657158346504044105794804160581370804321322475109996680534260007162497295808277148680375104180318034518509429259235026831954987743714947574192329127781743623968254334611203409098600941053918033152755376981653597394514673304353113588214501752867512169200796980994429823492617107911270837728302633695687262616047519259154796600341796875e-322); 160 DOES_PARSE_DOUBLE_LIKE_CPP(0000000000000000000000000000.000000000014821969375237396325297063786046641170951794078429742932767570475020265218106262555958995090849079771393896940863371531927799701310678193891963243880323456343789021395709342135835374515035469463110661559081709961921691500191622274606949531619374201918195088454200951461561942223787156967735130799756700603045611186809318747958358147744773659879163696332033824403891299986257959682272412496899735742714436070441803404780657158346504044105794804160581370804321322475109996680534260007162497295808277148680375104180318034518509429259235026831954987743714947574192329127781743623968254334611203409098600941053918033152755376981653597394514673304353113588214501752867512169200796980994429823492617107911270837728302633695687262616047519259154796600341796875e-312); 161 DOES_PARSE_DOUBLE_LIKE_CPP(6.422853395936205074295394307286877840745777433986221937532613872508781594512713774248897872701267900937355341040794330502046537234627217353184072348140164415641909271474048258861995623182036767347953342268740983499399650083036318996344797035062154164551204996820412300010174963641101352685223346561236927986431514284038124115288530689401919280970935077214657241686229994045115862318045415323218821842922297191448142071618101950151752445844415136251927e-323); 162 DOES_PARSE_DOUBLE_LIKE_CPP(6.522853395936205074295394307286877840745777433986221937532613872508781594512713774248897872701267900937355341040794330502046537234627217353184072348140164415641909271474048258861995623182036767347953342268740983499399650083036318996344797035062154164551204996820412300010174963641101352685223346561236927986431514284038124115288530689401919280970935077214657241686229994045115862318045415323218821842922297191448142071618101950151752445844415136251927e-323); 163 DOES_PARSE_DOUBLE_LIKE_CPP(7.522853395936205074295394307286877840745777433986221937532613872508781594512713774248897872701267900937355341040794330502046537234627217353184072348140164415641909271474048258861995623182036767347953342268740983499399650083036318996344797035062154164551204996820412300010174963641101352685223346561236927986431514284038124115288530689401919280970935077214657241686229994045115862318045415323218821842922297191448142071618101950151752445844415136251927e-323); 164 DOES_PARSE_DOUBLE_LIKE_CPP(7.5228498395936205074295394307286877840745777433986221937532613872508781594512713774248897872701267900937355341040794330502046537234627217353184072348140164415641909271474048258861995623182036767347953342268740983499399650083036318996344797035062154164551204996820412300010174963641101352685223346561236927986431514284038124115288530689401919280970935077214657241686229994045115862318045415323218821842922297191448142071618101950151752445844415136251927e-323); 165 DOES_PARSE_DOUBLE_LIKE_CPP(0.5228498395936205074295394307286877840745777433986221937532613872508781594512713774248897872701267900937355341040794330502046537234627217353184072348140164415641909271474048258861995623182036767347953342268740983499399650083036318996344797035062154164551204996820412300010174963641101352685223346561236927986431514284038124115288530689401919280970935077214657241686229994045115862318045415323218821842922297191448142071618101950151752445844415136251927e-323); 166 167 // actual interesting (non 19+ digit) failures from current strtod' 168 DOES_PARSE_DOUBLE_LIKE_CPP(1e126); 169 DOES_PARSE_DOUBLE_LIKE_CPP(1e210); 170 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(358416272e-33); 171 172 // FIXME: These are different in 32 bit, since that will be removed some time (soon?) 173 // we can remove this guard at that point. 174#if not defined(__serenity__) 175 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(89255e-22); 176 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(8925.5e-21); 177 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(8.9255e-18); 178 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(8925500e-24); 179 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(89256e-22); 180 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(89254e-22); 181#endif 182 183 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(3.518437208883201171875e13); 184 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(62.5364939768271845828); 185 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(8.10109172351e-10); 186 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(1.50000000000000011102230246251565404236316680908203125); 187 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740991.4999999999999999999999999999999995); 188 189 DOES_PARSE_DOUBLE_LIKE_CPP(7.4109846876186981626485318930233205854758970392148714663837852375101326090531312779794975454245398856969484704316857659638998506553390969459816219401617281718945106978546710679176872575177347315553307795408549809608457500958111373034747658096871009590975442271004757307809711118935784838675653998783503015228055934046593739791790738723868299395818481660169122019456499931289798411362062484498678713572180352209017023903285791732520220528974020802906854021606612375549983402671300035812486479041385743401875520901590172592547146296175134159774938718574737870961645638908718119841271673056017045493004705269590165763776884908267986972573366521765567941072508764337560846003984904972149117463085539556354188641513168478436313080237596295773983001708984375001e-324); 190 DOES_PARSE_DOUBLE_LIKE_CPP(7.4109846876186981626485318930233205854758970392148714663837852375101326090531312779794975454245398856969484704316857659638998506553390969459816219401617281718945106978546710679176872575177347315553307795408549809608457500958111373034747658096871009590975442271004757307809711118935784838675653998783503015228055934046593739791790738723868299395818481660169122019456499931289798411362062484498678713572180352209017023903285791732520220528974020802906854021606612375549983402671300035812486479041385743401875520901590172592547146296175134159774938718574737870961645638908718119841271673056017045493004705269590165763776884908267986972573366521765567941072508764337560846003984904972149117463085539556354188641513168478436313080237596295773983001708984375e-324); 191 DOES_PARSE_DOUBLE_LIKE_CPP(7.4109846876186981626485318930233205854758970392148714663837852375101326090531312779794975454245398856969484704316857659638998506553390969459816219401617281718945106978546710679176872575177347315553307795408549809608457500958111373034747658096871009590975442271004757307809711118935784838675653998783503015228055934046593739791790738723868299395818481660169122019456499931289798411362062484498678713572180352209017023903285791732520220528974020802906854021606612375549983402671300035812486479041385743401875520901590172592547146296175134159774938718574737870961645638908718119841271673056017045493004705269590165763776884908267986972573366521765567941072508764337560846003984904972149117463085539556354188641513168478436313080237596295773983001708984374999e-324); 192 DOES_PARSE_DOUBLE_LIKE_CPP(2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125001e-324); 193 194 DOES_PARSE_DOUBLE_LIKE_CPP(2.22507385850720138309e-308); 195 196 DOES_PARSE_DOUBLE_LIKE_CPP(1e55); 197 198 DOES_PARSE_DOUBLE_LIKE_CPP(1e300); 199 DOES_PARSE_DOUBLE_LIKE_CPP(1e301); 200 DOES_PARSE_DOUBLE_LIKE_CPP(1e302); 201 DOES_PARSE_DOUBLE_LIKE_CPP(1e303); 202 DOES_PARSE_DOUBLE_LIKE_CPP(1e304); 203 DOES_PARSE_DOUBLE_LIKE_CPP(1e305); 204 DOES_PARSE_DOUBLE_LIKE_CPP(1e299); 205 206 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(3.4028235E38); 207 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(4e31); 208 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9007199254740991.); 209 210 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(7.038531E-26); 211 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(46116538.); 212 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(20040229.); 213 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(9771305410219737088.); 214 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(1146.); 215 216 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(7.0064923216240854e-46); 217 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(1.1877630352973938); 218 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(2.1665680640000002384185791015625e9); 219 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(8.589934335999999523162841796875e+09); 220 DOES_PARSE_FLOAT_AND_DOUBLE_LIKE_CPP(0.09289376810193062); 221 222#define DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(value) \ 223 do { \ 224 EXPECT_EQ(static_cast<double>(value##.), parse_complete_double(#value##sv)); \ 225 EXPECT_EQ(-static_cast<double>(value##.), parse_complete_double("-" #value##sv)); \ 226 } while (false) 227 228 DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(0); 229 DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(1); 230 DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(2); 231 DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(20); 232 DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(200); 233 DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(234); 234 DOES_PARSE_INT_LIKE_VALUE_LIKE_CPP(8419841); 235 236 EXPECT_EQ(67677557565221539913., parse_complete_double("67677557565221539913"sv)); 237 EXPECT_EQ(0., parse_complete_double("2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125e-324"sv)); 238 EXPECT_EQ(0., parse_complete_double("2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328124999e-324"sv)); 239 240#define EXPECT_TO_PARSE_TO_VALUE_EQUAL_TO(expected_val, str) \ 241 EXPECT_EQ(bit_cast<u64>(expected_val), bit_cast<u64>(parse_complete_double(str##sv))); 242 243 EXPECT_TO_PARSE_TO_VALUE_EQUAL_TO(0., "1e-324"); 244 EXPECT_TO_PARSE_TO_VALUE_EQUAL_TO(-0., "-1e-324"); 245 EXPECT_TO_PARSE_TO_VALUE_EQUAL_TO(.09289376810193062, "+.09289376810193062"); 246 EXPECT_TO_PARSE_TO_VALUE_EQUAL_TO(-.09289376810193062, "-.09289376810193062"); 247 EXPECT_TO_PARSE_TO_VALUE_EQUAL_TO(0., "+.0e10"); 248 EXPECT_TO_PARSE_TO_VALUE_EQUAL_TO(-0., "-.0e10"); 249 250#define EXPECT_TO_PARSE_TO_INFINITY(str) \ 251 EXPECT_EQ(__builtin_huge_val(), parse_complete_double(str##sv)); \ 252 EXPECT_EQ(__builtin_huge_val(), parse_complete_double("+" str##sv)); \ 253 EXPECT_EQ(-__builtin_huge_val(), parse_complete_double("-" str##sv)); \ 254 EXPECT_EQ(static_cast<float>(__builtin_huge_valf()), parse_complete_float(str##sv)); \ 255 EXPECT_EQ(static_cast<float>(__builtin_huge_valf()), parse_complete_float("+" str##sv)); \ 256 EXPECT_EQ(static_cast<float>(-__builtin_huge_valf()), parse_complete_float("-" str##sv)) 257 258 EXPECT_TO_PARSE_TO_INFINITY("123.456e789"); 259 EXPECT_TO_PARSE_TO_INFINITY("123456.456789e789"); 260 EXPECT_TO_PARSE_TO_INFINITY("1438456663141390273526118207642235581183227845246331231162636653790368152091394196930365828634687637948157940776599182791387527135353034738357134110310609455693900824193549772792016543182680519740580354365467985440183598701312257624545562331397018329928613196125590274187720073914818062530830316533158098624984118889298281371812288789537310599037529113415438738954894752124724983067241108764488346454376699018673078404751121414804937224240805993123816932326223683090770561597570457793932985826162604255884529134126396282202126526253389383421806727954588525596114379801269094096329805054803089299736996870951258573010877404407451953846698609198213926882692078557033228265259305481198526059813164469187586693257335779522020407645498684263339921905227556616698129967412891282231685504660671277927198290009824680186319750978665734576683784255802269708917361719466043175201158849097881370477111850171579869056016061666173029059588433776015644439705050377554277696143928278093453792803846252715966016733222646442382892123940052441346822429721593884378212558701004356924243030059517489346646577724622498919752597382095222500311124181823512251071356181769376577651390028297796156208815375089159128394945710515861334486267101797497111125909272505194792870889617179758703442608016143343262159998149700606597792535574457560429226974273443630323818747730771316763398572110874959981923732463076884528677392654150010269822239401993427482376513231389212353583573566376915572650916866553612366187378959554983566712767093372906030188976220169058025354973622211666504549316958271880975697143546564469806791358707318873075708383345004090151974068325838177531266954177406661392229801349994695941509935655355652985723782153570084089560139142231.738475042362596875449154552392299548947138162081694168675340677843807613129780449323363759027012972466987370921816813162658754726545121090545507240267000456594786540949605260722461937870630634874991729398208026467698131898691830012167897399682179601734569071423681e-733"); 261 EXPECT_TO_PARSE_TO_INFINITY("3e182947912346759234"); 262 EXPECT_TO_PARSE_TO_INFINITY("3e70000000000000"); 263 EXPECT_TO_PARSE_TO_INFINITY("3e70000000000"); 264 EXPECT_TO_PARSE_TO_INFINITY("3e70000000"); 265 EXPECT_TO_PARSE_TO_INFINITY("1e681"); 266 EXPECT_TO_PARSE_TO_INFINITY("7e312"); 267 EXPECT_TO_PARSE_TO_INFINITY("184467440737095516151234567890e2147483639"); 268} 269 270TEST_CASE(partial_parse_stops_at_right_spot) 271{ 272#define EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS(string_value, double_value, chars_parsed) \ 273 do { \ 274 StringView view = string_value##sv; \ 275 char const* start = view.characters_without_null_termination(); \ 276 auto result = parse_first_floating_point<double>(start, start + view.length()); \ 277 EXPECT(result.error == AK::FloatingPointError::None); \ 278 EXPECT_EQ(bit_cast<u64>(result.value), bit_cast<u64>(static_cast<double>(double_value))); \ 279 EXPECT_EQ(result.end_ptr - start, chars_parsed); \ 280 } while (false) 281 282 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0x", 0., 1); 283 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e", 0., 1); 284 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e+", 0., 1); 285 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e1", 0., 3); 286 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0beef", 0., 1); 287 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0p123", 0., 1); 288 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e1", 0., 3); 289 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e1abc", 0., 3); 290 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e1e1", 0., 3); 291 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e1+", 0., 3); 292 EXPECT_PARSE_TO_VALUE_AND_CONSUME_CHARS("0e-+1", 0., 1); 293} 294 295TEST_CASE(invalid_parse) 296{ 297#define EXPECT_PARSE_TO_FAIL(string_value) \ 298 do { \ 299 StringView view = string_value##sv; \ 300 char const* start = view.characters_without_null_termination(); \ 301 auto result = parse_first_floating_point<double>(start, start + view.length()); \ 302 EXPECT(result.error == AK::FloatingPointError::NoOrInvalidInput); \ 303 } while (false) 304 305 EXPECT_PARSE_TO_FAIL(""); 306 EXPECT_PARSE_TO_FAIL("e"); 307 EXPECT_PARSE_TO_FAIL("."); 308 EXPECT_PARSE_TO_FAIL("-."); 309 EXPECT_PARSE_TO_FAIL("+."); 310 EXPECT_PARSE_TO_FAIL(".e"); 311 EXPECT_PARSE_TO_FAIL("-.e"); 312 EXPECT_PARSE_TO_FAIL("+.e"); 313 EXPECT_PARSE_TO_FAIL(".e1"); 314 EXPECT_PARSE_TO_FAIL("-.e1"); 315 EXPECT_PARSE_TO_FAIL("+.e1"); 316 317 EXPECT_PARSE_TO_FAIL("++2"); 318 EXPECT_PARSE_TO_FAIL("++1"); 319 EXPECT_PARSE_TO_FAIL("++0"); 320 EXPECT_PARSE_TO_FAIL("++2e1"); 321 EXPECT_PARSE_TO_FAIL("++1e1"); 322 EXPECT_PARSE_TO_FAIL("++0e1"); 323 324#define EXPECT_MULTI_SIGNS_TO_FAIL(base_string) \ 325 EXPECT_PARSE_TO_FAIL("++" base_string); \ 326 EXPECT_PARSE_TO_FAIL("--" base_string); \ 327 EXPECT_PARSE_TO_FAIL("+-" base_string); \ 328 EXPECT_PARSE_TO_FAIL("-+" base_string) 329 330 EXPECT_MULTI_SIGNS_TO_FAIL("1"); 331 EXPECT_MULTI_SIGNS_TO_FAIL("1."); 332 EXPECT_MULTI_SIGNS_TO_FAIL("1e1"); 333 EXPECT_MULTI_SIGNS_TO_FAIL("1.e1"); 334 EXPECT_MULTI_SIGNS_TO_FAIL("1.0e1"); 335 EXPECT_MULTI_SIGNS_TO_FAIL("1.0e+1"); 336 EXPECT_MULTI_SIGNS_TO_FAIL("1.0e-1"); 337} 338 339TEST_CASE(detect_out_of_range_values) 340{ 341#define EXPECT_PARSE_TO_HAVE_ERROR(string_value, error_value) \ 342 do { \ 343 StringView view = string_value##sv; \ 344 char const* start = view.characters_without_null_termination(); \ 345 auto result = parse_first_floating_point<double>(start, start + view.length()); \ 346 EXPECT(result.error == error_value); \ 347 EXPECT(result.end_ptr == start + view.length()); \ 348 } while (false) 349 350 EXPECT_PARSE_TO_HAVE_ERROR("10e-10000", AK::FloatingPointError::RoundedDownToZero); 351 EXPECT_PARSE_TO_HAVE_ERROR("-10e-10000", AK::FloatingPointError::RoundedDownToZero); 352 EXPECT_PARSE_TO_HAVE_ERROR("10e10000", AK::FloatingPointError::OutOfRange); 353 EXPECT_PARSE_TO_HAVE_ERROR("-10e10000", AK::FloatingPointError::OutOfRange); 354} 355 356static bool parse_completely_passes(StringView view) 357{ 358 char const* start = view.characters_without_null_termination(); 359 return parse_floating_point_completely<double>(start, start + view.length()).has_value(); 360} 361 362TEST_CASE(parse_completely_must_be_just_floating_point) 363{ 364#define EXPECT_PARSE_COMPLETELY_TO_FAIL(value) \ 365 EXPECT(!parse_completely_passes(value##sv)) 366 367 EXPECT_PARSE_COMPLETELY_TO_FAIL(""); 368 EXPECT_PARSE_COMPLETELY_TO_FAIL("-"); 369 EXPECT_PARSE_COMPLETELY_TO_FAIL("+"); 370 EXPECT_PARSE_COMPLETELY_TO_FAIL("++1"); 371 EXPECT_PARSE_COMPLETELY_TO_FAIL("+-1"); 372 EXPECT_PARSE_COMPLETELY_TO_FAIL("-+1"); 373 EXPECT_PARSE_COMPLETELY_TO_FAIL("--1"); 374 375 EXPECT_PARSE_COMPLETELY_TO_FAIL("1 "); 376 EXPECT_PARSE_COMPLETELY_TO_FAIL("1. "); 377 EXPECT_PARSE_COMPLETELY_TO_FAIL("1e "); 378 EXPECT_PARSE_COMPLETELY_TO_FAIL("1.e "); 379 EXPECT_PARSE_COMPLETELY_TO_FAIL("1.e123 "); 380 381 EXPECT_PARSE_COMPLETELY_TO_FAIL("-1 "); 382 EXPECT_PARSE_COMPLETELY_TO_FAIL("-1. "); 383 EXPECT_PARSE_COMPLETELY_TO_FAIL("-1e "); 384 EXPECT_PARSE_COMPLETELY_TO_FAIL("-1.e "); 385 EXPECT_PARSE_COMPLETELY_TO_FAIL("-1.e123 "); 386 387 EXPECT_PARSE_COMPLETELY_TO_FAIL("1A"); 388 EXPECT_PARSE_COMPLETELY_TO_FAIL("1.C"); 389 EXPECT_PARSE_COMPLETELY_TO_FAIL("1e*"); 390 EXPECT_PARSE_COMPLETELY_TO_FAIL("1.e("); 391 EXPECT_PARSE_COMPLETELY_TO_FAIL("1.e123]"); 392 EXPECT_PARSE_COMPLETELY_TO_FAIL("1.e123&"); 393 EXPECT_PARSE_COMPLETELY_TO_FAIL("1.e123 "); 394 395 EXPECT_PARSE_COMPLETELY_TO_FAIL(":1234567890"); 396 EXPECT_PARSE_COMPLETELY_TO_FAIL("1:234567890"); 397 EXPECT_PARSE_COMPLETELY_TO_FAIL("12:34567890"); 398 EXPECT_PARSE_COMPLETELY_TO_FAIL("123:4567890"); 399 EXPECT_PARSE_COMPLETELY_TO_FAIL("1234:567890"); 400 EXPECT_PARSE_COMPLETELY_TO_FAIL("12345:67890"); 401 EXPECT_PARSE_COMPLETELY_TO_FAIL("123456:7890"); 402 EXPECT_PARSE_COMPLETELY_TO_FAIL("1234567:890"); 403 EXPECT_PARSE_COMPLETELY_TO_FAIL("12345678:90"); 404 EXPECT_PARSE_COMPLETELY_TO_FAIL("123456789:0"); 405 EXPECT_PARSE_COMPLETELY_TO_FAIL("1234567890:"); 406 407 EXPECT_PARSE_COMPLETELY_TO_FAIL("1;234567890"); 408 EXPECT_PARSE_COMPLETELY_TO_FAIL("1234567;890"); 409 410 EXPECT_PARSE_COMPLETELY_TO_FAIL("1=234567890"); 411 EXPECT_PARSE_COMPLETELY_TO_FAIL("1234567=890"); 412} 413 414static double newhex(char const* view) 415{ 416 auto value = parse_first_hexfloat_until_zero_character<double>(view); 417 VERIFY(value.error == AK::FloatingPointError::None); 418 return value.value; 419} 420 421static float newhexf(char const* view) 422{ 423 auto value = parse_first_hexfloat_until_zero_character<float>(view); 424 VERIFY(value.error == AK::FloatingPointError::None); 425 return value.value; 426} 427 428TEST_CASE(hexfloat) 429{ 430 431#define DOES_PARSE_HEX_DOUBLE_LIKE_CPP(value) \ 432 do { \ 433 EXPECT_EQ(static_cast<double>(value), newhex(#value)); \ 434 EXPECT_EQ(-static_cast<double>(value), newhex("-" #value)); \ 435 } while (false) 436 437#define DOES_PARSE_HEX_FLOAT_LIKE_CPP(value) \ 438 do { \ 439 EXPECT_EQ(static_cast<float>(value##f), newhexf(#value)); \ 440 EXPECT_EQ(-static_cast<float>(value##f), newhexf("-" #value)); \ 441 } while (false) 442 443#define DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(value) \ 444 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(value); \ 445 DOES_PARSE_HEX_FLOAT_LIKE_CPP(value) 446 447 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x123456789ABCDEFp0); 448 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x123456789ABCDEFp+0); 449 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x123456789ABCDEFp-0); 450 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x123456789ABCDEF.p-0); 451 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x123456789ABCDEF.123456789ABCDEFp-0); 452 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x123456789ABCDEF.123456789ABCDEFp-1); 453 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x123456789ABCDEF.123456789ABCDEFp+1); 454 455 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+52); 456 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c0p+52); 457 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c00p+52); 458 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c000p+52); 459 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c001p+52); 460 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+52); 461 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c10001p+52); 462 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c8p+52); 463 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c8001p+52); 464 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c80000000000000000000000000000000000000000000000000000000001p+52); 465 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c80000000000000000000000000000000000000000000000000000000000p+52); 466 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffp+52); 467 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c9p+52); 468 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c9001p+52); 469 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x180eafb89ba47c9.001p+52); 470 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x180eafb89ba47c9.001p-4); 471 472 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-1075); 473 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-1075); 474 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-1040); 475 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-1040); 476 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-999); 477 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-999); 478 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-788); 479 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-788); 480 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-632); 481 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-632); 482 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-408); 483 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-408); 484 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-189); 485 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-189); 486 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-76); 487 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-76); 488 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-52); 489 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-52); 490 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-25); 491 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-25); 492 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-13); 493 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-13); 494 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp-3); 495 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p-3); 496 497 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+3); 498 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+3); 499 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+6); 500 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+6); 501 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+13); 502 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+13); 503 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+19); 504 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+19); 505 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+154); 506 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+154); 507 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+298); 508 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+298); 509 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+455); 510 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+455); 511 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+692); 512 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+692); 513 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+901); 514 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+901); 515 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47cp+1023); 516 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.80eafb89ba47c1p+1023); 517 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x.80eafb89ba47cp+1024); 518 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x.80eafb89ba47c1p+1024); 519 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x.080eafb89ba47cp+1025); 520 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x.080eafb89ba47c1p+1025); 521 522 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.c5e1463479f8ep+218); 523 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.c5e1463479f8e8p+218); 524 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.c5e1463479f8e80p+218); 525 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.c5e1463479f8e800p+218); 526 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.c5e1463479f8e8001p+218); 527 528 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.42100a53adbd5p-1024); 529 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.d542100a53adbp-1023); 530 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.fffffffffffffp-1023); 531 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.fffffffffffff9p-1023); 532 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.fffffffffffff8p-1023); 533 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.fffffffffffff7p-1023); 534 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.fffffffffffff800000001p-1023); 535 536 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1p-1022); 537 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x2p-1022); 538 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x3p-1022); 539 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x1.0p-1022); 540 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x000000000000000000000000000000000001.0p-1022); 541 DOES_PARSE_HEX_DOUBLE_LIKE_CPP(0x000000000000000000000000000000000001.000000000000000000p-1022); 542 543 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xCap0); 544 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xCAp0); 545 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xcAp0); 546 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xcAP0); 547 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xcaP0); 548 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xcap0); 549 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xcap1); 550 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xca.p1); 551 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0xc.ap1); 552 553 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x1.p0); 554 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x11.p0); 555 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x11.p1); 556 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x11.p2); 557 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x11.p-2); 558 DOES_PARSE_HEX_FLOAT_AND_DOUBLE_LIKE_CPP(0x11.p-0); 559} 560 561TEST_CASE(invalid_hex_floats) 562{ 563#define EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS(string_value, double_value, chars_parsed) \ 564 do { \ 565 char const* c_str = string_value; \ 566 auto result = parse_first_hexfloat_until_zero_character<double>(c_str); \ 567 EXPECT(result.error == AK::FloatingPointError::None); \ 568 EXPECT_EQ(bit_cast<u64>(result.value), bit_cast<u64>(static_cast<double>(double_value))); \ 569 EXPECT_EQ(result.end_ptr - c_str, chars_parsed); \ 570 } while (false) 571 572 EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS("0xab.cdpef", 0xab.cdp0, 7); 573 EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS("0xab.cdPef", 0xab.cdp0, 7); 574 EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS("0xab.cdPEf", 0xab.cdp0, 7); 575 EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS("0xab.cdPEF", 0xab.cdp0, 7); 576 EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS("0xAB.cdPEF", 0xab.cdp0, 7); 577 EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS("0xABCDPEF", 0xabcdp0, 6); 578 EXPECT_HEX_PARSE_TO_VALUE_AND_CONSUME_CHARS("0xCAPE", 0xCAp0, 4); 579}