* docs: new design for the documentation site Apply the brand to the Material for MkDocs site: Inter and JetBrains Mono served by the site (upright and real italic), brand colours, blue header band with the syntax pattern, wordmark in the header, new home page (hero, cards, animated feature tour), 404 page, polish for tabs, search, footer, focus rings, tables and code blocks, and theme features (code copy, previous/next footer, TOC follow, search suggestions). Draw the number railroad diagram, the parser callback events and the iterator illustrations as inline SVGs that follow the light and dark scheme. The generator scripts are in docs/mkdocs/scripts/figures; the feature slideshow (json-light.svg, json-dark.svg, replacing json.gif on the home page) is built by docs/mkdocs/scripts/slideshow. Decision nodes in five flowcharts become hexagons, which need far less room. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: add figures, table captions and a macro chooser - Figures with numbered captions: SAX stepper, json_view layout and edit stepper, exception map, JSON pointer and patch walkers, QA pipeline, scaling and binary size charts, roadmap lanes, release timeline, integration decision tree and namespace builder - Table captions (nj-table-caption) on 9 pages - Compile times: modules and PCH charts, filesystem section, re-measured Figure 1, links between features/modules.md and compile_times.md - Interactive macro chooser for features/arbitrary_types.md - Link check: exclude URLs that answer the plugin with 400/401/419 or are dead (customers.md) Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: macro chooser generates adl_serializer for non-default-constructible types Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: cross-link concept pages and API pages in See also sections Add See also links in both directions between the concept pages (features, home, integration) and the API pages, write API links in code font, give every entry a comment after a dash, and show the callback event figure on the parser callbacks page. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * docs: address review comments on the new design - Home: add a "Latest release" button - Sponsors: update the list and group it by tier - Features: list all feature pages on the index page - Releases: add highlights per release, link the 4.0 roadmap, add the first commit to the timeline - Exceptions: prefix all example messages with the exception name - API: no code font for format names in the See also links of the to_/from_ pages - Merge Patch: show the document before, the patch, and the result - Replace "--" with typographic dashes, mark external links with an icon, center Mermaid diagrams Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
4.6 KiB
nlohmann::basic_json::number_float_t
using number_float_t = NumberFloatType;
The type used to store JSON numbers (floating-point).
RFC 8259 describes numbers as follows:
The representation of numbers is similar to that used in most programming languages. A number is represented in base 10 using decimal digits. It contains an integer component that may be prefixed with an optional minus sign, which may be followed by a fraction part and/or an exponent part. Leading zeros are not allowed. (...) Numeric values that cannot be represented in the grammar below (such as Infinity and NaN) are not permitted.
This description includes both integer and floating-point numbers. However, C++ allows more precise storage if it is
known whether the number is a signed integer, an unsigned integer, or a floating-point number. Therefore, three different
types, number_integer_t, number_unsigned_t and number_float_t are
used.
To store floating-point numbers in C++, a type is defined by the template parameter NumberFloatType which chooses the
type to use.
Template parameters
NumberFloatType- the type to store floating-point numbers. The type must be
#!cpp float,#!cpp double, or#!cpp long double. The parser converts#!cpp float,#!cpp double, and a#!cpp long doublethat is IEEE 754 binary64 itself. It converts other#!cpp long doubleformats with#!cpp std::from_charswhere available, or with#!cpp std::strtoldotherwise. Serialization falls back to#!cpp std::snprintf. The binary formats additionally require#!cpp floator#!cpp double, because they have no encoding for#!cpp long double. See Template Parameter Requirements.
Notes
Default type
With the default values for NumberFloatType (double), the default type for number_float_t is #!cpp double.
Default behavior
- The restrictions about leading zeros are not enforced in C++. Instead, leading zeros in floating-point literals will
be ignored. Internally, the value will be stored as a decimal number. For instance, the C++ floating-point literal
01.2will be serialized to1.2. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to
null.
Limits
RFC 8259 states:
This specification allows implementations to set limits on the range and precision of numbers accepted. Since software that implements IEEE 754-2008 binary64 (double precision) numbers is generally available and widely used, good interoperability can be achieved by implementations that expect no more precision or range than these provide, in the sense that implementations will approximate JSON numbers within the expected precision.
This implementation does exactly follow this approach, as it uses double precision floating-point numbers by default.
Note that with the default double, numbers smaller than -1.79769313486232e+308 or greater than
1.79769313486232e+308 are rejected during parsing with
out_of_range.406. Non-finite values (NaN and infinity) can
only be stored by assigning them directly and are serialized to null.
During deserialization (from JSON text or any of the binary formats), a finite number that does not fit into
number_float_t is rejected with out_of_range.406, for
example a double-precision number in a binary format when number_float_t is #!cpp float.
Storage
Floating-point number values are stored directly inside a basic_json type.
Examples
??? example
The following code shows that `number_float_t` is by default, a typedef to `#!cpp double`.
```cpp
--8<-- "examples/number_float_t.cpp"
```
Output:
```json
--8<-- "examples/number_float_t.output"
```
See also
number_integer_t- the type used to store JSON integer numbersnumber_unsigned_t- the type used to store JSON unsigned integer numbersis_number_float- checks whether the JSON value is a floating-point number- Number Handling - the article on number handling
- Template Parameter Requirements - requirements on the number template parameters
Version history
- Added in version 1.0.0.