Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
nlohmann::detail::dtoa_impl Namespace Reference

implements the Grisu2 algorithm for binary to decimal floating-point conversion. More...

Data Structures

struct  boundaries
 
struct  cached_power
 
struct  diyfp
 

Functions

JSON_HEDLEY_RETURNS_NON_NULL char * append_exponent (char *buf, int e)
 appends a decimal representation of e to buf
 
template<typename FloatType >
boundaries compute_boundaries (FloatType value)
 
int find_largest_pow10 (const std::uint32_t n, std::uint32_t &pow10)
 
JSON_HEDLEY_RETURNS_NON_NULL char * format_buffer (char *buf, int len, int decimal_exponent, int min_exp, int max_exp)
 prettify v = buf * 10^decimal_exponent
 
cached_power get_cached_power_for_binary_exponent (int e)
 
void grisu2 (char *buf, int &len, int &decimal_exponent, diyfp m_minus, diyfp v, diyfp m_plus)
 
template<typename FloatType >
void grisu2 (char *buf, int &len, int &decimal_exponent, FloatType value)
 
void grisu2_digit_gen (char *buffer, int &length, int &decimal_exponent, diyfp M_minus, diyfp w, diyfp M_plus)
 
void grisu2_round (char *buf, int len, std::uint64_t dist, std::uint64_t delta, std::uint64_t rest, std::uint64_t ten_k)
 
template<typename Target , typename Source >
Target reinterpret_bits (const Source source)
 

Variables

constexpr int kAlpha = -60
 
constexpr int kGamma = -32
 

Detailed Description

implements the Grisu2 algorithm for binary to decimal floating-point conversion.

This implementation is a slightly modified version of the reference implementation which may be obtained from http://florian.loitsch.com/publications (bench.tar.gz).

The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch.

For a detailed description of the algorithm see:

