To: J3 J3/14-183r1
From: David Muxworthy and Steve Lionel
Subject: UK proposal UK-21 Numeric conversion check
Date: 2014 June 25
Status: For Consideration
Basic Functionality: Numeric conversion check
Comment: This proposal is a development of UK-07 in N1975.
Rationale: It is tedious (and mistake-prone) to check if values of one
intrinsic type can be converted to another without error.
Specification:
Add a new intrinsic function or functions which can check whether a REAL or
INTEGER value can be converted to a different type (or kind) without error,
where "without error" means no integer or real overflow will occur.
The function(s) should be able to handle rounded conversions (NINT) when
checking for conversion to INTEGER, as well as truncating ones (INT).
For conversions between different REAL kinds, an IEEE infinity is not
considered to be an error unless it is not representable in the target
kind.
The conversions to be checked shall be those of:
REAL
INT
NINT
The functions AINT and ANINT (with a KIND= argument) need not be handled by
the feature, since their use for conversions is not as frequent, and it is
not too onerous to check using AINT/ANINT without KIND=.
The requirement to be able to handle NINT directly is because this is a
common conversion.
Syntax:
Add new logical intrinsic function:
OUT_OF_RANGE(X, MOLD, [, ROUND])
The function determines whether the value of X (integer or real) is
representable as an integer or real variable with the characteristics
of MOLD.
Edits to J3/14-007r1(= N2014):
[xviii] Add to "Intrinsic procedures and modules" the sentence:
"A new intrinsic function OUT_OF_RANGE is provided to test whether
a numeric value can be safely converted to a different type or kind."
[324] Following the line NUM_IMAGES in Table 13.1 add new line(s):
OUT_OF_RANGE (X, MOLD, [, ROUND]) E Whether a value can be
converted without error.
[378:23+] Insert new intrinsic function:
<<13.7.126a OUT_OF_RANGE (X, MOLD, [, ROUND])>>
<> Whether a value can be converted without error.
<> Elemental function.
<>
X shall be of type integer or real.
MOLD shall be an integer or real scalar. If it is a variable,
it need not be defined.
ROUND (optional) shall be a logical scalar.
ROUND shall be present only if X is of type real and
MOLD is of type integer.
<> Default logical scalar.
<>
Case (i): If MOLD is of type integer, and ROUND is absent or present with
the value false, the result is true if and only the value of X is
an IEEE infinity or NaN, or if the integer with largest magnitude
that lies between zero and X inclusive is not representable by
objects with the type and kind of MOLD.
Case (ii): If MOLD is of type integer, and ROUND is present with the value
true, the result is true if and only if the value of X is an
IEEE infinity or NaN, or if the integer nearest X, or the
integer of greater magnitude if two integers are equally near to
X, is not representable by objects with the type and kind of
MOLD.
Case (iii): Otherwise, the result is true if and only if the value of X is
an IEEE infinity or NaN that is not supported by objects of the
type and kind of MOLD, or if X is a finite number and the
result of rounding the value of X (according to the IEEE
rounding mode if appropriate) to the extended model for the
kind of MOLD has magnitude larger than that of the largest
finite number with the same sign as X that is representable by
objects with the type and kind of MOLD.
<>If INT8 is the kind value for an 8-bit binary integer type,
OUT_OF_RANGE(-128.5,0_INT8) will have the value false and
OUT_OF_RANGE(-128.5,0_INT8,.TRUE.) will have the value true.