Skip to content

Commit c7d9175

Browse files
authored
Merge pull request #49 from fastfloat/try_new_int
New string generator
2 parents a50e26a + 143055a commit c7d9175

File tree

4 files changed

+805
-6
lines changed

4 files changed

+805
-6
lines changed

benchmarks/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
2+
include_directories(../include)
13
add_executable(benchmark
24
benchmark.cpp
35
)

benchmarks/algorithms.h

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
#define YY_DOUBLE_SUPPORTED 0
4545
#endif
4646

47+
#include "champagne_lemire/champagne_lemire.h"
48+
4749
template<arithmetic_float T>
4850
struct BenchArgs {
4951
using Type = T;
@@ -317,6 +319,25 @@ int schubfach(T d, std::span<char>& buffer) {
317319
return schubfach::Dtoa(buffer.data(), d) - buffer.data();
318320
}
319321

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+
320341
template<arithmetic_float T>
321342
int dragonbox(T d, std::span<char>& buffer) {
322343
const char* end_ptr = jkj::dragonbox::to_chars(d, buffer.data());
@@ -333,15 +354,16 @@ int ryu(T d, std::span<char>& buffer) {
333354

334355
template<arithmetic_float T>
335356
int teju_jagua(T d, std::span<char>& buffer) {
336-
if(d == 0.0) {
337-
std::copy_n("0E0", 3, buffer.data());
338-
return 3;
339-
}
340357
const auto fields = teju::traits_t<T>::teju(d);
341-
const bool sign = std::signbit(d);
342-
return to_chars(fields.mantissa, fields.exponent, sign, buffer.data());
358+
char * output = buffer.data();
359+
output[0] = '-';
360+
if(std::signbit(d)) {
361+
output++;
362+
}
363+
return champagne_lemire::to_chars(fields.mantissa, fields.exponent, output) + (std::signbit(d) ? 1 : 0);
343364
}
344365

366+
345367
template<arithmetic_float T>
346368
int double_conversion(T d, std::span<char>& buffer) {
347369
using namespace double_conversion;
@@ -586,6 +608,7 @@ std::vector<BenchArgs<T>> initArgs(bool use_errol = false, size_t repeat = 0, si
586608
args.emplace_back("grisu3" , wrap(s::grisu3<T>) , std::is_same_v<T, double>);
587609
args.emplace_back("grisu_exact" , wrap(s::grisu_exact<T>) , true);
588610
args.emplace_back("schubfach" , wrap(s::schubfach<T>) , true);
611+
args.emplace_back("dragonboxlm" , wrap(s::dragonboxlm<T>) , true);
589612
args.emplace_back("dragonbox" , wrap(s::dragonbox<T>) , true);
590613
args.emplace_back("ryu" , wrap(s::ryu<T>) , true);
591614
args.emplace_back("teju_jagua" , wrap(s::teju_jagua<T>) , true);

benchmarks/benchmark.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* data generated.
88
*/
99

10+
#include "champagne_lemire/champagne_lemire.h"
1011
#include "algorithms.h"
1112
#define IEEE_8087
1213
#include "benchutil.h"

0 commit comments

Comments
 (0)