nlohmann::detail::dtoa_impl Namespace Reference

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

## Classes

struct | boundaries
struct | cached_power
struct | diyfp

## Functions

template<typename Target , typename Source >
Target | reinterpret_bits (const Source source)
template<typename FloatType >
boundaries | compute_boundaries (FloatType value)
cached_power | get_cached_power_for_binary_exponent (int e)
int | find_largest_pow10 (const std::uint32_t n, std::uint32_t &pow10)
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)
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)
JSON_HEDLEY_RETURNS_NON_NULL char * | append_exponent (char *buf, int e)
| appends a decimal representation of e to buf More...
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 More...

## 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
| ) |  |

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

References JSON_ASSERT, JSON_HEDLEY_NON_NULL, and JSON_HEDLEY_RETURNS_NON_NULL.

Referenced by format_buffer().

## compute_boundaries()

template<typename FloatType >

boundaries nlohmann::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 15029 of file json.hpp.

References nlohmann::detail::dtoa_impl::diyfp::e, nlohmann::detail::dtoa_impl::diyfp::f, JSON_ASSERT, and nlohmann::detail::value.

Referenced by grisu2().

## find_largest_pow10()

int nlohmann::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 15332 of file json.hpp.

Referenced by grisu2_digit_gen().

## 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
| ) |  |

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

References append_exponent(), JSON_ASSERT, JSON_HEDLEY_NON_NULL, and JSON_HEDLEY_RETURNS_NON_NULL.

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

## get_cached_power_for_binary_exponent()

cached_power nlohmann::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 15168 of file json.hpp.

References JSON_ASSERT.

Referenced by grisu2().

## grisu2() [1/2]

void nlohmann::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 15668 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, JSON_HEDLEY_NON_NULL, and nlohmann::detail::dtoa_impl::cached_power::k.

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

## grisu2() [2/2]

template<typename FloatType >

void nlohmann::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 15728 of file json.hpp.

References compute_boundaries(), JSON_ASSERT, JSON_HEDLEY_NON_NULL, JSON_HEDLEY_RETURNS_NON_NULL, nlohmann::detail::dtoa_impl::boundaries::minus, nlohmann::detail::dtoa_impl::boundaries::plus, 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
| ) |  |

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

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

Referenced by grisu2().

## 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
| ) |  |

inline

Definition at line 15386 of file json.hpp.

References JSON_ASSERT.

Referenced by grisu2_digit_gen().

## reinterpret_bits()

template<typename Target , typename Source >

Target nlohmann::detail::dtoa_impl::reinterpret_bits | ( | const Source | source | ) |

Definition at line 14888 of file json.hpp.

## Variable Documentation

## kAlpha

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

Definition at line 15151 of file json.hpp.

## kGamma

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

Definition at line 15152 of file json.hpp.