<?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.22 (Ruby 3.3.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-bormann-cbor-numbers-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.24.0 -->
  <front>
    <title abbrev="CBOR Numbers">On Numbers in CBOR</title>
    <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-numbers-01"/>
    <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="2025" month="January" day="09"/>
    <area>Applications and Real-Time</area>
    <workgroup>Concise Binary Object Representation Maint&amp;Ext</workgroup>
    <abstract>
      <?line 81?>

<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
and implementers of CBOR
libraries and 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 a rather drafty initial revision, 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 110?>

<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
and implementers of CBOR
libraries and 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 Profile (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>
      <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>
      </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, the former "basic" integers.  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>).
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>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
major type 0 encodings, 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 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 bignums 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 Numbers</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 supports 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 a CDE application profile that enforces 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 kinds of floating point data item:</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 didn't 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 kinds, 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 to a NaN always yields inequality.</t>
        <section anchor="protocol-design-considerations">
          <name>Protocol Design Considerations</name>
          <t>CBOR supports the interchange of all kinds of IEEE 754 data items,
including non-finite numbers and non-numbers (NaNs).
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 numbered="false" 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>
            <t>float-with-nan-replacement = float / bytes</t>
            <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 aren't 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>
    <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="I-D.ietf-cbor-time-tag"/> uses representations derived
from the tags 4 and 5 to represent timestamps.
<xref section="6.1" sectionFormat="of" target="I-D.ietf-cbor-time-tag"/> 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>
        <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="16" month="October" year="2024"/>
            <abstract>
              <t>   CBOR (STD 94, RFC 8949) defines "Deterministically Encoded CBOR" in
   its Section 4.2, providing some flexibility for application specific
   decisions.  To facilitate Deterministic Encoding to be offered as a
   selectable feature of generic encoders, the present document defines
   a CBOR Common Deterministic Encoding (CDE) Profile that can be shared
   by a large set of applications with potentially diverging detailed
   requirements.  It also defines "Basic Serialization", which stops
   short of the potentially more onerous requirements that make CDE
   fully deterministic, while employing most of its reductions of the
   variability needing to be handled by decoders.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cde-06"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-det">
          <front>
            <title>CBOR: On Deterministic Encoding</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="21" month="July" year="2024"/>
            <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.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-det-03"/>
        </reference>
        <reference anchor="I-D.mcnally-deterministic-cbor">
          <front>
            <title>dCBOR: A Deterministic CBOR Application Profile</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="8" month="August" year="2024"/>
            <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
   CBOR Common Deterministic Encoding (CDE) Internet Draft builds on
   this by specifying a baseline for application profiles that wish to
   implement deterministic encoding with CBOR.  The present document
   provides an application profile "dCBOR" that can be used to help
   achieve interoperable deterministic encoding based on CDE for a
   variety of applications wishing an even narrower and clearly defined
   set of choices.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-mcnally-deterministic-cbor-11"/>
        </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="I-D.ietf-cbor-time-tag">
          <front>
            <title>Concise Binary Object Representation (CBOR) Tags for Time, Duration, and Period</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Ben Gamari" initials="B." surname="Gamari">
              <organization>Well-Typed</organization>
            </author>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer Institute for Secure Information Technology</organization>
            </author>
            <date day="30" month="October" year="2023"/>
            <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.

   In CBOR, one point of extensibility is the definition of CBOR tags.
   RFC 8949 defines two tags for time: CBOR tag 0 (RFC3339 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.


   // (This cref will be removed by the RFC editor:) The present
   // revision (–12) addresses the IESG reviews.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-time-tag-12"/>
        </reference>
      </references>
    </references>
    <?line 463?>

<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>An IEEE-754 data item has up to 52 bits in the significand.
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>
        <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 use of them.
For example, in C there is the isnan() API to check if a value is a
NaN, but there are no APIs to construct or access the NaN payload.
The typical way to work with a NaN payload is to reinterpret the
floating-point value as an unsigned integer and then use shifts and
masks to unpack the IEEE-754 representation.</t>
        <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="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:
H4sIAAAAAAAAA6V83XIbybHmfT1FLRWxQ44BEAApSuKMx6ZIyqZDQ+qMqHWc
PeE1C+gC0FajG+5ukKI5cvjyXJ84N+duLvZin2P2TeZJNr/MqurqBqjRrBVh
D9g/VVmZWZlf/lT3+311e6wPlKrTOrPH+irXl+vlxJaVTnN9+vLqO2Umk9LS
Q/jD31RJMc3Nkl5ISjOr+5OiXJo870/pRz+XZ/qZqW1Vqyn9Z16U98c04qxQ
VV1aszzWF+fXr5RK6OaxmhZ5ZfNqXR3rulxbZeiRY71zslplKb2e0m1t8kR/
Z03Wv06XdkfdFeX7eVmsV/TcaZFP08rql2luynt9NfmLndb08Kq0NGzNA+hv
TZrX//38Q72j3tt7ej05VurW5muaX+tfPpTNTT61TBYNStSDyh0aamnSjEYC
K36b2no2KMo5rs/TerGeHOupmRT7MaOUMut6UZTHqq+1FraemrKiQfVLYSy9
rjWNc6zf5ektvZPW//d/1/plaZf00PX/vOAHwFpbH+s3RVXPzHShDw6Gh4dD
vjdNa5KAvCAXioTmOeuPnx88feGurPMacvqdxaT3fHG1KHJ67leHL/qH41F/
PHrePzp4MR7xTStrxYp+W/8txUohy7pMJ+taFiTLeW3WpQW7Xq/zZJKZxCq3
nrd2ui6JNn29sKQk+vXrUxUGzubZbyv3QM33B9NiqUCqm4SYHo1+Vxa11cs1
Lb2YaXqDVC6tU5Pp2n6oNZG5rvWludSrspjaqkrz+UCpHDyuia1QhLfXZy8O
aUkkH/UEa/z1sf7u1enzF4dgEn49Ozw61qYszX1FVy7Oz8+fPT08Zn7UppxD
AIu6XlXH+/uptfbDKitKO8BP8Gefds6aZFDvP392dDQeC+vd7sNg+m1NOmXK
RM+KUr/KCiItn/ffFKRz+oQ4sVjaOp3ya15v8Lsv/MQQ/DfvLD0zWWVFOWyZ
2gpbUJ7XfrbkWNMC+uPh6IW7cXZ1caxHw8FoNHyxj6eIKQPcHzQ0gxNHoyFx
KkkypTBuxMWL/tkAui8GYQpNm7LMcaNlLBLwi/7P3VuSWcmye1wmJSTpVbRW
fpKe4heKMp1DMqerbF3hf8cipy7v7+7uBmlVMM8rx9L95wdH46PBol5m7iXh
+5uymJdmSfPNdWby+drMbaV/+sd/6tNf/Uqe9Kx+EvOarECZs00gFbsq5yZP
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

-->

</rfc>
