<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.31 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-numbers-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="CBOR Numbers">On Numbers in CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-numbers-03"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2026" month="March" day="01"/>
    <area>Applications and Real-Time</area>
    <workgroup>Concise Binary Object Representation Maint&amp;Ext</workgroup>
    <abstract>
      <?line 106?>

<t>The Concise Binary Object Representation (CBOR), as defined in STD 94 (RFC 8949), is a data representation format whose design goals include the
possibility of extremely small code size, fairly small message
size, and extensibility without the need for version negotiation.</t>
      <t>Among the kinds of data that a data representation format needs to be
able to carry, numbers have a prominent role, but also have
inherent complexity that needs attention from protocol designers,
from implementers of CBOR
libraries, and from implementers of the applications that use them.</t>
      <t>This document gives an overview over number formats available in
CBOR and some notable CBOR tags registered, and it attempts to
provide information about opportunities and potential pitfalls of these
number formats.</t>
      <t><cref anchor="disclaimer">This is still rather drafty, pieced
together from various components, so it has a higher level of
redundancy than ultimately desired.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-bormann-cbor-numbers/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Concise Binary Object Representation Maintenance and Extensions Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cabo/cbor-numbers"/>.</t>
    </note>
  </front>
  <middle>
    <?line 135?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The Concise Binary Object Representation (CBOR), as defined in RFC 8949 <xref target="STD94"/>, is a data representation format whose design goals include the
possibility of extremely small code size, fairly small message
size, and extensibility without the need for version negotiation.</t>
      <t>Among the kinds of data that a data representation format needs to be
able to carry, numbers have a prominent role, but also have
inherent complexity that needs attention from protocol designers,
from implementers of CBOR
libraries, and from implementers of the applications that use them.</t>
      <t>This document gives an overview over number formats available in
