STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
detail::dtoa_impl Namespace Reference

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

Classes

struct  diyfp
struct  boundaries
struct  cached_power

Functions

template<typename Target, typename Source>
Target reinterpret_bits (const Source source)
template<typename FloatType>
boundaries compute_boundaries (FloatType value)
 Compute the (normalized) diyfp representing the input number 'value' and its boundaries.
cached_power get_cached_power_for_binary_exponent (int e)
 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]).
int find_largest_pow10 (const std::uint32_t n, std::uint32_t &pow10)
 For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k.
void grisu2_round (char *buf, int len, std::uint64_t dist, std::uint64_t delta, std::uint64_t rest, std::uint64_t ten_k)
void grisu2_digit_gen (char *buffer, int &length, int &decimal_exponent, diyfp M_minus, diyfp w, diyfp M_plus)
 Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+.
void grisu2 (char *buf, int &len, int &decimal_exponent, diyfp m_minus, diyfp v, diyfp m_plus)
 v = buf * 10^decimal_exponent len is the length of the buffer (number of decimal digits) The buffer must be large enough, i.e.
template<typename FloatType>
void grisu2 (char *buf, int &len, int &decimal_exponent, FloatType value)
 v = buf * 10^decimal_exponent len is the length of the buffer (number of decimal digits) The buffer must be large enough, i.e.
JSON_HEDLEY_RETURNS_NON_NULL char * append_exponent (char *buf, int e)
 appends a decimal representation of e to buf
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

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 * detail::dtoa_impl::append_exponent ( char * buf,
int e )
inline

appends a decimal representation of e to buf

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

Definition at line 17835 of file json.hpp.

References append_exponent(), and JSON_ASSERT.

Referenced by append_exponent(), and format_buffer().

◆ compute_boundaries()

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

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

Precondition
value must be finite and positive

Definition at line 17096 of file json.hpp.

References compute_boundaries(), detail::dtoa_impl::diyfp::e, detail::dtoa_impl::diyfp::f, JSON_ASSERT, detail::dtoa_impl::diyfp::normalize(), detail::dtoa_impl::diyfp::normalize_to(), reinterpret_bits(), and detail::static_const< T >::value.

Referenced by compute_boundaries(), and grisu2().

◆ find_largest_pow10()

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

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 17399 of file json.hpp.

References find_largest_pow10().

Referenced by find_largest_pow10(), and grisu2_digit_gen().

◆ format_buffer()

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

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 17887 of file json.hpp.

References append_exponent(), format_buffer(), and JSON_ASSERT.

Referenced by format_buffer(), and detail::to_chars().

◆ get_cached_power_for_binary_exponent()

cached_power detail::dtoa_impl::get_cached_power_for_binary_exponent ( int e)
inline

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 17235 of file json.hpp.

References detail::dtoa_impl::cached_power::e, get_cached_power_for_binary_exponent(), JSON_ASSERT, kAlpha, and kGamma.

Referenced by get_cached_power_for_binary_exponent(), and grisu2().

◆ grisu2() [1/2]

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

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 17735 of file json.hpp.

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

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

◆ grisu2() [2/2]

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

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 17795 of file json.hpp.

References compute_boundaries(), grisu2(), JSON_ASSERT, detail::dtoa_impl::diyfp::kPrecision, detail::dtoa_impl::boundaries::minus, detail::dtoa_impl::boundaries::plus, detail::static_const< T >::value, and detail::dtoa_impl::boundaries::w.

◆ grisu2_digit_gen()

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

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 17494 of file json.hpp.

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

Referenced by grisu2(), and grisu2_digit_gen().

◆ grisu2_round()

void 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 )
inline

Definition at line 17453 of file json.hpp.

References grisu2_round(), and JSON_ASSERT.

Referenced by grisu2_digit_gen(), and grisu2_round().

◆ reinterpret_bits()

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

Definition at line 16955 of file json.hpp.

References reinterpret_bits(), and target.

Referenced by compute_boundaries(), and reinterpret_bits().

Variable Documentation

◆ kAlpha

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

Definition at line 17218 of file json.hpp.

Referenced by get_cached_power_for_binary_exponent(), and grisu2_digit_gen().

◆ kGamma

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

Definition at line 17219 of file json.hpp.

Referenced by get_cached_power_for_binary_exponent(), and grisu2_digit_gen().