ISO/IEC TS 18661-2:2015
(Main)Information Technology — Programming languages, their environments, and system software interfaces — Floating-point extensions for C — Part 2: Decimal floating-point arithmetic
Information Technology — Programming languages, their environments, and system software interfaces — Floating-point extensions for C — Part 2: Decimal floating-point arithmetic
ISO/IEC/TS 18661-2:2015 extends programming language C as specified in ISO/IEC 9899:2011, (C11) with changes specified in ISO/IEC/TS 18661-1, to support decimal floating-point arithmetic conforming to ISO/IEC/IEEE 60559:2011. It covers all requirements of IEC 60559 as they pertain to C decimal floating types. ISO/IEC/TS 18661-2:2015 does not cover binary floating-point arithmetic (which is covered in ISO/IEC/TS 18661-1), nor does it cover most optional features of IEC 60559.
Technologies de l'information — Langages de programmation, leurs environnements et interfaces du logiciel système — Extensions à virgule flottante pour C — Partie 2: Arithmétique décimal en virgule flottante
General Information
Relations
Standards Content (Sample)
TECHNICAL ISO/IEC TS
SPECIFICATION 18661-2
Second edition
2015-05-15
Information Technology —
Programming languages, their
environments, and system software
interfaces — Floating-point
extensions for C —
Part 2:
Decimal floating-point arithmetic
Technologies de l’information — Langages de programmation, leurs
environnements et interfaces du logiciel système — Extensions à
virgule flottante pour C —
Partie 2: Arithmétique décimal en virgule flottante
Reference number
ISO/IEC TS 18661-2:2015(E)
©
ISO/IEC 2015
---------------------- Page: 1 ----------------------
ISO/IEC TS 18661-2:2015(E)
COPYRIGHT PROTECTED DOCUMENT
© ISO/IEC 2015
All rights reserved. Unless otherwise specified, no part of this publication may be reproduced or utilized otherwise in any form
or by any means, electronic or mechanical, including photocopying, or posting on the internet or an intranet, without prior
written permission. Permission can be requested from either ISO at the address below or ISO’s member body in the country of
the requester.
ISO copyright office
Case postale 56 • CH-1211 Geneva 20
Tel. + 41 22 749 01 11
Fax + 41 22 749 09 47
E-mail copyright@iso.org
Web www.iso.org
Published in Switzerland
ii © ISO/IEC 2015 – All rights reserved
---------------------- Page: 2 ----------------------
ISO/IEC
TS
18661-‐2:2015(E)
Foreword
.
iv
Introduction
.
vi
1
Scope
.
1
2
Conformance
.
1
3
Normative
references
.
1
4
Terms
and
definitions
.
2
5
C
standard
conformance
.
2
5.1
Freestanding
implementations
.
2
5.2
Predefined
macros
.
2
5.3
Standard
headers
.
3
6
Decimal
floating
types
.
9
7
Characteristics
of
decimal
floating
types
.
10
8
Operation
binding
.
16
9
Conversions
.
17
9.1
Conversions
between
decimal
floating
and
integer
types
.
17
9.2
Conversions
among
decimal
floating
types,
and
between
decimal
floating
and
standard
floating
types
.
17
9.3
Conversions
between
decimal
floating
and
complex
types
.
18
9.4
Usual
arithmetic
conversions
.
18
9.5
Default
argument
promotion
.
19
10
Constants
.
19
11
Arithmetic
operations
.
20
11.1
Operators
.
20
11.2
Functions
.
20
11.3
Conversions
.
22
11.4
Expression
transformations
.
22
12
Library
.
22
12.1
Standard
headers
.
22
12.2
Decimal
floating-‐point
environment
in
.
22
12.3
Decimal
mathematics
in
.
27
12.4
Decimal-‐only
functions
in
.
37
12.4.1
Quantum
and
quantum
exponent
functions
.
37
12.4.2
Decimal
re-‐encoding
functions
.
39
12.5
Formatted
input/output
specifiers
.
41
12.6
strtodN
functions
in
.
43
12.7
wcstodN
functions
in
.
46
12.8
strfromdN
functions
in
.
49
12.9
Type-‐generic
math
for
decimal
in
.
49
©
ISO/IEC
2015
–
All
rights
reserved
iii
---------------------- Page: 3 ----------------------
ISO/IEC
TS
18661-‐2:2015(E)
Foreword
ISO
(the
International
Organization
for
Standardization)
and
IEC
(the
International
Electrotechnical
Commission)
form
the
specialized
system
for
worldwide
standardization.
National
bodies
that
are
members
of
ISO
or
IEC
participate
in
the
development
of
International
Standards
through
technical
committees
established
by
the
respective
organization
to
deal
with
particular
fields
of
technical
activity.
ISO
and
IEC
technical
committees
collaborate
in
fields
of
mutual
interest.
Other
international
organizations,
governmental
and
non-‐governmental,
in
liaison
with
ISO
and
IEC,
also
take
part
in
the
work.
In
the
field
of
information
technology,
ISO
and
IEC
have
established
a
joint
technical
committee,
ISO/IEC
JTC
1.
The
procedures
used
to
develop
this
document
and
those
intended
for
its
further
maintenance
are
described
in
the
ISO/IEC
Directives,
Part
1.
In
particular
the
different
approval
criteria
needed
for
the
different
types
of
document
should
be
noted.
This
document
was
drafted
in
accordance
with
the
editorial
rules
of
the
ISO/IEC
Directives,
Part
2
(see
www.iso.org/directives).
Attention
is
drawn
to
the
possibility
that
some
of
the
elements
of
this
document
may
be
the
subject
of
patent
rights.
ISO
and
IEC
shall
not
be
held
responsible
for
identifying
any
or
all
such
patent
rights.
Details
of
any
patent
rights
identified
during
the
development
of
the
document
will
be
in
the
Introduction
and/or
on
the
ISO
list
of
patent
declarations
received
(see
www.iso.org/patents).
Any
trade
name
used
in
this
document
is
information
given
for
the
convenience
of
users
and
does
not
constitute
an
endorsement.
For
an
explanation
on
the
meaning
of
ISO
specific
terms
and
expressions
related
to
conformity
assessment,
as
well
as
information
about
ISO's
adherence
to
the
WTO
principles
in
the
Technical
Barriers
to
Trade
(TBT)
see
the
following
URL:
Foreword
-‐
Supplementary
information
The
committee
responsible
for
this
document
is
ISO/IEC
JTC
1,
Information
technology,
Subcommittee
SC
22,
Programming
languages,
their
environments,
and
system
software
interfaces.
This second edition cancels and replaces the first edition (ISO/IEC TS 18661-2:2015), of which it constitutes
a minor revision.
ISO/IEC
TS
18661
consists
of
the
following
parts,
under
the
general
title
Information
technology
—
Programming
languages,
their
environments,
and
system
software
interfaces
—
Floating’ point
extensions
for
C:
⎯ Part
1:
Binary
floating-‐point
arithmetic
⎯ Part
2:
Decimal
floating-‐point
arithmetic
The
following
parts
are
under
preparation:
⎯ Part
3:
Interchange
and
extended
types
⎯ Part
4:
Supplementary
functions
⎯ Part
5:
Supplementary
attributes
ISO/IEC
TS
18661-‐1
updates
ISO/IEC
9899:2011,
Information
technology
—
Programming
Language
C,
annex
F
in
particular,
to
support
all
required
features
of
ISO/IEC/IEEE
60559:2011,
Information
technology
—
Microprocessor
Systems
—
Floating-‐point
arithmetic.
ISO/IEC
TS
18661-‐2
supersedes
ISO/IEC
TR
24732:2009,
Information
technology
—
Programming
languages,
their
environments
and
system
software
interfaces
—
Extension
for
the
programming
language
C
to
support
decimal
floating-‐point
arithmetic.
iv
©
ISO/IEC
2015
–
All
rights
reserved
---------------------- Page: 4 ----------------------
ISO/IEC
TS
18661-‐2:2015(E)
ISO/IEC
TS
18661-‐3,
ISO/IEC
TS
18661-‐4,
and
ISO/IEC
TS
18661-‐5
specify
extensions
to
ISO/IEC
9899:2011
for
features
recommended
in
ISO/IEC/IEEE
60559:2011.
©
ISO/IEC
2015
–
All
rights
reserved
v
---------------------- Page: 5 ----------------------
ISO/IEC
TS
18661-‐2:2015(E)
Introduction
Background
IEC
60559
floating-‐point
standard
The
IEEE
754-‐1985
standard
for
binary
floating-‐point
arithmetic
was
motivated
by
an
expanding
diversity
in
floating-‐point
data
representation
and
arithmetic,
which
made
writing
robust
programs,
debugging,
and
moving
programs
between
systems
exceedingly
difficult.
Now
the
great
majority
of
systems
provide
data
formats
and
arithmetic
operations
according
to
this
standard.
The
IEC
60559:1989
international
standard
was
equivalent
to
the
IEEE
754-‐1985
standard.
Its
stated
goals
were
the
following:
1 Facilitate
movement
of
existing
programs
from
diverse
computers
to
those
that
adhere
to
this
standard.
2 Enhance
the
capabilities
and
safety
available
to
programmers
who,
though
not
expert
in
numerical
methods,
may
well
be
attempting
to
produce
numerically
sophisticated
programs.
However,
we
recognize
that
utility
and
safety
are
sometimes
antagonists.
3 Encourage
experts
to
develop
and
distribute
robust
and
efficient
numerical
programs
that
are
portable,
by
way
of
minor
editing
and
recompilation,
onto
any
computer
that
conforms
to
this
standard
and
possesses
adequate
capacity.
When
restricted
to
a
declared
subset
of
the
standard,
these
programs
should
produce
identical
results
on
all
conforming
systems.
4 Provide
direct
support
for
a. Execution-‐time
diagnosis
of
anomalies
b. Smoother
handling
of
exceptions
c. Interval
arithmetic
at
a
reasonable
cost
5 Provide
for
development
of
a. Standard
elementary
functions
such
as
exp
and
cos
b. Very
high
precision
(multiword)
arithmetic
c. Coupling
of
numerical
and
symbolic
algebraic
computation
6 Enable
rather
than
preclude
further
refinements
and
extensions.
To
these
ends,
the
standard
specified
a
floating-‐point
model
comprising
the
following:
— formats
–
for
binary
floating-‐point
data,
including
representations
for
Not-‐a-‐Number
(NaN)
and
signed
infinities
and
zeros
—
operations
–
basic
arithmetic
operations
(addition,
multiplication,
etc.)
on
the
format
data
to
compose
a
well-‐defined,
closed
arithmetic
system;
also
specified
conversions
between
floating-‐
point
formats
and
decimal
character
sequences,
and
a
few
auxiliary
operations
—
context
–
status
flags
for
detecting
exceptional
conditions
(invalid
operation,
division
by
zero,
overflow,
underflow,
and
inexact)
and
controls
for
choosing
different
rounding
methods
vi
©
ISO/IEC
2015
–
All
rights
reserved
---------------------- Page: 6 ----------------------
ISO/IEC
TS
18661-‐2:2015(E)
The
ISO/IEC/IEEE
60559:2011
international
standard
is
equivalent
to
the
IEEE
754-‐2008
standard
for
floating-‐point
arithmetic,
which
is
a
major
revision
to
IEEE
754-‐1985.
The
revised
standard
specifies
more
formats,
including
decimal
as
well
as
binary.
It
adds
a
128-‐bit
binary
format
to
its
basic
formats.
It
defines
extended
formats
for
all
of
its
basic
formats.
It
specifies
data
interchange
formats
(which
may
or
may
not
be
arithmetic),
including
a
16-‐bit
binary
format
and
an
unbounded
tower
of
wider
formats.
To
conform
to
the
floating-‐point
standard,
an
implementation
must
provide
at
least
one
of
the
basic
formats,
along
with
the
required
operations.
The
revised
standard
specifies
more
operations.
New
requirements
include
–
among
others
–
arithmetic
operations
that
round
their
result
to
a
narrower
format
than
the
operands
(with
just
one
rounding),
more
conversions
with
integer
types,
more
classifications
and
comparisons,
and
more
operations
for
managing
flags
and
modes.
New
recommendations
include
an
extensive
set
of
mathematical
functions
and
seven
reduction
functions
for
sums
and
scaled
products.
The
revised
standard
places
more
emphasis
on
reproducible
results,
which
is
reflected
in
its
standardization
of
more
operations.
For
the
most
part,
behaviors
are
completely
specified.
The
standard
requires
conversions
between
floating-‐point
formats
and
decimal
character
sequences
to
be
correctly
rounded
for
at
least
three
more
decimal
digits
than
is
required
to
distinguish
all
numbers
in
the
widest
supported
binary
format;
it
fully
specifies
conversions
involving
any
number
of
decimal
digits.
It
recommends
that
transcendental
functions
be
correctly
rounded.
The
revised
standard
requires
a
way
to
specify
a
constant
rounding
direction
for
a
static
portion
of
code,
with
details
left
to
programming
language
standards.
This
feature
potentially
allows
rounding
control
without
incurring
the
overhead
of
runtime
access
to
a
global
(or
thread)
rounding
mode.
Other
features
recommended
by
the
revised
standard
include
alternate
methods
for
exception
handling,
controls
for
expression
evaluation
(allowing
or
disallowing
various
optimizations),
support
for
fully
reproducible
results,
and
support
for
program
debugging.
The
revised
standard,
like
its
predecessor,
defines
its
model
of
floating-‐point
arithmetic
in
the
abstract.
It
neither
defines
the
way
in
which
operations
are
expressed
(which
might
vary
depending
on
the
computer
language
or
other
interface
being
used),
nor
does
it
define
the
concrete
representation
(specific
layout
in
storage,
or
in
a
processor's
register,
for
example)
of
data
or
context,
except
that
it
does
define
specific
encodings
that
are
to
be
used
for
the
exchange
of
floating-‐point
data
between
different
implementations
that
conform
to
the
specification.
IEC
60559
does
not
include
bindings
of
its
floating-‐point
model
for
particular
programming
languages.
However,
the
revised
standard
does
include
guidance
for
programming
language
standards,
in
recognition
of
the
fact
that
features
of
the
floating-‐point
standard,
even
if
well
supported
in
the
hardware,
are
not
available
to
users
unless
the
programming
language
provides
a
commensurate
level
of
support.
The
implementation’s
combination
of
both
hardware
and
software
determines
conformance
to
the
floating-‐point
standard.
C
support
for
IEC
60559
The
C
standard
specifies
floating-‐point
arithmetic
using
an
abstract
model.
The
representation
of
a
floating-‐point
number
is
specified
in
an
abstract
form
where
the
constituent
components
(sign,
exponent,
significand)
of
the
representation
are
defined
but
not
the
internals
of
these
components.
In
particular,
the
exponent
range,
significand
size,
and
the
base
(or
radix)
are
implementation-‐defined.
This
allows
flexibility
for
an
implementation
to
take
advantage
of
its
underlying
hardware
architecture.
Furthermore,
certain
behaviors
of
operations
are
also
implementation-‐defined,
for
example
in
the
area
of
handling
of
special
numbers
and
in
exceptions.
©
ISO/IEC
2015
–
All
rights
reserved
vii
---------------------- Page: 7 ----------------------
ISO/IEC
TS
18661-‐2:2015(E)
The
reason
for
this
approach
is
historical.
At
the
time
when
C
was
first
standardized,
before
the
floating-‐
point
standard
was
established,
there
were
various
hardware
implementations
of
floating-‐point
arithmetic
in
common
use.
Specifying
the
exact
details
of
a
representation
would
have
made
most
of
the
existing
implementations
at
the
time
not
conforming.
Beginning
with
ISO/IEC
9899:1999
(C99),
C
has
included
an
optional
second
level
of
specification
for
implementations
supporting
the
floating-‐point
standard.
C99,
in
conditionally
normative
annex
F,
introduced
nearly
complete
support
for
the
IEC
60559:1989
standard
for
binary
floating-‐point
arithmetic.
Also,
C99’s
informative
annex
G
offered
a
specification
of
complex
arithmetic
that
is
compatible
with
IEC
60559:1989.
ISO/IEC
9899:2011
(C11)
includes
refinements
to
the
C99
floating-‐point
specification,
though
it
is
still
based
on
IEC
60559:1989.
C11
upgraded
annex
G
from
“informative”
to
“conditionally
normative”.
ISO/IEC
TR
24732:2009
introduced
partial
C
support
for
the
decimal
floating-‐point
arithmetic
in
ISO/IEC/IEEE
60559:2011.
ISO/IEC
TR
24732,
for
which
technical
content
was
completed
while
IEEE
754-‐2008
was
still
in
the
later
stages
of
development,
specifies
decimal
types
based
on
ISO/IEC/IEEE
60559:2011
decimal
formats,
though
it
does
not
include
all
of
the
operations
required
by
ISO/IEC/IEEE
60559:2011.
Purpose
The
purpose
of
ISO/IEC
TS
18661
is
to
provide
a
C
language
binding
for
ISO/IEC/IEEE
60559:2011,
based
on
the
C11
standard,
that
delivers
the
goals
of
ISO/IEC/IEEE
60559
to
users
and
is
feasible
to
implement.
It
is
organized
into
five
parts.
ISO/IEC
TS
18661-1
provides
changes
to
C11
that
cover
all
the
requirements,
plus
some
basic
recommendations,
of
ISO/IEC/IEEE
60559:2011
for
binary
floating-‐point
arithmetic.
C
implementations
intending
to
support
ISO/IECIEEE
60559:2011
are
expected
to
conform
to
conditionally
normative
annex
F
as
enhanced
by
the
changes
in
ISO/IEC
TS
18661-1.
ISO/IEC
TS
18661-2
enhances
ISO/IEC
TR
24732
to
cover
all
the
requirements,
plus
some
basic
recommendations,
of
ISO/IEC/IEEE
60559:2011
for
decimal
floating-‐point
arithmetic.
C
implementations
intending
to
provide
an
extension
for
decimal
floating-‐point
arithmetic
supporting
ISO/IEC/IEEE
60559:2011
are
expected
to
conform
to
ISO/IEC
TS
18661-2.
ISO/IEC
TS
18661-3
(Interchange
and
extended
types),
ISO/IEC
TS
18661-4
(Supplementary
functions),
and
ISO/IEC
TS
18661-5
(Supplementary
attributes)
cover
recommended
features
of
ISO/IEC/IEEE
60559:2011.
C
implementations
intending
to
provide
extensions
for
these
features
are
expected
to
conform
to
the
corresponding
parts.
Additional
background
on
decimal
floating-‐point
arithmetic
Most
of
today's
general-‐purpose
computing
architectures
provide
binary
floating-‐point
arithmetic
in
hardware.
Binary
floating
point
is
an
efficient
representation
that
minimizes
memory
use,
and
is
simpler
to
implement
than
floating-‐point
arithmetic
using
other
bases.
It
has
therefore
become
the
norm
for
scientific
computations,
with
almost
all
implementations
following
the
IEEE
754
standard
for
binary
floating-‐point
arithmetic
(and
the
equivalent
international
ISO/IEC/IEEE
60559
standard).
However,
human
computation
and
communication
of
numeric
values
almost
always
uses
decimal
arithmetic
and
decimal
notations.
Laboratory
notes,
scientific
papers,
legal
documents,
business
reports,
and
financial
statements
all
record
numeric
values
in
decimal
form.
When
numeric
data
are
given
to
a
program
or
are
displayed
to
a
user,
conversion
between
binary
and
decimal
is
required.
There
are
inherent
rounding
errors
involved
in
such
conversions;
decimal
fractions
cannot,
in
general,
viii
©
ISO/IEC
2015
–
All
rights
reserved
---------------------- Page: 8 ----------------------
ISO/IEC
TS
18661-‐2:2015(E)
be
represented
exactly
by
binary
floating-‐point
values.
These
errors
often
cause
usability
and
efficiency
problems,
depending
on
the
application.
These
problems
are
minor
when
the
application
domain
accepts,
or
requires
results
to
have,
associated
error
estimates
(as
is
the
case
with
scientific
applications).
However,
in
business
and
financial
applications,
computations
are
either
required
to
be
exact
(with
no
rounding
errors)
unless
explicitly
rounded,
or
be
supported
by
detailed
analyses
that
are
auditable
to
be
correct.
Such
applications
therefore
have
to
take
special
care
in
handling
any
rounding
errors
introduced
by
the
computations.
The
most
efficient
way
to
avoid
conversion
error
is
to
use
decimal
arithmetic.
Currently,
the
IBM
z/Architecture
(and
its
predecessors
since
System/360)
is
a
widely
used
system
that
supports
built-‐in
decimal
arithmetic.
Prior
to
the
IBM
System
z10
processor,
however,
this
provided
integer
arithmetic
only,
meaning
that
every
number
and
computation
has
to
have
separate
scale
information
preserved
and
computed
in
order
to
maintain
the
required
precision
and
value
range.
Such
scaling
is
difficult
to
code
and
is
error-‐prone;
it
affects
execution
time
significantly,
and
the
resulting
program
is
...
Questions, Comments and Discussion
Ask us and Technical Secretary will try to provide an answer. You can facilitate discussion about the standard in here.