@@ -319,6 +319,25 @@ int schubfach(T d, std::span<char>& buffer) {
319319 return schubfach::Dtoa (buffer.data (), d) - buffer.data ();
320320}
321321
322+ template <arithmetic_float T>
323+ int dragonboxlm (T d, std::span<char >& buffer) {
324+ char * output = buffer.data ();
325+ output[0 ] = ' -' ;
326+ if (std::signbit (d)) {
327+ output++;
328+ }
329+ // to_decimal requires a finite non-zero value.
330+ if (d == 0.0 ) {
331+ std::memcpy (output, " 0." , 2 );
332+ return 2 + (std::signbit (d) ? 1 : 0 );
333+ }
334+ auto decimal = jkj::dragonbox::to_decimal (d, jkj::dragonbox::policy::sign::ignore, jkj::dragonbox::policy::cache::full);
335+ auto exponent = decimal.exponent ;
336+ auto mantissa = decimal.significand ;
337+ return champagne_lemire::to_chars (mantissa, exponent, output) + (std::signbit (d) ? 1 : 0 );
338+ }
339+
340+
322341template <arithmetic_float T>
323342int dragonbox (T d, std::span<char >& buffer) {
324343 const char * end_ptr = jkj::dragonbox::to_chars (d, buffer.data ());
@@ -335,14 +354,13 @@ int ryu(T d, std::span<char>& buffer) {
335354
336355template <arithmetic_float T>
337356int teju_jagua (T d, std::span<char >& buffer) {
357+ const auto fields = teju::traits_t <T>::teju (d);
338358 char * output = buffer.data ();
339359 output[0 ] = ' -' ;
340360 if (std::signbit (d)) {
341361 output++;
342- // d = -d; // unnecessary, teju handles sign?
343362 }
344- const auto fields = teju::traits_t <T>::teju (d);
345- return champagne_lemire::to_chars (fields.mantissa , fields.exponent , output);
363+ return champagne_lemire::to_chars (fields.mantissa , fields.exponent , output) + (std::signbit (d) ? 1 : 0 );
346364}
347365
348366
@@ -590,6 +608,7 @@ std::vector<BenchArgs<T>> initArgs(bool use_errol = false, size_t repeat = 0, si
590608 args.emplace_back (" grisu3" , wrap (s::grisu3<T>) , std::is_same_v<T, double >);
591609 args.emplace_back (" grisu_exact" , wrap (s::grisu_exact<T>) , true );
592610 args.emplace_back (" schubfach" , wrap (s::schubfach<T>) , true );
611+ args.emplace_back (" dragonboxlm" , wrap (s::dragonboxlm<T>) , true );
593612 args.emplace_back (" dragonbox" , wrap (s::dragonbox<T>) , true );
594613 args.emplace_back (" ryu" , wrap (s::ryu<T>) , true );
595614 args.emplace_back (" teju_jagua" , wrap (s::teju_jagua<T>) , true );
0 commit comments