Skip to content

Commit 143055a

Browse files
author
Daniel Lemire
committed
adding a few schemes
1 parent d1ac2ee commit 143055a

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

benchmarks/algorithms.h

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
322341
template<arithmetic_float T>
323342
int 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

336355
template<arithmetic_float T>
337356
int 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

Comments
 (0)