CBOR and some notable CBOR tags registered, and it attempts to
provide information about opportunities and potential pitfalls of these
number formats.</t>
      <t>It discusses CBOR representation of numbers in four main Sections:</t>
      <ul spacing="normal">
        <li>
          <t><xref format="title" target="sec-int"/> (<xref target="sec-int"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-ieee"/> (<xref target="sec-ieee"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-float"/> (<xref target="sec-float"/>),</t>
        </li>
        <li>
          <t><xref format="title" target="sec-array"/> (<xref target="sec-array"/>).</t>
        </li>
      </ul>
      <t>These sections will generally address considerations such as:</t>
      <ul spacing="normal">
        <li>
          <t>Encoding efficiency (number of bytes needed), possibly processing
efficiency (CPU used in processing)</t>
        </li>
        <li>
          <t>Preferred Serialization, Common Deterministic Encoding (CDE,
<xref target="I-D.ietf-cbor-cde"/>, see also <xref target="I-D.bormann-cbor-det"/> for more background discussion)</t>
        </li>
        <li>
          <t>Use by applications</t>
        </li>
        <li>
          <t>Interoperability considerations, potential "dark corners"</t>
        </li>
      </ul>
      <t>CBOR defines an interchange format for various kinds of number-like data
items, some right in <xref target="STD94"/>, some via the definition of additional
tags (see also <xref target="sec-float"/>).
Implementations on a specific platform will want to map the
transferred data items into the data types available on the platform
or new data types defined by the CBOR implementation.
The ranges of the various formats provided for numbers in the interchange format are
not always congruent with the platform types of a specific platform,
so some design effort may be required to define a platform-specific API.
Apart from a relatively strong dividing line between integer and
floating point data items, the interchanged data items make no
statement on which platform-specific type should be used to ingest the
item into.
Designers of CBOR-based protocols can decide to define their application
data types with a view to platform types that are likely to be
available on the target platforms.</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="BCP14"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>Terms and definitions from <xref target="STD94"/>, <xref target="RFC8610"/>, and <xref target="IEEE754"/> apply.</t>
        <t>The somewhat stilted term "floating point datum" from <xref target="IEEE754"/> (a
superset of "floating point number") is usually expressed as "floating
point value" .
(Note that <xref target="RFC8949"/> is not always very precise in this, using the
term "floating point number" almost as a synonym for "floating point
value".)</t>
      </section>
    </section>
    <section anchor="sec-int">
      <name>Integer Numbers</name>
      <t>CBOR provides representations of integer numbers in unsigned and negative forms:</t>
      <ul spacing="normal">
        <li>
          <t>Unsigned integers up to 2<sup>64</sup>−1, major type 0</t>
        </li>
        <li>
          <t>Negative integers down to −2<sup>64</sup>, major type 1</t>
        </li>
        <li>
          <t>Unsigned integers with no size limitations, tag 2 on a byte string</t>
        </li>
        <li>
          <t>Negative integers with no size limitations, tag 3 on a byte string</t>
        </li>
      </ul>
      <t>The latter two forms are often called "bignums" for historical
reasons, contrasting them to the former "basic" integers; we'll try to
avoid the term as it can be confused with platform-specific types such
as BigInt in JavaScript.
The Concise Data Definition
Language (CDDL) <xref target="RFC8610"/> has the types <tt>uint</tt>,
<tt>nint</tt>, and <tt>int</tt>, for the ranges of values covered by major type 0,
major type 1, and either of them, respectively; <tt>biguint</tt>, <tt>bignint</tt>,
and <tt>bigint</tt> for the range of value covered by tag 2, tag3, and either;
and <tt>unsigned</tt> and <tt>integer</tt> for a choice of either form (but
interestingly no <tt>negative</tt>).
<!-- XXX equivalence -->
As the preferred encoding for an integer chooses between major type
0/1 and tag 2/3 automatically, in practice <tt>biguint</tt> and <tt>unsigned</tt>
are the same type, as are <tt>bigint</tt> and <tt>integer</tt>.</t>
      <t>Applications that want to constrain the ranges of numbers in a way
less dependent on CBOR serialization specifics can find useful CDDL
number and number range definitions in <xref target="USEFUL-CDDL"/>.</t>
      <t>The Major type 0 numbers come in five different encoding sizes, as
indicated by their initial byte:
immediate ("1+0") encoding (0..23), one-byte ("1+1") (0..255),
two-byte ("1+2", 0..65535), four-byte, and eight-byte.
The Preferred Serialization always uses the shortest of the major type
0 encodings
available for an unsigned integer.
The intention is that there is no semantic difference between the different
major type 0 encodings of the same value, and there also is no
semantic difference between major type 0 and tag 2.
This means that Preferred Serialization always uses major type 0
over tag 2 when possible, and the shortest encoding of these (and thus no leading
zero bytes for the tagged encodings).
Major type 1 and tag 3 are analogous.</t>
      <t>Note that there is no "signed type" in CBOR: as any specific number to
be represented is either negative or not, it is represented as an
unsigned integer or as a negative integer.
Major type 0 unsigned integers cover exactly the range of widely used platform
types such as <tt>uint64_t</tt> or <tt>u64</tt>.
Signed platform types such as <tt>int64_t</tt> or <tt>i64</tt> can be represented in
the lower half of the unsigned space and the upper half of the
negative space.
Platforms typically have no <tt>nint64_t</tt> type that could take all
negative numbers representable in major type 1; generic decoders will
therefore treat the lower half of the negative space in the same way
they will treat tag 2/3 values that do not fit the signed platform type.
Similarly, generic encoders for a platform with <tt>u128</tt>/<tt>i128</tt> types
will choose between major type 0/1 and tag 2/3 just like they would
choose between the encoding sizes inside major type 0/1.</t>
      <t>While additional representation of integers could be developed, the
options already provided by <xref target="STD94"/> should be able to satisfy most
applications.</t>
    </section>
    <section anchor="sec-ieee">
      <name>IEEE 754 Floating Point Values</name>
      <t>While integer numbers are relatively easy to represent, floating point
numbers as a realization of rational or real numbers are a much more
varied subject.  Many rational or real numbers require rounding until
they can be encoded as a floating point number.</t>
      <t>There are many choices that can be made when designing a machine
representation for floating point numbers.
After decades of vendor-specific formats, IEEE standardized <xref target="IEEE754"/>,
initially in 1985, updated in 2008 and then 2019 (IEC 559 is then mirroring
IEEE 754).
This standard is widely adopted in hardware and software, offering
choices such as binary vs. decimal floating point numbers, and
different representation sizes.
Out of the large choice available, CBOR directly uses the three
formats binary16, binary32, and binary64, i.e., the signed binary
floating point formats in 16, 32, and 64 bits, colloquially known as
half (16 bits), single (32 bits), and double (64 bits) precision.
Most platforms that support floating point computation support at
least single precision, except for the most constrained ones also
double precision, while half precision is mostly used for storage and
interchange only and may be software-supported only.</t>
      <section anchor="integer-vs-floating-point">
        <name>Integer vs. Floating Point</name>
        <t>Mathematically speaking, integer numbers are a subset of the rational
or real numbers from which floating point numbers are drawn.
In many programming environments, however, integer numbers are clearly
separated from floating point numbers (the most notable exception
being the original JavaScript language, which only had one number type).</t>
        <t>For specific applications, it may be desirable to represent all
numbers that can be represented as integers as such, even if they are
used where floating point numbers are used for non-integers.
<xref target="I-D.mcnally-deterministic-cbor"/> defines application-level deterministic representation
rules that can be used with CDE to enforce this for
a certain subset of the integers.</t>
        <t>Most CBOR applications so far have tended to get by with the kind of
strong separation between the integer and floating point worlds that
programming environments usually favor, so our focus will not be on
approaches for intermingling them in this document.</t>
      </section>
      <section anchor="considerations-for-non-finite-numbers-and-non-numbers">
        <name>Considerations for non-finite numbers and non-numbers</name>
        <t>IEEE754 distinguishes three sets of floating point data item (termed
<em>floating point datum</em> in <xref target="IEEE754"/>, also simply called <em>floating
point value</em> in CBOR-related documents), not
all of which are termed <em>floating point numbers</em>:</t>
        <ul spacing="normal">
          <li>
            <t>finite floating-point number: A finite number that is representable
in a floating-point format.  Note that these further divide into
zero, subnormal, and normal; this distinction is usually not of
interest in interchange, except that there are a few platforms with
limited floating point support that may not support subnormal
numbers.</t>
          </li>
          <li>
            <t>infinite floating-point number: One of the two values −Infinite and
(positive) Infinite.
On many platforms, infinite numbers can be accessed via a floating
point operation such as 1.0/0.0 (positive infinity) or −1.0/0.0
(negative infinity); they react to comparisons as one would expect.</t>
          </li>
          <li>
            <t>NaN: a <em>floating point datum</em> that is not a number (NaN), used to
represent computations that did not lead to a numeric result, not
even an infinity.
A commonly implemented example for such a computation is 0.0/0.0.
The formats provide a way to include additional information with a
NaN, such as its sign bit, whether operations on the NaN are
intended to fail immediately (signaling) or just return another NaN
(quiet), and some remaining bits that may carry additional
information (intended as diagnostic).  </t>
            <t>
It can be surprising that according to <xref target="IEEE754"/>, NaN values always
compare as different even if they have the same NaN information
(i.e., are identical).  (There is also a totalorder relation that
does give NaNs a defined place, depending on their sign bits; this
only recently has been standardized as part of std::strong_order in
C++20 <xref target="Cplusplus20"/>.)</t>
          </li>
        </ul>
        <t>Not all platforms that can use IEEE 754 do provide all these sets (or
all elements of all sets), e.g.,
Erlang only provides finite floating-point numbers.
Platforms that do provide them widely vary in the way they provide
access to non-finite numbers and NaNs beyond the floating point
operations given above.
Usually there is an operation such as <tt>isnan()</tt> in C, which is needed
as comparison of any floating point value (including NaNs) to a NaN
always yields inequality.</t>
        <section anchor="protocol-design-considerations">
          <name>Protocol Design Considerations</name>
          <t>CBOR does not attempt to invent a new floating point architecture, but
adopts the architecture defined in <xref target="IEEE754"/> in a whole-sale fashion.</t>
          <t>CBOR supports the interchange of all kinds of IEEE 754 data items,
including non-finite numbers and non-numbers (NaNs).</t>
          <t>For an application developer that is already using IEEE 754 floating
point, there is little additional consideration required:
Both infinities and NaN are widely supported in IEEE-754 hardware and
software by CPUs, OS’s and programming environments.
CBOR protocol designs can generally rely on infinities and NaN as a
concept being supported, but implementations may run into dark corners
of their platforms when it comes to distinguishing and preserving NaN
information in NaN values.</t>
          <t>However, for a protocol that wants to achieve good interoperability
over a wide variety of platforms, the fact that platforms differ in
their support of non-finite numbers and NaNs becomes relevant.
(See <xref target="implcons"/> below for reasons for such differences.)
Protocol designs aiming for the widest possible platform support may
want to implement replacements for infinite numbers and NaNs, or at
least not rely on NaN information being successfully preserved during
interchange.</t>
          <section anchor="use-cases-for-full-support-of-nan-values">
            <name>Use Cases for Full Support of NaN Values</name>
            <t>Given the dark corners mentioned, a CBOR implementer might question
whether there even are good use cases for full NaN support.
The author conjectures that the main use case will be moving existing
complex algorithms from a monolithic implementation to a distributed one.
A data representation format is generally needed for this, and CBOR
may be a good choice if the target environment is not entirely
homogeneous.
Since existing algorithms may make use of IEEE 754 including its NaN
values, full support for inserting CBOR intermediate representation
into an algorithm implies full support for NaNs.
(This also means that the main objective for such implementations is
full data transparency, not necessary great internal APIs for dealing
with the data — IEEE 754 is that API!)</t>
          </section>
          <section anchor="json-compatibility">
            <name>JSON Compatibility</name>
            <t>Note that JSON supports neither infinite numbers nor NaN.
For protocols that are intended to work in both CBOR and JSON
representations and need an out-of-band indicator comparable to NaN, a
protocol developer might consider this (in CDDL, where <tt>float</tt> is not
intended to be a NaN value):</t>
            <sourcecode type="cddl"><![CDATA[
float-with-null = float / null
]]></sourcecode>
            <t>Additional choices can be added for the infinities (e.g., <tt>false</tt> and
<tt>true</tt>, to stay within the CBOR simple values), if required.</t>
            <t>Since <tt>null</tt>, <tt>false</tt> and <tt>true</tt> have single-byte representations, the
replacement of NaN, −Infinity, and (positive) Infinity by these values can save
bytes even if JSON compatibility is not a consideration.</t>
            <t>Applications that need to preserve the information in a NaN (sign bit,
quiet bit, payload) may want to replace <tt>null</tt> with an
application-oriented representation of that information, or simply
with a (left-aligned, truncating trailing zero bytes) byte string
representing those bits:</t>
            <sourcecode type="cddl"><![CDATA[
float-with-nan-replacement = float / bytes
]]></sourcecode>
            <t>For JSON, the byte string can be base16- or base64-encoded, or it can
be represented by an integer, preserving its left-aligned nature, or
even as a (tagged) floating point value with a different exponent.</t>
          </section>
        </section>
        <section anchor="implcons">
          <name>Implementation Considerations</name>
          <t>All floating-point numbers, including zeros and infinities, are signed.
A NaN also carries a sign bit.
Each of the three formats binary16, binary32, and binary64 define a
fixed assignment of bits in the representation towards the sign bit,
an exponent, and a "significand" (which represents the mantissa, with
details sometimes depending on the specific exponent value).</t>
          <table anchor="tab-bits">
            <name>Bit Allocation in Floating Point Formats</name>
            <thead>
              <tr>
                <th align="left">Format</th>
                <th align="left">Sign bit</th>
                <th align="left">Exponent</th>
                <th align="left">Significand</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">binary16</td>
                <td align="left">1</td>
                <td align="left">5</td>
                <td align="left">10</td>
              </tr>
              <tr>
                <td align="left">binary32</td>
                <td align="left">1</td>
                <td align="left">8</td>
                <td align="left">23</td>
              </tr>
              <tr>
                <td align="left">binary64</td>
                <td align="left">1</td>
                <td align="left">11</td>
                <td align="left">52</td>
              </tr>
            </tbody>
          </table>
          <t>Infinite numbers are represented in each format choice with a sign
bit, the highest available exponent value (all ones) and all-zero
significand.
NaN values are represented with a sign bit, the highest available
exponent value (all ones) and a non-zero significand, which carries a
leading quiet bit with the rest of the bits allocated to the NaN payload.</t>
          <t>To qualify as a generic encoder or decoder, a CBOR library needs to
implement as much of <xref target="IEEE754"/> support as reasonably possible on the
platform it addresses.
What is reasonably possible depends on:</t>
          <ul spacing="normal">
            <li>
              <t>platform support for <xref target="IEEE754"/> numbers.  If there is no such
support, the generic decoder may need to resort to offering the
interchanged value to the application, suitably tagged.</t>
            </li>
            <li>
              <t>If there is partial support, it may be harder to find a good
solution.  This is specifically a problem for platform support that
works well in most cases, but exhibits some dark corners.
E.g., the implementation may support a single NaN value
consistently, but not preserve NaN information present in the NaN
values.</t>
            </li>
          </ul>
          <t>Where an implementation needs to convert between different floating
point formats, e.g., because not all formats are fully supported by
the platform, or to implement Preferred Serialization (as needed for
Common Deterministic Encoding <xref target="I-D.ietf-cbor-cde"/>) in an encoder, conversion of NaNs in
these formats is best done by operating on the bit patterns of the
<xref target="IEEE754"/> number in the following way:</t>
          <ul spacing="normal">
            <li>
              <t>Expansion (towards a larger size format):
              </t>
              <ul spacing="normal">
                <li>
                  <t>preserve the sign bit</t>
                </li>
                <li>
                  <t>expand the (all-ones) exponent to the larger (all-ones) exponent</t>
                </li>
                <li>
                  <t>fill up the significand with zero bits on the right</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Contraction (towards a smaller size format):
              </t>
              <ul spacing="normal">
                <li>
                  <t>preserve the sign bit</t>
                </li>
                <li>
                  <t>truncate the (all-ones) exponent to the smaller (all-ones) exponent</t>
                </li>
                <li>
                  <t>truncate the significand from the right; check if the removed
bits were all zero.</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>If the contraction is optional, e.g., for Preferred Serialization, do
not perform the contraction if the removed bits in the significand
truncation are not all zero.
If the contraction is required to fit into limited platform types
(e.g., binary32 only), a failed truncation check indicates the loss of
information and should be signaled to the application.
We say a contraction "preserves the NaN information" if subsequent
expansion to the original size format recreates the exact same NaN value.</t>
          <t><xref target="app-nan"/> gives additional detailed considerations for implementations
that aspire to provide full support for NaNs, preserving NaN information.</t>
        </section>
      </section>
      <section anchor="getting-by-without-platform-support-for-floating-point-values">
        <name>Getting by without Platform Support for Floating Point Values</name>
        <t>On a constrained platform, CPU instructions and library functions for
IEEE 754 floating point values may not be available.</t>
        <t>A partial implementation for constrained systems may want to restrict
the application data models supported to those without floating point
numbers.</t>
        <t>However, IETF standards often use timestamps, which are
efficiently supported by CBOR Tag 1.
Tag 1 offers a choice between integer and floating point representations;
only the latter are capable of resolutions of better than 1 second.</t>
        <t><xref target="fixed-point"/> shows how to support a useful subrange of Tag 1 time
stamps that are encoded as floating point numbers for interchange, but
processed as 32.32 bit fixed point numbers in a constrained implementation.</t>
      </section>
    </section>
    <section anchor="sec-float">
      <name>Other Floating Point Numbers</name>
      <t>RFC 8949 <xref target="STD94"/> also defines tags 4 and 5 for a representation of
decimal and binary floating point numbers that is not constrained by
the types provided by IEEE 754.
These tags are very flexible, but this flexibility comes with a choice
of ways they could be integrated into a generic encoder.
Because of this flexibility, tags 4 and 5 do not define a Preferred
Serialization or a deterministic encoding.</t>
      <t><xref section="3.2" sectionFormat="of" target="RFC9581"/> can use representations derived
from the tags 4 and 5 to represent timestamps.
<xref section="6.1" sectionFormat="of" target="RFC9581"/> lists various other tags that
can be used for representing numbers for advanced arithmetic,
including rational numbers in fraction form (tag 30).</t>
    </section>
    <section anchor="sec-array">
      <name>Tagged Arrays of Numbers</name>
      <t><xref target="RFC8746"/> defines tags for typed arrays, i.e., arrays of numbers that
all are represented in the same way.
The choices defined in the <xref target="RFC8746"/> are all based on traditional
platform number representations (unsigned integers, signed integers,
IEEE 754 floating point values) and even come in little-endian and
big-endian variants, often removing the need to convert the numbers
from an internal to an interchange form.
As conversion for interchange is not envisioned,
considerations for a preferred serialization are not applicable.
As the recipient may need a conversion for ingestion of the arrays,
some considerations from <xref target="sec-ieee"/> may apply.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The general security considerations for representing data in common
data representation formats apply, e.g., those in Section <xref target="RFC8949" section="10" sectionFormat="bare"/> of RFC 8949 <xref target="STD94"/>.</t>
      <t>(TODO)</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>(TODO:</t>
      <t>Add nan'' registration when that is ready)</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <referencegroup anchor="STD94" target="https://www.rfc-editor.org/info/std94">
          <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
            <front>
              <title>Concise Binary Object Representation (CBOR)</title>
              <author fullname="C. Bormann" initials="C." surname="Bormann"/>
              <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
              <date month="December" year="2020"/>
              <abstract>
                <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
                <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="94"/>
            <seriesInfo name="RFC" value="8949"/>
            <seriesInfo name="DOI" value="10.17487/RFC8949"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC8746">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Typed Arrays</title>
            <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR), as defined in RFC 7049, is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.</t>
              <t>This document makes use of this extensibility to define a number of CBOR tags for typed arrays of numeric data, as well as additional tags for multi-dimensional and homogeneous arrays. It is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8746"/>
          <seriesInfo name="DOI" value="10.17487/RFC8746"/>
        </reference>
        <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document/8766229">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="IEEE Std" value="754-2019"/>
          <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/>
        </reference>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9581">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Time, Duration, and Period</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="B. Gamari" initials="B." surname="Gamari"/>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <date month="August" year="2024"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR, RFC 8949) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation.</t>
              <t>In CBOR, one point of extensibility is the definition of CBOR tags. RFC 8949 defines two tags for time: CBOR tag 0 (RFC 3339 time as a string) and tag 1 (POSIX time as int or float). Since then, additional requirements have become known. The present document defines a CBOR tag for time that allows a more elaborate representation of time, as well as related CBOR tags for duration and time period. This document is intended as the reference document for the IANA registration of the CBOR tags defined.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9581"/>
          <seriesInfo name="DOI" value="10.17487/RFC9581"/>
        </reference>
        <referencegroup anchor="BCP14" target="https://www.rfc-editor.org/info/bcp14">
          <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
            <front>
              <title>Key words for use in RFCs to Indicate Requirement Levels</title>
              <author fullname="S. Bradner" initials="S." surname="Bradner"/>
              <date month="March" year="1997"/>
              <abstract>
                <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
          </reference>
          <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
            <front>
              <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
              <author fullname="B. Leiba" initials="B." surname="Leiba"/>
              <date month="May" year="2017"/>
              <abstract>
                <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
          </reference>
        </referencegroup>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-cbor-cde">
          <front>
            <title>CBOR Common Deterministic Encoding (CDE)</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="13" month="October" year="2025"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines the concept of "Deterministically
   Encoded CBOR" in its Section 4.2, determining one specific way to
   encode each particular CBOR value.  This definition is instantiated
   by "core requirements", providing some flexibility for application
   specific decisions; this makes it harder than necessary to offer
   Deterministic Encoding as a selectable feature of generic CBOR
   encoders.

   The present specification documents the Best Current Practice for
   CBOR _Common Deterministic Encoding_ (CDE), which can be shared by a
   large set of applications with potentially diverging detailed
   application requirements.

   The document also discusses the desire for partial implementations,
   which can be another reason for constraining CBOR encoders, and
   singles out the encoding constraint "definite-length-only" as a
   likely constraint to be used in application protocol and media type
   definitions.

   This specification updates RFC 8949 in that it provides
   clarifications and definitions of additional terms as well as more
   examples and explanatory text; it does not make technical changes to
   RFC 8949.


   // This revision -13 merges all active pull requests in preparation
   // for the 2025-cbor-17 interim on 2025-10-15.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-13"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding and Representation</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="21" month="January" year="2025"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2.  The present document provides additional
   information about use cases, deployment considerations, and
   implementation choices for Deterministic Encoding and Representation.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-04"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: Deterministic CBOR</title>
            <author fullname="Wolf McNally" initials="W." surname="McNally">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Christopher Allen" initials="C." surname="Allen">
              <organization>Blockchain Commons</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Laurence Lundblade" initials="L." surname="Lundblade">
              <organization>Security Theory LLC</organization>
            </author>
            <date day="11" month="February" year="2026"/>
            <abstract>
              <t>   The purpose of determinism is to ensure that semantically equivalent
   data items are encoded into identical byte streams.  CBOR (RFC 8949)
   defines "Deterministically Encoded CBOR" in its Section 4.2, but
   leaves some important choices up to the application developer.  The
   present document specifies dCBOR, a set of narrowing rules for CBOR
   that can be used to help achieve interoperable deterministic encoding
   for a variety of applications desiring a narrow and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-17"/>
        </reference>
        <reference anchor="Cplusplus20" target="https://isocpp.org/files/papers/N4860.pdf">
          <front>
            <title>Programming languages - C++</title>
            <author>
              <organization>International Organization for Standardization</organization>
            </author>
            <date year="2020" month="March"/>
          </front>
          <seriesInfo name="ISO/IEC" value="ISO/IEC JTC1 SC22 WG21 N 4860"/>
          <refcontent>Sixth Edition</refcontent>
        </reference>
        <reference anchor="C23" target="https://www.iso.org/standard/82075.html">
          <front>
            <title>Information technology — Programming languages — C</title>
            <author>
              <organization>International Organization for Standardization</organization>
            </author>
            <date year="2024" month="October"/>
          </front>
          <seriesInfo name="ISO/IEC" value="9899:2024"/>
          <annotation> 
This revision of the standard is widely known as C23. Technically equivalent specification text is available at <eref target="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf">https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3220.pdf</eref>.</annotation>
        </reference>
        <reference anchor="ARM" target="https://developer.arm.com/documentation/ddi0487/latest/">
          <front>
            <title>Arm Architecture Reference Manual for A-profile architecture</title>
            <author>
              <organization>Arm Limited</organization>
            </author>
            <date year="2025" month="April"/>
          </front>
        </reference>
        <reference anchor="USEFUL-CDDL" target="https://github.com/cbor-wg/cddl/wiki/Useful-CDDL#number-ranges">
          <front>
            <title>Useful CDDL</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 564?>

<section anchor="fixed-point">
      <name>32.32 Bit Fixed Point for Supporting Precision Tag 1 Timestamps</name>
      <t>This appendix shows how to decode into and encode from a 32.32-bit
internal fixed point representation of floating point Tag 1 time
stamps, limited to a range from February 2004 to January 2106
inclusive.
The fixed point representation is a 64-bit unsigned integer, the most
significant half (<tt>fp &gt;&gt; 32</tt>) of which used as a 32-bit unsigned
integer gives the timestamp rounded down to full seconds, and the
least significant half of which (<tt>fp &amp; 0xffffffff</tt>) contains a
fractional part of the timestamp to a resolution of 2<sup><tt>-32</tt></sup>
seconds (fractions of a nanosecond, more resolution than the
approximately microseconds that Tag 1 actually can deliver in this
range of timestamps).</t>
      <t>The C functions given below return a 32.32-bit fixed point value as a
64-bit unsigned integer if the timestamp is covered in the above range, 0 otherwise.
b64/b32 are the binary64/binary32 floating point values represented as an
unsigned long (i.e., the CBOR argument value).</t>
      <figure anchor="float64-to-fixed3232">
        <name>Converting a float64 timestamp to fixed point 32.32</name>
        <sourcecode type="c"><![CDATA[
unsigned long timestamp_float64_to_fixed3232(unsigned long b64) {
  unsigned long exp = (b64 >> 52 & 0xfffUL) - 0x41d;
  if (exp >= 2)
    return 0;
  return ((b64 & 0xfffffffffffffUL)
          + 0x10000000000000UL) << (exp + 10);
}
]]></sourcecode>
      </figure>
      <t>Because of preferred serialization, Tag 1 floating point timestamp
values might arrive as a float32, so additional code is necessary for
handling this rare case:</t>
      <figure anchor="float32-to-fixed3232">
        <name>Converting a float32 timestamp to fixed point 32.32</name>
        <sourcecode type="c"><![CDATA[
unsigned long timestamp_float32_to_fixed3232(unsigned long b32) {
  unsigned long exp = (b32 >> 23 & 0x1ffUL) - 0x9d;
  if (exp >= 2)
    return 0;
  return ((b32 & 0x7fffffUL) + 0x800000UL) << (exp + 39);
}
]]></sourcecode>
      </figure>
      <t>There is no value in the timestamp range supported by this simple code
that would fit into a float16.</t>
    </section>
    <section anchor="impcheck">
      <name>Implementers' Checklists for Floating Point Values</name>
      <t>This check list employs <xref target="BCP14"/> keywords to indicate interoperability
requirements on implementations.</t>
      <t>The following considerations apply to encoding (emitting) floating
point values in a generic encoder:</t>
      <ul spacing="normal">
        <li>
          <t>The length of the argument is encoded in the lower 5 bits of the
first byte ("ai"), which indicates half precision (binary16, ai = 0x19),
single precision (binary32, ai = 0x1a) and double precision
(binary64, ai = 0x1b).  </t>
          <t>
For preferred serialization: if multiple of these encodings
preserve the precision of the value to be encoded, only the
shortest form of these <bcp14>MUST</bcp14> be emitted.
That implies that encoders <bcp14>MUST</bcp14> support half-precision and (if
there is support for more than half precision on the platform)
single-precision floating point.
Positive and negative infinity and zero <bcp14>MUST</bcp14> be represented in
half-precision floating point.</t>
        </li>
        <li>
          <t>NaNs <bcp14>MUST</bcp14> be supported, for all values of NaN information allowed
in <xref target="IEEE754"/>.  </t>
          <t>
As with all floating point numbers, NaNs with payloads <bcp14>MUST</bcp14> be
contracted to the shortest of double, single or half precision that
preserves the NaN information.  </t>
          <t>
The reduction is performed by removing the rightmost N bits of the
payload, where N is the difference in the number of bits in the
significand (mantissa) between the original format and the
reduced format.
The reduction is performed only (preserves the value only) if all the
rightmost bits removed are zero.
(This will always reduce a double or single quiet NaN with an
otherwise zero NaN payload, which is typically what is returned
from an operation such as 0.0/0.0, to a half-precision quiet NaN
encoded as 0xf9 7e00.)</t>
        </li>
      </ul>
      <t>The following considerations apply to decoding (ingesting) floating
point values in a generic decoder that supports IEEE 754 floating-point numbers:</t>
      <ul spacing="normal">
        <li>
          <t>Half-precision values <bcp14>MUST</bcp14> be accepted.</t>
        </li>
        <li>
          <t>Double- and single-precision values <bcp14>SHOULD</bcp14> be accepted; leaving these out
is only foreseen for decoders that need to work in exceptionally
constrained environments.</t>
        </li>
        <li>
          <t>If double-precision values are accepted, single-precision values
<bcp14>MUST</bcp14> be accepted.</t>
        </li>
        <li>
          <t>NaNs, <bcp14>MUST</bcp14> be accepted, preserving the NaN information for use of
the application.</t>
        </li>
      </ul>
      <section anchor="app-nan">
        <name>NaN Payloads</name>
        <t>The basic data model of CBOR directly supports IEEE-754 data item of
the forms binary16, binary32, and binary64.
These have 10, 23, and 52 bits in the space provided for encoding the
significand (see <xref target="tab-bits"/>).
For a NaN, the first of these bits is used to indicate whether the NaN
is signalling (0) or quiet (1).
The up to 51 bits in the rest of the significand are called the "NAN
payload".</t>
        <t>The payload’s original purpose is diagnostic information to explain
why a NaN was generated by a local computation.
There is no standard for the contents of a NaN payload.</t>
        <t>CBOR allows NaNs with non-zero payloads to be encoded.
(Due to the way infinite numbers are encoded in <xref target="IEEE754"/>,
zero-payload NaN always must be quiet NaNs.)</t>
        <t>As a result, if a protocol design does not use NaNs with non-zero
payloads and is using preferred serialization then NaN must be encoded
as a half-precision with the quiet bit set and the payload set as 0,
specifically 0xF97E00.
If a design does not use NaNs with non-zero payloads and preferred
serialization is not used, then the single and double precision quiet
NaNs, 0xFA7FC00000 and 0xFB7FF0000000000000, may also be used.</t>
        <section anchor="working-with-nans">
          <name>Working with NaNs</name>
          <t>NaN payloads have been in the IEEE-754 standard since 2008, but
programming environments often still do not provide facilities (e.g.,
APIs) to make full use of them.
In C there is the <tt>isnan()</tt> API to check if a value is a
NaN, but there are only implementation-defined APIs to construct or
access the NaN payload <xref target="C23"/>.
For constructing a NaN with a payload, C for instance offers functions
specific to a floating point type, such as <tt>nanf()</tt> for single
precision (binary32) and <tt>nan()</tt> for double precision (binary64), or
their analogues in the <tt>strtof()</tt> and <tt>strtol()</tt> functions.
Section 7.24.1.5 and its Footnote 341 helpfully explain:</t>
          <blockquote>
            <t>[...] the meaning of the n-char sequence is
implementation-defined. [...]
An implementation can use the
n-char sequence to determine extra information to be represented in
the NaN’s significand.</t>
          </blockquote>
          <t>While Section 9.7 of <xref target="IEEE754"/> now defines abstract APIs for creating and
accessing NaN values (<tt>getPayload</tt>/<tt>setPayload</tt>), these definitions
are partially implementation-defined and are vague enough that
realizations of them have not made it into <xref target="C23"/>.</t>
          <t>The typical way to work with a NaN payload in C instead is to
reinterpret the floating-point value as an unsigned integer and then
use shifts and masks to unpack the IEEE-754 representation.</t>
          <t>The floating point conversion (narrowing/widening) instructions of the
most widely used CPU architectures cover NaNs in a comparable way as
they convert finite numbers: They narrow by removing the right-most
bits of the payload, and they widen by adding zero bits to the right.
(E.g., for ARM A-profile Architecture <xref target="ARM"/>:
See Section J1.3.3.193 FPConvertNaN, page 14208 at the time of writing.)</t>
        </section>
        <section anchor="nan-implementation-details">
          <name>NaN Implementation Details</name>
          <t>This section is primarily for CBOR library implementors.</t>
          <t>CBOR attempts to limit the MUSTs about CBOR implementations in order
to allow its use in a large variety of constrained use cases.
For example, support for integers is not required because a protocol
might need only strings.
Similarly, there is no <bcp14>MUST</bcp14> that requires support of NaN and NaNs with
non-zero payloads, but the recommendation here is that any generic
CBOR library that supports floating-point support NaNs, preferably
also with non-zero NaN payloads.</t>
          <t>In most environments, there is little extra work to do to support NaN
without payloads if floating-point is supported.
NaNs will usually flow through as any other floating-point value.</t>
          <t>Generic CBOR libraries are expected to support preferred serialization
of floating-point including NaNs.
For NaNs with zero payloads, this requires reducing to a half-precision
NaN without a payload.
This requires a few explicit extra lines of code.
See the sample half-precision implementation in Appendix D of RFC 8949.</t>
          <t>The implementation of preferred serialization of NaN payloads needs a
few more additional lines.
As with preferred serialization, NaN payloads must be reduced but only
if they can be reduced without the loss of any non-zero payload bits.
Programming platform provided floating-point hardware and software may
or may not do this correctly for double to single conversion.
The sample half-precision implementation in Appendix D of RFC 8949
only supports NaNs without payloads.</t>
          <t>A double precision NaN payload contains 51 bits, a single 22 bits and
a half 9 bits, in each case all but the first bit of the significand.
A double precision NaN can be reduced to a single precision NaN only if the right-most 29 payload bits are zero.
A single precision NaN can be reduced to a half precision NaN only if the right-most 13 payload bits are zero.
A double NaN can be reduced to a half precision NaN only if the right-most 42 payload bits are zero.
Note that the exponent is always all-ones for NaN, so this is simpler
than the equivalent contraction of regular, non-NAN, floating-point values.</t>
          <t>To implement the above, most CBOR libraries will have to reinterpret
the floating point value as an unsigned integer and use shifts and
masks, based in the internal representation defined in <xref target="IEEE754"/>.</t>
          <t>Testing on some CPUs has shown them to do this correctly for conversion between single and double.
However, it may not be very useful to rely on platform libraries for the following reasons.
First, they may provide no support at all for half-precision and half-precision is required for preferred serialization.
Second, NaN payloads are a relatively recent and very specialist
feature that is not usually used in interchange.</t>
          <t>If platform implementation is relied upon, NaN payload reduction should be tested on each platform.
Open source libraries intended to run on multiple platforms may be
better off not relying on the platform.</t>
        </section>
        <section anchor="nan-tests-examples">
          <name>NaN Tests Examples</name>
          <t>The IEEE-754 numbers are given as a 64-bit (binary64) or 32-bit
(binary32) unsigned integer in hex to show the bits that make up the
floating-point value.
All of the following are NaNs.</t>
          <table anchor="nan-examples">
            <name>Examples for Preferred Serialization of NaN values</name>
            <thead>
              <tr>
                <th align="left">IEEE-754 Number</th>
                <th align="left">CBOR Preferred Serialization</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0x7ff8000000000000</td>
                <td align="left">0xf97e00</td>
                <td align="left">qNaN contracted from double to half</td>
              </tr>
              <tr>
                <td align="left">0x7ff8000000000001</td>
                <td align="left">0xfb7ff8000000000001</td>
                <td align="left">Can't be contracted because of bit set in right-side part of payload</td>
              </tr>
              <tr>
                <td align="left">0x7ffffc0000000000</td>
                <td align="left">0xf97fff</td>
                <td align="left">10-bit payload that can be contracted to half</td>
              </tr>
              <tr>
                <td align="left">0x7ff80000000003ff</td>
                <td align="left">0xfb7ff80000000003ff</td>
                <td align="left">right-justified payload can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fffffffe0000000</td>
                <td align="left">0xfa7fffffff</td>
                <td align="left">23-bit payload that reduces to single</td>
              </tr>
              <tr>
                <td align="left">0x7ffffffff0000000</td>
                <td align="left">0xfb7ffffffff0000000</td>
                <td align="left">24-bit payload that can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fffffffffffffff</td>
                <td align="left">0xfb7fffffffffffffff</td>
                <td align="left">All payload bits set, can't be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fc00000</td>
                <td align="left">0xf97e00</td>
                <td align="left">qNaN contracted from single to half</td>
              </tr>
              <tr>
                <td align="left">0x7fffe000</td>
                <td align="left">0xf97fff</td>
                <td align="left">single 10-bit payload that can be contracted</td>
              </tr>
              <tr>
                <td align="left">0x7fbff000</td>
                <td align="left">0xfa7fbff000</td>
                <td align="left">single payload that can't be contracted to 10 bits</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="list-of-figures">
      <name>List of Figures</name>
      <dl spacing="compact" indent="11">
        <dt><xref target="float64-to-fixed3232"/>:</dt>
        <dd>
          <t><xref format="title" target="float64-to-fixed3232"/></t>
        </dd>
        <dt><xref target="float32-to-fixed3232"/>:</dt>
        <dd>
          <t><xref format="title" target="float32-to-fixed3232"/></t>
        </dd>
      </dl>
    </section>
    <section numbered="false" anchor="list-of-tables">
      <name>List of Tables</name>
      <dl spacing="compact" indent="11">
        <dt><xref target="tab-bits"/>:</dt>
        <dd>
          <t><xref format="title" target="tab-bits"/></t>
        </dd>
        <dt><xref target="nan-examples"/>:</dt>
        <dd>
          <t><xref format="title" target="nan-examples"/></t>
        </dd>
      </dl>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="L." surname="Lundblade" fullname="Laurence Lundblade">
        <organization>Security Theory LLC</organization>
        <address>
          <email>lgl@securitytheory.com</email>
        </address>
      </contact>
      <t>Laurence wrote much of the initial text about NaN processing.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA619S3cb17Xm/PyKE2qtG9AGQACkKJGydUOTUqIsWVRbVCe3
02mzABTAsoAquKpAiqGdleEd39WTnnnQg/4d7n/iX9L723ufRxVASb5p5iGg
Hue130/0ej1zfWz3jamzepEe2/Pcvlovx2lZ2Sy3p1+df2OS8bhM6SF8cTfN
tJjkyZJemJbJrO6Ni3KZ5HlvQh96uTzTWyR1WtVmQv/Mi/L2mEacFaaqyzRZ
HtsXzy6eGzOlm8dmUuRVmlfr6tjW5To1CT1ybHdOVqtFRq9ndNsm+dR+kyaL
3kW2THfMTVG+m5fFekXPnRb5JKtS+1WWJ+WtPR9/l05qenhVpjRszQPYr5Ms
r//l2ft6x7xLb+n16bEx12m+pvmt/fVDpXmST1JeFg1Kq8cqd2ioZZItaCQc
xe+ytJ71i3KO6/OsvlqPj+0kGRd78UEZk6zrq6I8Nj1rrRzraVJWNKj9Sg6W
XreWxjm2b/Psmt7J6v/7v2v7VZku6aGL//aCH8DRpvWxfV1U9SyZXNn9/cHB
wYDvTbKaICAvyIViSvOc9UaP9x8e6ZV1XgNOv08x6S1fXF0VOT33+cFR72A0
7I2Gj3uH+0ejId9MZa/Y0e/qv2XYKWBZl9l4XcuGZDsvk3WZ4rhervPpeJFM
U6P7eZNO1iWtzV5cpYQk9uXLU+MHXswXv6v0gZrv9yfF0mCpOgkdejT6TVnU
qV2uaevFzNIbhHJZnSULW6fva0vLXNf2VfLKrspiklZVls/7xuQ445qOFYjw
5uLs6IC2RPAxD7DHL4/tN89PHx8d4JDw6dHB4bFNyjK5rejKi2fPnj16eHDM
51En5RwAuKrrVXW8t5elafp+tSjKtI+POJ89opw1waDee/zo8HA0kqNX6sNg
9k1NOJWUUzsrSvt8UdDS8nnvdUE4Z0/oJK6WaZ1N+DWHN/jck/PEEPydKcvO
kkWVCnKkZZZWIEF53rrZpseWNtAbDYZHeuPs/MWxHQ76w+HgaA9P0aH0cb8f
1oyTOBwO6KSm04V8P3r4eEgETOTZq5O5MZjLnyyd5YveWX8bo6B3rjI+S3oA
FCN3J8DPCWPKxptTnDL9n95bEjNaLG5xmVCXYF7RCfGT9BS/UJTZHGs4XS3W
Ff53LNBtQ+zm5qafVQVDqlJA7D3ePxwd9q/q5UJfEmi9Lot5mSxpvrldJPl8
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
9jyCtxzpcaNEWchsRJH2pqivWaAN7zUIy4UGmvnqDkVOnLtlcX8dOi9AWnVJ
iNkvR8ZwDu/gGI878Qje+pLuomwDQaOUEbptdZa7FV+wGajdgzmuKkEJ4ZYN
W5fDJRzvfLVJyLoXlxf3SlsBxH12lBdEjXVDYMOhSojSdFy2yG6jvtT78NV9
73RsK2KLNiKOGBQZfnSHTF2d5jkJGXKwA0StpSw6vj8BXroL0ECQS9RFmAgz
fM7E1doLWRe8XcJ1OJuL4SfpCYCNSxHjIbwWKkgf5SNENSKh48uNNzEhqh2K
Ov/DZtmJ1p91xXJokY1fkowSeXRJ1Tv6+adH6WCAuqBPEzZsdrKwUUfCJ0ob
l1EQdx6oNgsqmtlWTjb9obkjHd8RPUp+Vo5PfmbPGCY9CU61eZW+qr02o5ef
oGLQkQaUy7VSHWKBQCu0w6mAtbOQH9LKOHRZrb6WHsD0TMA7h5ulGLzmF44R
bC6V3Wu6yO59G5JJ7jkQiT21bzaiUVsYCu9T1GwvO5ohPQ5Z4a3Xju/dPXBh
NUEn7oEYBXFc99zQb6OBCb1GYQ8mrrWa8uMZcc6hzhmsQyKFkbb8ezhqBly5
V1GjxbLXn8AXGiyr4ooLl9HFXae5akhSXnlxrO94yS0zVVE3YVX+oooBqVep
NFzK9kNnwLWYQqmd4a74SqQv58NhK58vJDvFaxXjgwvLcWvn1ckroyxmRzVJ
/crlQZ7trtblir1ncWlmAw+gYb4nHSBD3cOtps7eJK4ywGV2WuRcLeLK2H5D
pa/iX6ZyoWxfPdhK0RI7GryoiuSrzxTzgrahXfVN5yzkHqEycLMeJQpptUr0
uQdbT0fWvE1m9ktUyI4j1o6KGnhcE19SDLnSLqcKNXYgos1NGL8JziCttMTs
Pq9vDdcjVuWWo9sw8ssDTQbpU+NCthwaSLiEErdJvlahO2cjbWrw/vnRo2ck
FJB0kHzidmxjO34XprmLzA8hXa1cEgTLzm1qvOzACAujhZ08en7KBio/TRe+
evT8ecMh0RUXNYJ+GsfRBOA/EXfmXB0sGwMaEyGd/tjHWEK3vCzPkjzqVpw/
j45JPsy5veuFRBbk1yU0fOZTA5IJzL+Q329QvbEr3enfaeqAD8zhRzte5PY0
aO5YWSgzpXc5XOFSXhJnOsOLxlxKIomuHUKzuF0S111sh6tIfEtP0q+Qfu3q
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
BD+VsEinc3Z3tBbx/wCow9hUqIoAAA==

-->

</rfc>