[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming Language Design and Implementation, PLDI 2010 [2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language Design and Implementation, PLDI 1996

Function Documentation

◆ append_exponent()

JSON_HEDLEY_RETURNS_NON_NULL char * nlohmann::detail::dtoa_impl::append_exponent ( char *  buf,
int  e 
)
inlineprivate

appends a decimal representation of e to buf

Returns
a pointer to the element following the exponent.
Precondition
-1000 < e < 1000

Definition at line 15863 of file json.hpp.

References JSON_ASSERT.

Referenced by format_buffer().

Here is the caller graph for this function:

◆ compute_boundaries()

template<typename FloatType >
boundaries nlohmann::detail::dtoa_impl::compute_boundaries ( FloatType  value)
private

Compute the (normalized) diyfp representing the input number 'value' and its boundaries.

Precondition
value must be finite and positive

Definition at line 15124 of file json.hpp.

References nlohmann::detail::dtoa_impl::diyfp::e, nlohmann::detail::dtoa_impl::diyfp::f, JSON_ASSERT, nlohmann::detail::dtoa_impl::diyfp::normalize(), nlohmann::detail::dtoa_impl::diyfp::normalize_to(), and nlohmann::detail::value.

Referenced by grisu2().

Here is the caller graph for this function:

◆ find_largest_pow10()

int nlohmann::detail::dtoa_impl::find_largest_pow10 ( const std::uint32_t  n,
std::uint32_t &  pow10 
)
inlineprivate

For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. For n == 0, returns 1 and sets pow10 := 1.

Definition at line 15427 of file json.hpp.

Referenced by grisu2_digit_gen().

Here is the caller graph for this function:

◆ format_buffer()

JSON_HEDLEY_RETURNS_NON_NULL char * nlohmann::detail::dtoa_impl::format_buffer ( char *  buf,
int  len,
int  decimal_exponent,
int  min_exp,
int  max_exp 
)
inlineprivate

prettify v = buf * 10^decimal_exponent

If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point notation. Otherwise it will be printed in exponential notation.

Precondition
min_exp < 0
max_exp > 0

Definition at line 15915 of file json.hpp.

References append_exponent(), and JSON_ASSERT.

Referenced by nlohmann::detail::to_chars().

Here is the caller graph for this function:

◆ get_cached_power_for_binary_exponent()

cached_power nlohmann::detail::dtoa_impl::get_cached_power_for_binary_exponent ( int  e)
inlineprivate

For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c satisfies (Definition 3.2 from [1])

 alpha <= e_c + e + q <= gamma.

Definition at line 15263 of file json.hpp.

References nlohmann::detail::dtoa_impl::cached_power::e, JSON_ASSERT, kAlpha, and kGamma.

Referenced by grisu2().

Here is the caller graph for this function:

◆ grisu2() [1/2]

void nlohmann::detail::dtoa_impl::grisu2 ( char *  buf,
int &  len,
int &  decimal_exponent,
diyfp  m_minus,
diyfp  v,
diyfp  m_plus 
)
inlineprivate

v = buf * 10^decimal_exponent len is the length of the buffer (number of decimal digits) The buffer must be large enough, i.e. >= max_digits10.

Definition at line 15763 of file json.hpp.

References nlohmann::detail::dtoa_impl::diyfp::e, nlohmann::detail::dtoa_impl::cached_power::e, nlohmann::detail::dtoa_impl::diyfp::f, nlohmann::detail::dtoa_impl::cached_power::f, get_cached_power_for_binary_exponent(), grisu2_digit_gen(), JSON_ASSERT, nlohmann::detail::dtoa_impl::cached_power::k, and nlohmann::detail::dtoa_impl::diyfp::mul().

Referenced by grisu2(), and nlohmann::detail::to_chars().

Here is the caller graph for this function:

◆ grisu2() [2/2]

template<typename FloatType >
void nlohmann::detail::dtoa_impl::grisu2 ( char *  buf,
int &  len,
int &  decimal_exponent,
FloatType  value 
)
private

v = buf * 10^decimal_exponent len is the length of the buffer (number of decimal digits) The buffer must be large enough, i.e. >= max_digits10.

Definition at line 15823 of file json.hpp.

References compute_boundaries(), grisu2(), JSON_ASSERT, nlohmann::detail::dtoa_impl::diyfp::kPrecision, nlohmann::detail::dtoa_impl::boundaries::minus, nlohmann::detail::dtoa_impl::boundaries::plus, nlohmann::detail::value, and nlohmann::detail::dtoa_impl::boundaries::w.

◆ grisu2_digit_gen()

void nlohmann::detail::dtoa_impl::grisu2_digit_gen ( char *  buffer,
int &  length,
int &  decimal_exponent,
diyfp  M_minus,
diyfp  w,
diyfp  M_plus 
)
inlineprivate

Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. M- and M+ must be normalized and share the same exponent -60 <= e <= -32.

Definition at line 15522 of file json.hpp.

References nlohmann::detail::dtoa_impl::diyfp::e, nlohmann::detail::dtoa_impl::diyfp::f, find_largest_pow10(), grisu2_round(), JSON_ASSERT, kAlpha, kGamma, and nlohmann::detail::dtoa_impl::diyfp::sub().

Referenced by grisu2().

Here is the caller graph for this function:

◆ grisu2_round()

void nlohmann::detail::dtoa_impl::grisu2_round ( char *  buf,
int  len,
std::uint64_t  dist,
std::uint64_t  delta,
std::uint64_t  rest,
std::uint64_t  ten_k 
)
inlineprivate

Definition at line 15481 of file json.hpp.

References JSON_ASSERT.

Referenced by grisu2_digit_gen().

Here is the caller graph for this function:

◆ reinterpret_bits()

template<typename Target , typename Source >
Target nlohmann::detail::dtoa_impl::reinterpret_bits ( const Source  source)
private

Definition at line 14983 of file json.hpp.

Variable Documentation

◆ kAlpha

constexpr int nlohmann::detail::dtoa_impl::kAlpha = -60
constexprprivate

Definition at line 15246 of file json.hpp.

Referenced by get_cached_power_for_binary_exponent(), and grisu2_digit_gen().

◆ kGamma

constexpr int nlohmann::detail::dtoa_impl::kGamma = -32
constexprprivate

Definition at line 15247 of file json.hpp.

Referenced by get_cached_power_for_binary_exponent(), and grisu2_digit_gen().